Forum: Mikrocontroller und Digitale Elektronik 7-Segment-Anzeige - Fehler im AVR-Tutorial?


von Fabian (Gast)


Lesenswert?

Hallo!
Habe gerade die gemultiplexte 7-Segment-Anzeige mit vier Ziffern laut 
Tutorial 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige 
realisiert.
Mich hat schon gewundert, daß im Quelltext "call" geschrieben steht, 
obwohl der Compiler nur "rcall" kennt. Kann dazu jemand etwas sagen?
Weiterhin besteht folgendes Problem:
Es werden keine Zahlen hochgezählt, sondern alle Ziffern flackern nur 
mit ständig wechselnden Werten (kann man nicht ablesen, geht zu 
schnell). Manchmal ist "ansatzweise" ein Hochzählen zu beobachten. Das 
Programm habe ich 1:1 übernommen (halt call mit rcall ersetzt), 
Controller ist ein Mega8 auf internen 1 MHz.
Bin ich hier zu irgendwas zu blöd oder stimmt etwas in der 
Programmierung nicht? Wie schnell müßte - wenn es denn funktioniert - 
der µC hochzählen?
Danke für die Hilfe!

von Michael U. (amiga)


Lesenswert?

Hallo,

ja, ist ein Fehler, der Mega8 kennt nur rcall.

rcall erreicht einen Bereich von PC+2k Word bzw. PC-2k Word.
Damit ist beim Mega8 der komplette 8k Byte (4k Word) Flash erreichbar 
und es gibt keinen call Befehl. Bei den größeren AVR (mehr Flash) reicht 
das dann nicht mehr und es gibt call.

Ist wohl passiert, weil der Schreiber des Tutorials es auf einem AVR mit 
mehr Flash geschrieben hat und es dann erst für den Mega8 eingestellt 
hat...

Zu deinem Fehler kann ich jetzt nicht viel sagen, kommtiere doch mal den 
Aufruf

_loop:
;    call    out_number  mal auskommentieren

aus, dann sollte die Anzeige auf irgendwelchen Werten stehen.
Flackert es dann auch ist es ein Fehler in den Multiplexroutinen oder 
dem Interrupt, sonst in der Zählroutine/Rechnerei.

Gruß aus Berlin
Michael

von F. P. (pl504)


Lesenswert?

Hallo Michael!

Deinen Tip habe ich mal umgesetzt und die Zeile auskommentiert.
Das Ergebnis: Es werden vier "Nullen" inklusive Dezimalpunkt an jeder 
Ziffer angezeigt, allerdings bleibt Segment "d" ausgeschaltet, also 
sehen die "Nullen" wie ein großes Pi aus.
Die Anzeige flackert weiterhin. Manche Segmente (bei jeder Ziffer 
anders) scheinen etwas langsamer zu flackern, andere machen fast den 
Eindruck, als ob sie permanent leuchten (also kein sichtbares Flackern). 
Also vermute ich, daß es mehrere unterschiedliche Durchläufe gibt und 
nicht immer dasselbe angezeigt wird. Eventuell sollte ich mal auf einen 
externen langsamen Takt umstellen, dann könnte man die einzelnen 
angezeigten Sachen lesen.

Also alles sehr seltsam!
Was soll ich als nächstes tun?

von F. P. (pl504)


Lesenswert?

Nachtrag:
Bei nochmaliger eingehender Überprüfung des Quelltextes ist mir ein 
weiterer gravierender Fehler aufgefallen:

Die Segmente werden verkehrtherum angesteuert.

Um ein Segment einzuschalten, muß das entsprechende Bit auf 0 
gesetzt werden, und nicht wie im Programm auf 1. Als Treiber dienen im 
Beispiel PNP-Transistoren, die mit 0 durchgeschaltet werden, also sind 
alle Segmente aus, wenn am Port-Ausgang PC0:3 1111 anliegt.

Kann auch in der Diskussion zu diesem Artikel nachgelesen werden, wie 
ich gerade gesehen habe.

Ich bin dabei, das Programm umzuschreiben, was mir allerdings nicht so 
leicht fällt, da ich mit Zeigern noch nicht so viel Erfahrung habe.
Eigentlich müßte der Autor das machen. ;)

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.