Hallöchen alle miteinander :)
Ich habe einen ATMega8 an vier 7-Segment-Displays angeschlossen und
möchte dort nun im Loop von 9999 auf 0000 runterzählen lassen. Ansich
klappt das auch recht gut, nur aus irgendwelchen Gründen fängt er
zunächst an bei 147 runter zu zählen und springt erst dann auf die 9999.
Ich denke, ich bin gerade einfach "Code-blind" nenne ich es mal, und
finde den Fehler darin einfach nicht...
Wäre super, wenn ihr mal nen Blick rüber werfen und mir die Augen öffnen
könntet.
Vielen Dank im Voraus!
Franny
Auf den ersten Blick hätte ich ja erwartet, daß der bei 144 anfängt,
daher ist 147 wirklich seltsam.
Das alles ist aber so verquer und durcheinander, da solltest du mal
drüber shclafen, dann alles löschen, und von vorne anfangen.
Oliver
Also Softwaretechnisch baut man das erst mal so auf, dass du an einer
Stelle (von mir aus in einer Funktion, besser in einem eigenen Modul*)
eine int16 Variable auf den 7-Segmentanzeigen ausgeben kannst.
Der Rest des Programms muss sich dann nur noch darum kümmern, diese
simple Variable zu setzen.
Die Ausgabefunktion kann man dann auch erst mal wunderbar mit
verschiedenen werten testen.
Das eigentliche Countdown Programm wird danach extrem einfach.
* Erstelle eine eigene .c und .h Datei für die 7 Segmentanzeige. Mit
EINER öffentlichen Funktion (z.B. showValue(uint16_t value)) im header.
In die .c Datei machst du allen Quatsch den du für die 7Segment
benötigst. Pins, Segment-Array usw. usw.
Franny schrieb:> Hallöchen alle miteinander :)
Und selbst?
> Ich habe einen ATMega8 an vier 7-Segment-Displays angeschlossen und> möchte dort nun im Loop von 9999 auf 0000 runterzählen lassen. Ansich> klappt das auch recht gut,
Naja, dein Programm ist etwas akademisch, scheint aber zu funktionieren.
> nur aus irgendwelchen Gründen fängt er> zunächst an bei 147 runter zu zählen und springt erst dann auf die 9999.> Ich denke, ich bin gerade einfach "Code-blind" nenne ich es mal, und> finde den Fehler darin einfach nicht...
Ich hab ihn auf die Schnelle nicht gefunden, vermute aber, daß du eben
nicht die 9999 zuerst anzeigst, sondern erstmal um eins runter zählst.
Und das in einer ARG verkrampften Weise. Mein Gott! Übst du für den C
obfuscation contest?
Das geht DEUTLICH einfacher und ÜBERSICHTLICHER!
Außerdem, wenn man schon alles in die ISRs packt, braucht man auch kein
volatile, denn es gibt NUR in den ISRs den Variablenzugriff, nicht im
normalen Programm. Ich würde das aber nicht so machen, denn man braucht
dafür keine 2 Timer mit 2 ISRs. Eine reicht locker.
Stephan schrieb:> Zeile 10:> volatile uint16_t c = 0x90;
Super Danke! In all dem Wirrwarr hab ich das echt übersehen.
Oliver S. schrieb:> Das alles ist aber so verquer und durcheinander, da solltest du mal> drüber shclafen, dann alles löschen, und von vorne anfangen.
Vernünftig strukturieren steht noch auf dem Plan :)
Konnte es mir nur leider noch nicht angewöhnen von vornherein sauber zu
arbeiten...
> Franny schrieb:> Schon merkwürdig, Du lädst ja 144 rein.
Immer diese Tippfehler...Ich meinte 144 ^^'
Vielen Dank an euch!
Franny schrieb:> PORTD = damn[counts[digit - 1]];
Das muß man auch nicht bei jedem Multiplextakt immer wieder neu machen,
sondern kann es einmalig bei der Zahlenumwandlung mit machen.
Falk B. schrieb:> Das geht DEUTLICH einfacher und ÜBERSICHTLICHER!
Erstmal Danke für das ausführliche Drüberschauen!
Mir scheint aber beim Überfliegen, dass dein Programm nicht runter
zählt, sondern nur zwischen 9999 und 0000 hin und her springt. Oder
überseh ich da gerade etwas?
Peter D. schrieb:> Das muß man auch nicht bei jedem Multiplextakt immer wieder neu machen,> sondern kann es einmalig bei der Zahlenumwandlung mit machen.
Das wusste ich noch garnicht, danke :)
Franny schrieb:> Falk B. schrieb:>> Das geht DEUTLICH einfacher und ÜBERSICHTLICHER!>> Erstmal Danke für das ausführliche Drüberschauen!> Mir scheint aber beim Überfliegen, dass dein Programm nicht runter> zählt, sondern nur zwischen 9999 und 0000 hin und her springt. Oder> überseh ich da gerade etwas?
Du übersiehst was.