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
es flimmert, weil Du "temp" zur Basisadresse addierst, das immer einen anderen Wert haben kann..... Otto
Hi Otto Kannst du mir sagen wie ich die Adressen der Codetabelle besser hochzählen kann? PS: Danke für die schnelle Antwort
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
Ok leuchtet ein denke ich. Da werd ich die sache mal probieren... Besten Dank
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.