mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7 Segment mit flimmern


Autor: Thomas Herrlich (harley81)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

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

Otto

Autor: Thomas Herrlich (harley81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Otto

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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikrofonfan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist derb kaputt ey

Autor: Thomas Herrlich (harley81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok leuchtet ein denke ich.
Da werd ich die sache mal probieren...
Besten Dank

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Herrlich (harley81)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Herrlich (harley81)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Herrlich (harley81)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.