Forum: Mikrocontroller und Digitale Elektronik 7 Segment mit flimmern


von Thomas H. (harley81)


Angehängte Dateien:

Lesenswert?

Hallo an alle...

Ich habe ein Programm für einen Zähler geschrieben und versteh ein 
kleinen Problem nicht.
Hardware: vier 7-Segmentanzeigen über Multiplex an ATMega8
Sobald ich die Zeilen "add ZL,temp" und "adc ZH,r0" aktiviere flimmert 
meine Anzeige nur noch. Momentan gebe ich an der 1000er,100er und 10er 
Stelle einen Festen wert aus. Die 1er Stelle soll hochzählen. Wenn ich 
den reinen Zählwert auf temp ausgebe flimmert es nicht.
Kann mir einer sagen wie ich das flimmern entsteht und wie ich es 
umgehen kann?

Besten dank fürs grübeln...

Grüße Thomas

von Otto (Gast)


Lesenswert?

es flimmert, weil Du "temp" zur Basisadresse addierst, das immer einen 
anderen Wert haben kann.....

Otto

von Thomas H. (harley81)


Lesenswert?

Hi Otto

Kannst du mir sagen wie ich die Adressen der Codetabelle besser 
hochzählen kann?
PS: Danke für die schnelle Antwort

von Otto (Gast)


Lesenswert?

Hallo Thomas,

das Addieren von "temp" zur Basisadresse gehört nicht in die "Mainloop".

Du möchtest ja Einer, Zehner, Hunderter und Tausender darstellen.

Du kannst dafür z. B. 4 Register nehmen und den Übertrag berechnen.

Abhängig von der aktuellen Stelle lädst Du "temp" mit dem Wert.

Anschliessend kommt die Addition VOR die Port-Ausgabe an das Display.

Gruss Otto

von mikrofonfan (Gast)


Lesenswert?

das ist derb kaputt ey

von Thomas H. (harley81)


Lesenswert?

Ok leuchtet ein denke ich.
Da werd ich die sache mal probieren...
Besten Dank

von Peter D. (peda)


Lesenswert?

Versuch erstmal Deinen Code leserlicher zu machen.

Also erstmal heißt eine ASM-Source *.asm, dann kann man das auch richtig 
formatiert anzeigen.
*.txt kannste nen Brief an Deine Freundin nennen.

Und dann gib den Registern aussagekräftige Namen.
Ich hab keine Lust, mühsam überall rumzugucken, was denn nun R22 
bedeuten soll (und Du weißt es dann später ja auch nicht mehr).


Peter

von Thomas H. (harley81)


Angehängte Dateien:

Lesenswert?

Ok also auf ein neues...
Nach der Rüge hab ich mal den Code aufgeräumt
und nach Otto´s Vorschlag umstrukturiert.
Das Flimmern ist weg aber nun hab ich einen neuen
Fehler eingebaut :-) Ich war so frei die Stelle zu markieren.
Als Zwichenschritt wollte ich die 1erstelle hochzählen und feste
Werte auf den anderen Digits darstellen. Leider bekomm ich nur Nullen 
angezeigt wenn ich den markierten Teil aktiviere. Ohne den Teil hab ich 
meine Werte sauber aber eben auf allen Digits angezeigt.
Hab bestimmt einen Denkfehler drin, ist mein erstes eigenes 
Mikrokontrollerprog.

Also danke nochma für alle Antworten....
Grüße Thomas

von Otto (Gast)


Lesenswert?

Hallo Thomas,

1. weshalb lädst Du "lauf" mit 0b11111110 ?
2. NPN werden mit High angesteuert
3. die Abfrage, wenn "lauf" = 5 wird nie war
4. das "swap" von "lauf" kann entfallen
5. Frage auf >4 ab und setze "lauf" dann neu
6. das 1. Digit (EINER) beim Multiplex nur laden, wenn lauf = 0001
7. das 2. Digit (ZEHNER) wenn lauf = 0010
8. das 3. Digit (HUNDERTER) wenn lauf = 0100
9. das 4. Digit (TAUSENDER) wenn lauf = 1000

"count" würde ich durch 4 Register ersetzen:

EINER, ZEHNER, HUNDERTER und TAUSENDER

Diese werten an den Positionen 6-9 geladen, wenn das Digit an den Port 
ausgegeben wird.

Ausserdem musst Du den Übertrag bilden:

wenn EINER > 9 dann EINER = 0 und ZEHNER = ZEHNER +1

usw.

Es gibt natürlich wesentlich elegantere Methoden, die sind aber schwerer 
zu "Debuggen"

Gruss Otto

von Thomas H. (harley81)


Angehängte Dateien:

Lesenswert?

Hi Otto

Zu 1. Unter dem Punkt "Register vereinbaren" lade ich
"lauf" mit 0b11111110 um einen definierten Anfang für die 
Digitumschaltung zu haben. Mit "rol" wandert die 0 (aktiviertes Digit) 
nach links. Mit "swap" will ich verhindern das die ungenutzten Pins am 
Port-C keine Zeit kosten und die Null nur meine 4 Digits durchläuft.
zu 2. Ich schalte mit Masse also pnp. Richtig. OK erst denken, dann 
tippen...
zu 3.+ 4. "sbrs  lauf,5" bedeutet doch: skip wenn bit5 von lauf 1 ist.
und das passiert nur nach dem vierten "rol". bit5=0. Also dacht ich 
swappen damit die Null wieder bei Bit 0 ladet und die 1er Stelle aktiv 
wird.
Sollte ich schon wieder nen Denkfehlerhaben?
6. bis 9. sollte der Code machen den ich im ASM-File als Fehlerhaft 
kommentiert habe. Leider will ih einfach ni begreifen warum das so ist.

Die einzelnen Werte der Digits sollen mal mit r17 bis r20 gemacht 
werden.
Den Übertrag der Stellen möchte ich erts nach und nach einbauen um den 
Überblick bei der Fehlersuche nicht zu verlieren.

Im Anhang nochmal der ASM-Code

Guß Thomas

von Otto (Gast)


Lesenswert?

Hallo Thomas,

1. für PNP ist das OK

3. hier hast Du Recht, nur macht ROL nicht das, was Du erwartest

Lies mal die Beschreibung von "LSL" und vergleiche mit "ROL".
An dieser Stelle kommt Dein Programm durcheinande, da es mehr als eine 
"0" gibt - hier ist es auch kritisch, dass das Register "LAUF" nie nei 
initialisiert wird (ist es einmal "im Wald", ist es vorbei).

Gruss Otto

von Thomas H. (harley81)


Angehängte Dateien:

Lesenswert?

Hi Otto

Ich habe das Programm umgebaut und die Überträge eingefügt.
Alles funktioniert einwandfrei. Danke nochmal für die Hilfe.

Gruß Thomas

Für die Nachwelt: Das Programm steuert eine 4-stellige 7-Segmentanzeige. 
Bei Tastersignal wird die Anzeige um 1 erhöht. Der Schaltungsaufbau 
richtet sich nach dem ASM-Tutorial zu 7-Segmentanzeigen. Der Quellcode 
ist angehangen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.