7 Segment mit flimmern

#1025621
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
Angehängte Dateien:
Gast #1025883
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
#1026329
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
#1026968
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
Angehängte Dateien:
Gast #1027009
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
#1027049
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
Angehängte Dateien:
Gast #1027060
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
#1033437
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...
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren