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
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
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.
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?
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.
Hier ist mal ein Beispielprogramm, allerdings in C geschrieben: http://www.mikrocontroller.net/forum/read-4-210743.html#new Peter
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)...
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.
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.
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 ;)
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...
klar kann man das. Die Einschränkungen der unteren Register sind nur alle Befehle , die direkt mit im Befehl angegebenen Konstanten arbeiten (immediate).
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.