mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7 Segmetanzeigen mit ATMega8


Autor: Patrick Grabe (meepmeep)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Patrick Grabe (Gast)
Datum:

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

Autor: Patrick Grabe (Gast)
Datum:

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

Autor: TravelRec. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist mal ein Beispielprogramm, allerdings in C geschrieben:

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


Peter

Autor: Patrick Grabe (Gast)
Datum:
Angehängte Dateien:

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

Autor: Patrick Grabe (Gast)
Datum:
Angehängte Dateien:
  • __sm (1,39 KB, 119 Downloads)

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wann und wo wird das Display initialisiert ?

Autor: Matze (Gast)
Datum:

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

Autor: Patrick Grabe (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Patrick Grabe (Gast)
Datum:
Angehängte Dateien:

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

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.