Forum: Mikrocontroller und Digitale Elektronik 7 Segmetanzeigen mit ATMega8


von Patrick G. (meepmeep)


Angehängte Dateien:

Lesenswert?

Hmm also an Port D wird das Signal für den Anzeigewert ausgegeben.
An Port C hängen die Transistoren die die einzelnen Displays gegen
Masse schalten um schließlich ein Multiplexdisplay mit einem 8 bit
Zähler und einer Anzeige des BCD codierten port B zu erhalten.
So weit so gut.
Nur er zeigt mir auf dem Zähler auf allen 3 Stellen den BCD Fehler an,
ich vermute das da was im Zelegemechanismus nicht passt.
Auf der Anzeige für den aktuellen Eingangswert bekomme ich auch den BCD
Fehler angezeigt, nur die blinkt komischer Weise so mit 10-20 Hz
der Port B wird eigentlich von einer SPS mit 24 Volt angesteuert, die
Eingangsbeschaltung sieht so aus, das je ein 18k Widerstand an dem Pin
ist. Mit einem 10k Wiederstand davor wird das ganze auf Masse gezogen.
wenn ihr wollt bastel ich auch noch nen Schaltbild des ganzen, hatte
ich jetzt nur keine Zeit zu.
Das Programm ist zugegeben etwas unordentlich, so zeigt er aber
wenigstens was halbwegs Sinnvolles an, wenn ich alle Signalauswertungen
an den Anfang lege, dann kommt nur Brei raus...
Für mein erstes UC Projekt ist das Erreichte aber schon ganz ok finde
ich.

Grüße Patrick

von Peter D. (peda)


Lesenswert?

Versuche mal das Ganze in einzelne Unterfunktionen zu zerlegen, in so
einem Spaghetticode mit hin- und hergejumpe kann wirklich kein anderer
durchsehen.

Also z.B.: Unterfunktion
- initialisieren
- Hochzählen
- dezimal zerlegen
- 7-segment wandeln
- anzeigen (multiplexen)

Und statt irgendwelcher Delays ist es viel einfacher, das Multiplexen
komplett in einen Timerinterrupt auszulagern.

Und für die Umwandlung in den 7-Segmentcode schau Dir mal den
LPM-Befehl an, genau dafür ist er gemacht.

Schaltplan ist notwendig, 24V direkt an einen Pin müßte eigentlich
aufplatzende Chips und Rauchentwicklung zur Folge haben.


Peter

von Patrick Grabe (Gast)


Lesenswert?

Ok dann schreib ich mal nen neues Programm. Die 24V werden über
widerstände an den Ic gekoppelt, qualmen tut nix :D
Am Wochenende bastel ich auch mal nen Plan, dann ist es warscheinlich
einfacher für alle.

von Patrick Grabe (Gast)


Lesenswert?

Hmm mir scheint es so, das dieser LPM Befehl ehr für feste Zeichenketten
gedacht ist als für einzelne Zeichen, oder hab ich das jetzt falsch
verstanden? denn wenn du meinst, das man nur die Zeichen aus dem rom
laden soll, dann würde ich jetzt wieder die 11 Vergleicher
programmieren und da dann jeweils mit dem lds befehl die Zeichen
laden.
Ist meine BCD Zerlegung denn richtig programmiert, oder wird die so
unter keinen Umständen funktionieren?

von TravelRec. (Gast)


Lesenswert?

Die anzuzeigenden Ziffern schreibst Du in 7-Segment-code in eine Tabelle
im FLASH, so daß jedes gesetzte Bit eines Bytes einer leuchtenden LED im
Digit entspricht. Die Tabelle baust Du so auf, daß die Bytes so geordnet
sind, daß byte 0 der ziffer 0 entspricht, Byte 1 der Ziffer 1 usw. Dann
programmierst Du Dir einen Z-Pointer mit der High/Low-Addresse der
Tabelle (guck mal in die Appnotes bei Atmel, sind jede Menge Beispiele
drin). Auf diesen Z-Pointer addierst Du die virtuelle Ziffer die Du im
Display anzeigen willst. Per LPM Temp, Z bekommst Du dann in das
Temp-Register den passenden Wert aus der Tabelle und den schreibst Du
dann (gemultiplext) aud Deinen Displayport. Dieses Spiel wiederholst Du
für jede Ziffer. Wenn Du den Punkt vom Display auch noch anschließt,
kannst Du das volle Tabellen-Byte nutzen. Außerdem kannst Du in Deine
Tabelle auch noch Sonderzeichen (Buchstaben) eingeben.

von Peter D. (peda)


Lesenswert?

Hier ist mal ein Beispielprogramm, allerdings in C geschrieben:

http://www.mikrocontroller.net/forum/read-4-210743.html#new


Peter

von Patrick Grabe (Gast)


Angehängte Dateien:

Lesenswert?

So da haben wir den Schaltplan von dem  Ding als Eaglefile.
Da das programm meinen Controler offensichtlich nicht kennt, hab ich
einfach alle Ports als Text an die Anschlüsse geschrieben.
das Programm folgt in wenigen Minuten, aber so viel schon jetzt, es
will immer noch nicht so wie ich will (heul)...

von Patrick Grabe (Gast)


Angehängte Dateien:

Lesenswert?

So das ist das aktuelle Programm, das mit dem Timer Interrupt kapier ich
nicht, gibts dazu auch ein Aplication note?
Für den Interrupt hab ich jetzt erst mal nen Platzhalter eingebaut.
viel wichtiger ist mir erst mal, das die neue BCD Routine funktioniert.
Da habe ich mich nen bischen nach dem LCD Tutorial gerichtet.
Wie hier angesprochen habe ich die Register nun benannt, ich hoffe es
erleichtert den Durchblick durch mein Noobigebastel... ;)
Ach ja die Reation von der Platine ist = 0.
D. h. das komplette Display ist dunkel.

von crazy horse (Gast)


Lesenswert?

auf die Schnelle:

lpm
mov r0, temp
out PORTD, temp

das ist natürlich falsch. Der einfache LPM-Befehl speichert das
Leseergebnis in R0.

lpm
out PORTD, R0

wäre richtig.

von Wolle (Gast)


Lesenswert?

Wann und wo wird das Display initialisiert ?

von Matze (Gast)


Lesenswert?

zu deiner schematic:
die transistoren die die einzelnen seg. anzeigen ansteuern sind alle
falsch rum drin!!
die eingänge 1,2,4,8 dürften in deinem fall dann auch nicht 24V
schalten, sondern nur nach masse schalten. sonst nimmt dein µC ein
schnelles ende ;)

von Patrick Grabe (Gast)


Lesenswert?

Ja das mit den Transistoren ist ein Fehler, der nur auf dem Plan
existiert. Auf meiner Platine sind die richtig rum drinn.

@ Horse: Ja klar jetzt wo du die Codepassage rausgesucht hast fält es
mir auch auf... Temp und r0 sind vertauscht --> kann nicht funzen.
Kann man aus den unteren 16 Registern direkt in die Ausgaberegister
schreiben? Ich hatte mal irgentwo gelesen, das das nicht geht, deshalb
auch der Umweg über Temp. Aber wenn du das so schreibst probiere ich
das mal ohne den Umweg.
@ Wolle: Warum soll ich einen 7 Segmentbaustein initialisieren? Ich
steuere doch schon die einzelnen Segmente an, das ist kein LCD!

Danke für die freundliche und kompetente Hilfe! Mal schauen ob es nu
endlich klappt...

von crazy horse (Gast)


Lesenswert?

klar kann man das. Die Einschränkungen der unteren Register sind nur
alle Befehle , die direkt mit im Befehl angegebenen Konstanten arbeiten
(immediate).

von crazy horse (Gast)


Lesenswert?

ach ja, und dann gibts noch bei den Megas den Befehl
lpm Rd, Z
Damit kann man in beliebige Register schreiben, bringt dir in diesem
Fall nichts - es sei denn, du willst unbedingt temp für die Ausgabe
benutzen :-)

von Patrick Grabe (Gast)


Angehängte Dateien:

Lesenswert?

Hmm es funzt immer noch nicht...
Beim simulieren hab ich herausgefunden, das der fehler beim auslesen
addieren, bzw. beim auslesen vom Z Wert lieget, ich weis aber nicht
warum . :(
Er setzt mir dann immer nur die Bits 5 und 6, so das nur müll auf der
Anzeige steht.
Counter und so funzt alles so weit, wie man es ohne richtig
funktionierende Anzeige testen kann...

Ach ja gibts irgentwo nen ASM Beispiel für nen timer interrupt?

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.