Bascom hilfe beim code verbessern

dimmu

Neues Mitglied
11. Juli 2011
54
0
0
Schömberg bei Neuenbürg
Sprachen
  1. BascomAVR
hallo,

ich bin dabei mir eine Uhr zu programmieren. genauer gesagt eine wortuhr.

drauf steht jede Stunde, 5min 10 min Viertel halb dreiviertel vor und nach.
das Bild soll das mal verdeutlichen.



ich weiß dass es schon einen Bausatz zu kaufen gibt, das ist mir aber zu langweilig, ich will ja auch noch was dabei lernen.

ich habe jetzt schon etwas Code geschrieben und das funktioniert so weit auch schon, aber es gibt ein paar kleinere Probleme.
das größte Problem ist das mir die 4kb quellcode ausgehen die die Demo von bascom zulässt.
also wäre mal das erstes Ziel den Code etwas abzuspecken, ich weiß aber nicht so recht wie, ich bin Anfänger.
bitte macht mir Vorschläge, aber keine fertigen neuen Codes, ich will mir die Lösung selber erarbeiten.

das zweite Problem das ich habe ist das die Zeitausgabe in Kombination mit dcf spinnt.
zum Verständnis.
die Zeitausgabe erfolgt über 3 kaskadierte shiftregister. wenn ich als solftclock konfiguriere funktioniert alles wunderbar.
wenn ich allerdings die softclock rausnehme und dafür den config dcf77 geht das Problem los.
über den Urat lasse ich mir die Zeit anzeigen und sehe so wann synchronisiert ist. die Zeitausgabe an meinen shiftregistern stimmt aber nie.
ich denke das Problem ist das der Interrupt den die dcf auslöst das rausschieben der Zeitausgabe behindert und es so zu falschen anzeigen kommt. ich hoffe ihr versteht was ich meine.
wie kann ich das Problem lösen. gibt es eine Möglichkeit den Interrupt auszuschalten so lange geschoben wird???

das dritte Problem ist meine automatische dimmung.
da zu manchen Uhrzeiten bis zu 30 Leds leuchten kann das teil nachts echt sehr hell werden. deshalb will ich mit einem ldr die Helligkeit fühlen. das muss ich mit getadc machen. soviel weiß ich schon
auch wie die pwm funktioniert weiß ich schon.
ich hatte also vor je dunkler es wird desto länger die ausschaltzeit der pwm.
wenn ich die softclock programmiere geht das auch mit timer2 als pwm. bei config dcf77 geht das allerdings nicht. liegt das auch wieder an den Interrupts???

ich hänge jetzt mal meinen Code mit an, ich hoffe es ist soweit alles zu verstehen.
ich denke es gibt viele Dinge die man besser machen kann, deshalb bitte ich um Hilfe.
ich hoffe meine Probleme sind zu verstehen, ich bin nicht besonders gut im erklären was ich will.

danke schon mal für eure Hilfe.
 

Anhänge

  • uhr 20min mit softclock2.bas
    29 KB · Aufrufe: 17
Hallo dimmu ,

ich weiß dass es schon einen Bausatz zu kaufen gibt, das ist mir aber zu langweilig, ich will ja auch noch was dabei lernen.
Ein guter Ansatz :cool:

ich habe jetzt schon etwas Code geschrieben und das funktioniert so weit auch schon, aber es gibt ein paar kleinere Probleme.
das größte Problem ist das mir die 4kb quellcode ausgehen die die Demo von bascom zulässt.
also wäre mal das erstes Ziel den Code etwas abzuspecken, ich weiß aber nicht so recht wie, ich bin Anfänger.
bitte macht mir Vorschläge, aber keine fertigen neuen Codes, ich will mir die Lösung selber erarbeiten.
Das wird wohl schwierig werden. Ich hab letztens bei meinem Mega128 den ich mit allen möglichen Schnittstellen versehen habe dann doch erkennen müssen das es mit 4kByte nicht mehr weiter geht. Und so teuer (wenn man mal auf die Preise von anderen Compiler sieht) ist Bascom auch nicht unbedingt. Wenn man alles selber programmiert und keine Bibliotheken verwendet und die benötigten Sachen teilweise in Assembler umsetzt dann kann das schon in 4kByte passen. Aber das wird schwierig.

das zweite Problem das ich habe ist das die Zeitausgabe in Kombination mit dcf spinnt.
zum Verständnis.
die Zeitausgabe erfolgt über 3 kaskadierte shiftregister. wenn ich als solftclock konfiguriere funktioniert alles wunderbar.
wenn ich allerdings die softclock rausnehme und dafür den config dcf77 geht das Problem los.
über den UART lasse ich mir die Zeit anzeigen und sehe so wann synchronisiert ist. die Zeitausgabe an meinen shiftregistern stimmt aber nie.
Da haben wir schon einen Kandidaten für Codegrößen-Probleme. Brauchst du den UART später noch ? Wenn nein dann schmeiß ihn raus :p :rolleyes: Das Problem hatte ich auch. I2C, LCD, UART und noch ein wenig Tastengedöns und schon waren die 4kByte voll. Wenn du dir Streß ersparen willst dann hol dir die Vollversion. Für ein wenig Kleinkram reicht die Demo aber für etwas mehr kommtman sehr schnell an die Grenzen.

ich denke das Problem ist das der Interrupt den die dcf auslöst das rausschieben der Zeitausgabe behindert und es so zu falschen anzeigen kommt. ich hoffe ihr versteht was ich meine.
wie kann ich das Problem lösen. gibt es eine Möglichkeit den Interrupt auszuschalten so lange geschoben wird???

das dritte Problem ist meine automatische dimmung.
da zu manchen Uhrzeiten bis zu 30 Leds leuchten kann das teil nachts echt sehr hell werden. deshalb will ich mit einem ldr die Helligkeit fühlen. das muss ich mit getadc machen. soviel weiß ich schon
auch wie die pwm funktioniert weiß ich schon.
ich hatte also vor je dunkler es wird desto länger die ausschaltzeit der pwm.
wenn ich die softclock programmiere geht das auch mit timer2 als pwm. bei config dcf77 geht das allerdings nicht. liegt das auch wieder an den Interrupts???
ich hab mir wegen der späten Tageszeit den Code nicht angesehen. Ich geb dir aber einfach mal Tips ...

Fürs rausschieben ...
... Nutz die Hardware-SPI-Schnittstelle. Da brauchst du nur nen Byte in das Datenregister schreiben und alles andere tut dann von ganz alleine und unabhängig von allen anderen Interrupts. Was die Hardware für sich macht kann nicht durch einen Interrupt unterbrochen werden.

Für die PWM ...
... Mach es über nen freien Timer auch in Hardware. Dann brauchst du nur den Wert in ein Register schreiben und alles andere macht der Atmel bis zum SanktNimmerleinstag (wenn du es nicht änderst) selber automatisch.

Wie du siehst ... Wenn man die Hardwareunterstützung rigoros einsetzt dann hat man weniger Probleme. Versuch möglichst auf Softwarelösungen zu verzichten. Plane die Pin-Belegung am Atmel so das du die Hardwarefunktionen benutzen kannst. Es spart Codegröße und entlastet die Software von unnötigen Aufgaben.

Gruß
Dino
 
Hallo Dimmu!

Ich gebe zu, dass ich mich auf Grund der späten Stunde jetzt nicht direkt mit deinem Problem befasst habe......

Ich wollte dir auch nur mal schnell den Tipp geben, dass HBA so eine Wordclock schon mal gebaut hat und HIER auch vorgestellt hat. :wink:

Vielleicht schaust du da mal rein und es bringt dich auf "neue" Ideen.
Könnte mir auch vorstellen, dass HBA (oder Sebastian) dir auch gezielte Fragen dazu beantworten würde.


Viele Grüße und Erfolg,
Cassio
 
Hi,

Ich wollte dir auch nur mal schnell den Tipp geben, dass HBA so eine Wordclock schon mal gebaut hat und HIER auch vorgestellt hat. :wink:
wegen der Codegröße hab ich das Bascom-Programm von HBA mal grad durch den Compiler laufen lassen.
Er benutzt einen Mega16 mit 16kByte Flash. Das Flash ist zu 45% gefüllt. Das macht wenn ich es richtig interpretiert habe 7422 Byte. Das ist dann wohl ganz weit über der 4kByte Grenze. Soviel dazu ... :(

Selbst mit sehr viel Optimierung wirst du das nicht in die 4kByte quetschen können.
Tut mir leid.

Bei den restlichen Themen werden wir wohl etwas besser helfen können ;)

Gruß
Dino
 
@Dino,
ja das mit der Vollversion habe ich mir schon überlegt und ich werde da wohl auch über lang oder kurz investieren, aber zurzeit ist nichts dafür übrig…...

Den Urat brauche ich später eigentlich nicht. Ich habe nur keine Idee wie ich mir sonst anzeigen kann das die dcf zeit korrekt empfangen wurde und die softclock synchronisiert ist.
Aber es stimmt schon, wenn ich den Urat weglasse ist der Code lange nicht so groß.

Ok, also ich werde dann mal das rausschieben auf Hardware umbauen. Der Befehl bleibt ja Ansicht der gleiche nur das es jetzt spiout heißt oder. Und dann noch die richtigen Pins um löten.
Ich werds mir merken die Sachen über die Hardware zu machen.

@Cassio,
Vielen Dank für den Hinweis dass so ein Projekt schon mal veröffentlicht wurde. ich denke ich kann mir bei HBA schon das eine oder andere abschauen oder Anregungen holen.

@beide,
danke für eure raschen antworten, und das um diese Zeit niemand mehr Lust hat einen quellcode zu studieren kann ich voll und ganz verstehen.

Grüße Dimmu
 
Hallo zusammen,
ich könnte mir schon vorstellen, dass man dies mit 4K hinbekommt. Ich habe noch eine andere Version als die hier vorgestellte, da habe ich die etwas gewöhnungsbedürftige Änderung der Werte über die Riesenziffern nicht mit drin. Ebenso keine Fernbedienung. Die ist tatsächlich nur 4K.
Aber ich denke es ist besser, wenn du deinen Code nimmt und den verbesserst.

Da wären einmal die vielen Abfragen
If _min = 0 Then 'wenn variable minute = 0
Gosub Set_zeit25 'springe zu Set Zeit20 (es ist 10 vor halb)
Elseif _min = 1 Then 'wenn variable minute = 1
Gosub Set_zeit26 'springe zu set zeit21 (es ist 9 vor halb)
Elseif _min = 2 Then 'wenn variable minute = 2
Gosub Set_zeit27 'springe zu set zeit22 (es ist 8 vor halb)
Elseif _min = 3 Then 'wen variable minute = 3
Gosub Set_zeit28 'springe zu Set Zeit23 (es ist 7 vor halb)
Elseif _min = 4 Then 'wen variable minute = 4
Gosub Set_zeit29 'springe zu Set Zeit24 (es ist 6 vor halb)
Elseif _min = 5 Then 'wen variable minute = 5
Gosub Set_zeit30 'springe zu Set Zeit25 (es ist 5 vor halb)
Elseif _min = 6 Then 'wen variable minute = 6
Gosub Set_zeit31 'springe zu Set Zeit26 (es ist 4 vor halb)
.....

Das musst du versuchen, die einfacher darzustellen.
Ich glaube, dass du hier nur die 4 Minutenpunkte setzen willst.
Das geht z.B. so
Rest = _Min Mod 5
Select Case Rest
Case 0:
Min4 = 0
'hier muss noch die Variable Zeitausgabe berechnet werden
Case 1:
Min1 = 1
Case 2:
Min1 = 0
Min2 = 1
Case 3:
Min2 = 0
Min3 = 1
Case 4:
Min3 = 0
Min4 = 1
End Select
Damit sind die ganzen Subs überflüssig und du wirst den Code auf weniger als die Hälfte runterbekommen.

Grüße

Sebastian
 
Hallo HinterBlauenAugen,
danke für deinen Verbesserungsvorschlag.
Ich denke ich muss zuerst noch etwas zu den vielen abfragen sagen, weil es glaube ich nicht ganz klar ist was ich da mache.
Hinter den gosub zu dem einzelen set_zeit.. versteckt sich nicht nur die 4 min außen rum sondern jede Änderung.
Also genauer gesagt. Ich schiebe ja die Anzeige in meine shiftregister. Dafür habe ich das integer Zeitausgabe angelegt. In dem einzelnen set_zeit.. steht dann eben alles was sich in der Minute im Vergleich zur vorherigen verändert hat. Das sind eben manchmal mehr und manchmal weniger. Die 4 min außen rum verändern sich ja logischerweise jede Minute. So Sachen wie die Wörter vor, nach, halb, viertel, dreiviertel und so weiter verändern sich ja nicht jede Minute.
Also kurzgesagt versteckt sich hinter jedem set_zeit eben die Ausgabe die zur aktuellen Minute sein muss.
Grundsätzlich wird da wesentlich mehr gemacht als die 4 min gesteuert.

Ich weiß jetzt nicht so richtig ob mir dein Vorschlag weiterhilft. Aber ich werde mal versuchen ob ich was damit anfangen kann.
Ich melde mich dann wieder

Danke

Grüße Dimmu
 
So Sachen wie die Wörter vor, nach, halb, viertel, dreiviertel und so weiter verändern sich ja nicht jede Minute.
Also kurzgesagt versteckt sich hinter jedem set_zeit eben die Ausgabe die zur aktuellen Minute sein muss.
Grundsätzlich wird da wesentlich mehr gemacht als die 4 min gesteuert.
Weißt du, wie Arrays funktionieren?
Versuche mal das Setzen von 'Zeitausgabe' in zwei Schritten zu machen. Einmal die Wörter für die 5er Minuten und einmal die Wörter für die Stunden. Und lege die Werte für Zeitausgabe in dem Array ab, sodass du nachher nur noch sowas hast:
Zeitausgabe = Stunden_array(_hour)
Shift Zeitausgabe, left, 8
Zeitausgabe = Zeitausgabe + minuten_Array(_min)

Grüße

Sebastian
 
Hallo Sebastian,

je mehr Tipps ich bekomme desto mehr erkenne ich dass ich eigentlich noch gar nichts kann.
Von einem Array habe ich noch nichts gehört. Habe eben mal in der bascom Hilfe gesucht aber da werden mir ganz schön viele Sachen vorgeschlagen und ich weiß nicht so richtig welcher Punkt der richtige ist.

So interpretiere Ichs bis jetzt, verbesser mich bitte wenn ich falsch liege.

Zeitausgabe ist weiterhin meine variable die rausgeschoben wird.
Stunden_array(_hour) wird irgendwie durch die softclock geladen
minuten_array(_min) wird ebenfalls durch die softclock geladen

„Zeitausgabe = Stunden_array(_hour)“
und mit diesem Befehl wird das stunden_array in meine Zeitausgabe variable geschrieben

„ Shift Zeitausgabe, left, 8“
Hier der Inhalt der variable weiter nach links geschoben um am Anfang der variable patz für die Minuten zu machen.

„Zeitausgabe = Zeitausgabe + minuten_Array(_min)“
Und hier dann den Rest der Zeitausgabe variable mit den Minuten füllen.
Wie lege ich jetzt so ein Array an?
Wo kann ich den ganz grundlegende Informationen über Arrays herbekommen, vielleicht auf Deutsch.

Danke für deine rasche Antwort

Dimmu
 
Vielleicht findest du hier in der Suche eine Beschreibung.
In der Bascom Hilfe steht es auch, allerdings in Englisch.
Grundidee des Arrays ist, dass du nicht eine Variable von einem Typ mit einem Namen anlegst wie hier

Dim my_byte as Byte 'ein Byte im Speicher
My_byte = 5

sondern mehrere, die du dann über einen Index ansprechen kannst

Dim my_array(10) As Byte 'zehn Byte im Speicher
My_array(3) = 5

Die "3" ist der Index. Der Index geht in diesem Fall von 0-9 oder von 1-10. Das hängt davon ab, ob du
Config Base = 0 oder =1 setzt.
Du hast in deinem Programm wirklich eine "Wort"-Uhr programmiert, du kannst ganze Wörter auf einmal ansteuern.
In meinem Code ist dagegen eine Matrix implementiert, die jeden einzelnen Buchstaben ansteuert. Die Ausgabe beider Programme ist als vollkommen verschieden.
Trotzdem kannst du die Ausgabe auf ähnliche Art berechnen, wie ich das mache.
Deine Variable Zeitausgabe steuert die 20 Wörter so an:

'Zeitausgabe.0 5minuten
'Zeitausgabe.1 10minuten
'Zeitausgabe.2 20minuten du zeigst wohl ZWANZIG VOR SIEBEN, bei mir auch
'Zeitausgabe.3 Drei(Viertel) du zeigst wohl DREIVIERTEL ACHT an, bei mir VIERTEL VOR ACHT
'Zeitausgabe.4 Viertel
'Zeitausgabe.5 Vor
'Zeitausgabe.6 Nach
'Zeitausgabe.7 Halb
'Zeitausgabe.8 Eins
'Zeitausgabe.9 Zwei
'Zeitausgabe.10 Drei
'Zeitausgabe.11 Vier
'Zeitausgabe.12 Fünf
'Zeitausgabe.13 Sechs
'Zeitausgabe.14 Sieben
'Zeitausgabe.15 Acht
'Zeitausgabe.16 Neun
'Zeitausgabe.17 Zehn
'Zeitausgabe.18 Elf
'Zeitausgabe.19 Zwölf
'Zeitausgabe.20 s von EINS
'Zeitausgabe.21 f ??? was ist das
'Zeitausgabe.22 n ??? was ist das

Du würdest das Array für die Minuten nun so machen

Dim Min_array(12) As Byte
Dim Min_index As Byte

Min_array(0) = 0 'hierzu musst du Config Base = 0 angeben
Min_array(1) = &B01000001 '5 nach
Min_array(2) = &B01000010 '10 nach
Min_array(3) = &B01010000 'viertel nach
Min_array(4) = &B01001000 'zwanzig nach
Min_array(5) = &B10100001 '5 vor Halb
Min_array(6) = &B10000000 'halb
Min_array(7) = &B11000001 '5 nach Halb
Min_array(8) = &B00101000 'zwanzig vor
Min_array(9) = &B00011000 'dreiviertel
Min_array(10) = &B00100010 'zehn vor
Min_array(11) = &B00100001 'fünf vor

Der Index berechnet sich nun durch

Min_index = _min / 5

Zeitausgabe = Min_array(min_index)

Damit sind deine Minutenwörter gesetzt.
Versuche das Gleiche nun mit den Stunden zu machen und auch in die Variable Zeitausgabe an die richtige Stelle zu setzen. Dann bist du fertig.
 
So langsam kommt etwas Licht ins Dunkel,

ich habe die tatsächliche wortuhr so gebaut weil ich die Anzeige von einem früheren versuch schon hatte. Da habe ich es komplett mit logikgattern aufgebaut, aber die Schaltung ist viel zu groß geworden, deshalb auch der einstig in de Mikrocontrollerwelt

also zuerst kläre ich mal die Zeitausgabe voll auf.


'Zeitausgabe.0 5minuten
'Zeitausgabe.1 10minuten
'Zeitausgabe.2 20minuten du zeigst wohl ZWANZIG VOR SIEBEN, bei mir auch
'Zeitausgabe.3 Drei(Viertel) du zeigst wohl DREIVIERTEL ACHT an, bei mir VIERTEL VOR ACHT
'Zeitausgabe.4 Viertel
'Zeitausgabe.5 Vor
'Zeitausgabe.6 Nach
'Zeitausgabe.7 Halb
'Zeitausgabe.8 Eins
'Zeitausgabe.9 Zwei
'Zeitausgabe.10 Drei
'Zeitausgabe.11 Vier
'Zeitausgabe.12 Fünf
'Zeitausgabe.13 Sechs
'Zeitausgabe.14 Sieben
'Zeitausgabe.15 Acht
'Zeitausgabe.16 Neun
'Zeitausgabe.17 Zehn
'Zeitausgabe.18 Elf
'Zeitausgabe.19 Zwölf
'Zeitausgabe.20 s von EINS
'Zeitausgabe.21 f ??? was ist das
'Zeitausgabe.22 n ??? was ist das

Zeitausgabe.2 20 Minuten: ich schreibe 20 nach sieben
Zeitausgabe.20 s von Eins, ich will das das S bei der vollen Stunde nicht leuchtet, also es soll es ist Ein Uhr heißen
Zeitausgabe.21 f, El f ünf, Elf und Fünf teilen sich das f, es überschneidet sich
Zeitausgabe.22 n Zeh n eun, Zehn und Neun teilen sich das n, es überschneidet sich

Ok, ich werde es dann mal mit den stunden versuchen und stelle es dann wieder rein.

Eine weitere Frage habe ich aber noch. Für das f, und das n muss ich jetzt noch ein Lösung finden oder?
Ich kann das ganze grade nicht an der Hardware testen weil mein Netzteil den Geist aufgegeben hat. Vielleicht würde ich dann das ganze etwas besser verstehen.
 
Ist das jetzt so richtig?

'Zeitausgabe.05minuten
'Zeitausgabe.1 10minuten
'Zeitausgabe.2 20minuten du zeigst wohl ZWANZIG VOR SIEBEN, bei mir auch
'Zeitausgabe.3 Drei(Viertel) du zeigst wohl DREIVIERTEL ACHT an, bei mir VIERTEL VOR ACHT
'Zeitausgabe.4 Viertel
'Zeitausgabe.5 Vor
'Zeitausgabe.6 Nach
'Zeitausgabe.7 Halb
'Zeitausgabe.8 Eins
'Zeitausgabe.9 Zwei
'Zeitausgabe.10 Drei
'Zeitausgabe.11 Vier
'Zeitausgabe.12 Fünf
'Zeitausgabe.13 Sechs
'Zeitausgabe.14 Sieben
'Zeitausgabe.15 Acht
'Zeitausgabe.16 Neun
'Zeitausgabe.17 Zehn
'Zeitausgabe.18 Elf
'Zeitausgabe.19 Zwölf
'Zeitausgabe.20 s von EINS
'Zeitausgabe.21 f ??? was ist das
'Zeitausgabe.22 n ??? was ist das

Du würdest das Array für die Minuten nun so machen

Dim Min_array(12) As Byte
Dim Min_index As Byte ' Müsste das nicht ein long sein?


Min_array(0) = 0 'hierzu musst du Config Base = 0 angeben
Min_array(1) = &B01000001 '5 nach
Min_array(2) = &B01000010 '10 nach
Min_array(3) = &B01010000 'viertel nach
Min_array(4) = &B01001000 'zwanzig nach
Min_array(5) = &B10100001 '5 vor Halb
Min_array(6) = &B10000000 'halb
Min_array(7) = &B11000001 '5 nach Halb
Min_array(8) = &B00101000 'zwanzig vor
Min_array(9) = &B00011000 'dreiviertel
Min_array(10) = &B00100010 'zehn vor
Min_array(11) = &B00100001 'fünf vor

Der Index berechnet sich nun durch

Min_index = _min / 5 ' wird hier durch 5 geteilt weil nur alle 5 min eine änderung vorgenommen wird?

Zeitausgabe = Min_array(min_index)



Dim Stunden_array(12) As Long 'Stimmt das so
Dim Stunden_indey As Long ' Index geht bis 12 da reicht ein Byte Nicht mehr oder?


Stunden_array(0) = 0
Stunden_array(1) = &B000000000001 'Ein Uhr
Stunden_array(2) = &B000000000010 'Zwei Uhr
Stunden_array(3) = &B000000000100 'Drei Uhr
Stunden_array(4) = &B000000001000 'Vier Uhr
Stunden_array(5) = &B000000010000 'Fünf Uhr
Stunden_array(6) = &B000000100000 'Sechs Uhr
Stunden_array(7) = &B000001000000 'Sieben Uhr
Stunden_array(8) = &B000010000000 'Acht Uhr
Stunden_array(9) = &B0000100000000 'Neun Uhr
Stunden_array(10) = &B001000000000 'Zehn Uhr
Stunden_array(11) = &B010000000000 'Elf Uhr
Stunden_array(12) = &B100000000000 'Zwölf Uhr

Der Index Wird Nicht Berechnet Weil Er Ja Sowiso Jede Stunde Eine Änderung Vorgenommen Wird.

Shift Zeitausgabe , Left , 8
Zeitausgabe = Zeitausgabe + Stunden_array(_hour)

Mit der 'Shiftgeschichte bin ich mir noch nicht so ganz sicher oder die positin stimmt.

Beim programmieren ist mir jetzt schon eine mögliche lösung für das f und n problem eingefallen.

Eigentlich muss ich ja nur bei den entsprechenden stunden arrays an der richtigen stelle eine 1 schreiben statt einer 0

Also zb so:
Stunden_array(0) = 0
Stunden_array(1) = &B00000000000001 'Ein Uhr
Stunden_array(2) = &B00000000000010 'Zwei Uhr
Stunden_array(3) = &B00000000000100 'Drei Uhr
Stunden_array(4) = &B00000000001000 'Vier Uhr
Stunden_array(5) = &B01000000010000 'Fünf Uhr
Stunden_array(6) = &B00000000100000 'Sechs Uhr
Stunden_array(7) = &B00000001000000 'Sieben Uhr
Stunden_array(8) = &B00000010000000 'Acht Uhr
Stunden_array(9) = &B10000100000000 'Neun Uhr
Stunden_array(10) = &B10001000000000 'Zehn Uhr
Stunden_array(11) = &B01010000000000 'Elf Uhr
Stunden_array(12) = &B00100000000000 'Zwölf Uhr
 
Das mit den Byte bei den Minuten ist schon ok, solange du nur in eine gleich großen oder größeren Typ schreibst.

Ich denke aber, dass du die Zuweisung der Stunden zuerst machen musst, dann shiftest und schließlich die Minuten addieren musst. Die Minuten stehen doch auf den unteren 8 bit.
Ansonsten ist das genau so umgesetzt, wie ich es in meinem Code gemacht habe.
Du wirst sehen, dass du nun locker unter der 4K Grenze bleiben kannst.

Grüße

Sebastian
 
Hi Dimmu,

Den Urat brauche ich später eigentlich nicht.
kleine Info ... das Ding nenn sich UART nicht URAT
Das kommt von ...
Universal Asynchronous Receiver Transmitter = UART :)

Damit bleiben dann in anderen Foren zukünftige blöde Sprüche aus ;)

Gruß
Dino
 
Guten morgen,

@Sebastian,

Dim Min_array(12) As Byte
Dim Min_index As Byte ' Müsste das nicht ein long sein?

Dim min_index as byte. Wenn ich alles richtig verstanden habe muss ich diese variable anlegen weil ich ja nicht direkt die _min variable als Index benutzen kann. Was mich jetzt verwirrt ist das die min_index von 0-12 gehen, das ist doch mehr wie ein Byte oder. Deshalb dachte ich hier an ein Long.
Das Array selber hat nur ein Byte, das sehe ich genauso.


Dim Stunden_array(12) As Long 'Stimmt das so
Dim Stunden_indey As Long ' Index geht bis 12 da reicht ein Byte Nicht mehr oder?


Beim Betrachten der Stunden habe ich mir nochmal Gedanken gemacht.
Da ich ja als Index direkt die _hour variable benutze muss ich ja eigentlich keine Index variable anlegen oder?

Mit dem shiften hast du recht. Ich vergesse immer dass bei den variablen ja eigentlich von rechts gelesen werden muss. Da muss ich mich echt mal dran gewöhnen.
Ich versuche jetzt mal das Ganze in bascom zu schreiben und stelle es dann nochmal rein.

@Dino,
da bin ich wohl über die Rechtschreibkontrolle von Word gestolpert. Danke für den Hinweis, kommt nicht mehr vor.

Viele Grüße
Dimmu
 
Was mich jetzt verwirrt ist das die min_index von 0-12 gehen, das ist doch mehr wie ein Byte oder. Deshalb dachte ich hier an ein Long.
Du musst doch nur die Werte von 0-11 (12 wäre ja 60, was nicht vorkommen sollte) als Index verwenden. In ein Byte passen die Werte von 0-255. Du verwechseltst 12 bit und 12 Werte.

Da ich ja als Index direkt die _hour variable benutze muss ich ja eigentlich keine Index variable anlegen oder?
Genau. Es wäre sogar ausreichen, wenn du das Stunden_array nur als Word deklarieren würdest, da ja nur 12 Bit verwendet werden. Die bekommst du in ein Word. Beim Zuweisen an Zeitausgabe wird dann daraus ein Long Wert.
Wenn du also mal knapp mit dem SRAM werden solltest, kannst du da noch dran.

Grüße

Sebastian
 
ok,
danke für die Geduld, du hast recht ich verwechsle die Bit und die werte.

Ich habe jetzt mal ein bespiel gemacht.
Es lässt sich kompilieren, also nehme ich mal an das keine groben Fehler drin sind, aber ich kann es wie gesagt nicht ausprobieren weil mein Netzteil hinüber ist und das neue erst nächste Woche kommt.

Aber so wie ich es sehe muss ich mir jetzt nur noch Gedanken um
das Wort Uhr,
das s von eins
und die 4 Minuten machen. Wobei du mir ja schon am Anfang einen Tipp für die 4 Minuten gegeben hast.

Danke
 

Anhänge

  • uhr array1.bas
    5,5 KB · Aufrufe: 17
Aber so wie ich es sehe muss ich mir jetzt nur noch Gedanken um
das Wort Uhr,
das s von eins
Hast du "ES IST" immer an? Bei mir habe ich das nur bei vollen und halben Stunden (ES IST HALB EINS, ES IST EIN UHR),
damit die LEDs nicht immer laufen.
Hast du "UHR" nur zu vollen Stunden an?
Noch eine Feinheit: Die Abweichung von der tatsächlichen Zeit zur der in Worten angezeigten ist maximal 5 Minuten, weil deine Minuten LEDs +4 (+59s) anzeigen. Da man eh nicht so genau auf diese LEDs schaut, habe ich es so gemacht, dass tatsächlich nicht erst um 14.00 Uhr auf "ZWEI UHR" geht und dann so bis 14.05 Uhr stehen bleibt, sondern schon um 13.58 wechselt. Kannst du dir ja mal überlegen, ob dir das auch besser gefällt.
Bei mir stehen dann die oberen LEDs für -2 und -1 und die unteren für +1 und +2. Ist aber Geschmacksache.

Grüße

Sebastian

Edit: Noch etwas zum Code.
Du wirst Zeitausgabe weiterhin auf Long lassen müssen, da du ja mehr als 16Bit hast.
Das hier geht nicht:
Stunden_array(1) = &B10000000 , 00000001 'Ein Uhr
Es kompiliert zwar, wird aber nicht richtig gesetzt. Mach es so:
Stunden_array(1) = &B10000000_00000001 'Ein Uhr

Das Setzen des Stunden und Minuten Arrays machst du besser vor die Hauptschleife (Do---Loop), ebenso das Config Base. Die Sachen sind ja fix.
Bei dem Shiftout könntest du überlegen, dass nur bei Sekunde 0 zu machen, weil sich nur dann etwas ändert. Hängt aber auch von deiner Art des Uhrzeitstellen ab.
 
Hallo Sebastian,
um das es ist habe ich mir noch keine genauer Gedanken gemacht. Bis jetzt hatte ich vor den Wörtern einen eigenen Ausgang vom atmega zu geben.
Der Hintergrund. Ich wollte dcf77 benutzen um die Uhr nicht selber stellen zu müssen. Ich wollte dann es ist blinken lassen solange die Uhr synchronisiert wird. Die restliche Zeit sollte es eigentlich immer an sein.
Wenn ich mir jetzt aber so deinen Vorschlag anhöre gefällt mir das eigentlich ganz gut. Mal sehen wie ich das mache. Zur Anzeige der dcf Sache kann ich ja grundsätzlich auch einen Buchstaben nehmen der gar kein Wort anzeigt.
Es ist müsste ich dann über die Minuten steuern, also immer bei 28-32 und bei 58-2. Das geht ja wieder mit if und else, aber du hast mir ja schon gezeigt dass es da elegantere Lösungen gibt. Mit dem minutenarray geht es ja aber nicht, das stelle sich ja nur alle 5 min um.
Ist es jetzt sinnvoll ein eigenes Array anzulegen oder über den Case befehl.
Auch könnte ich mir vorstellen das hier for- next schleife in Frage kommen könnte, mit der habe ich aber noch gar keine Erfahrungen.
Auch die Sache mit den 2 min versetz finde ich nicht schlecht. Mir ist das auch schon aufgefallen das man auf die 4 min eigentlich gar nicht so schaut.
Wie hast du das gelöst.
Du hast ja schon als Beispiel das mit Case genannt.
Damit müsste sich ja das Problem lösen lassen. Einfach einen weiteren Case anlegen in dem dann alle 4 Leds an sind.
Da muss ich mir mal noch genauere Gedanken dazu machen.
Das s von der Eins bereitet mir auch noch Kopfzerbrechen. Hier spielen ja die stunden und die Minuten eine Rolle.
Ist das auch wieder ein Fall für Case?
Mit dem shiften alle 5 min das wäre eine tolle Sache, aber dann muss ich wohl auch für das S einen eigenen Ausgang vom atmega benutzen, oder kann ich auch irgendwie einstellen dass immer nur nach einer Änderung in der Zeitausgabe variable geschoben wird.
Das im Code muss ich dann verbessern. Hatte das mal irgendwo gelesen dass sich so ein word auch in 2 Byte schreiben lässt. Ich finds irgendwie übersichtlicher. Aber wenn’s nur ein falsches Zeichen ist, ist das ja nicht ganz so tragisch.

Danke für deine Geduld mit mir
Grüße Timo
 
Es ist müsste ich dann über die Minuten steuern, also immer bei 28-32 und bei 58-2. Das geht ja wieder mit if und else, aber du hast mir ja schon gezeigt dass es da elegantere Lösungen gibt. Mit dem minutenarray geht es ja aber nicht, das stelle sich ja nur alle 5 min um.
Angenommen du setzt das Wort "ES IST" auf Zeitausgabe.23
Dann machst du dieses einfach an, wenn Min_index=0 oder Min_index=6 ist.

Auch die Sache mit den 2 min versetz finde ich nicht schlecht. Mir ist das auch schon aufgefallen das man auf die 4 min eigentlich gar nicht so schaut.
Wie hast du das gelöst.
Ganz einfach: Ich habe zur aktuellen Zeit 2 Minuten dazu addiert und mit diesem Wert den Min_index berechnet.

Das s von der Eins bereitet mir auch noch Kopfzerbrechen. Hier spielen ja die stunden und die Minuten eine Rolle.
Ist das auch wieder ein Fall für Case?
Kannst du auch über _hour = 1 und Min_index = 0 abfragen.

Aber schau jetzt erst einmal, dass du dein netzteil bekommst, damit du auch mal etwas sehen kannst. Mit dem Erfolg macht es dann auch viel mehr Spaß.
Außerdem musst du ja noch die DCF Sache und die Helligkeitsregelung reinnehmen.

Es bleibt spannend.

Grüße

Sebastian
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)