Hallo Leute! Da ich mich noch als Neuling in µCU nennen kann, wollte ich euch um Hilfe bitten. Also was ich bis jetzt kann, dass ist das korrekte aktivieren der Timer und Counter für Interrupt Overflows, aktivieren von Ports etc. Also das, wenn man das Datenblatt richtig gelesen hat ^^. Jezt wollte ich mich mal an das Ansteuern von 7-Segment Anzeigen (gem. Anode) herantasten, doch da weiß ich manchmal nicht, wie ich jetzt mein Können richtig einsetzten kann. Also ich hab z.B die Segment a-g an die Portpins 0-6 von PORTB am ATmega8 gehängt und im Flash-Speicher leg ich die Zahlen als Hexadezimal ab: Segment: .db 0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 =1 =2 =3 =4 =5 =6 =7 =8 =9 Jetzt lass ich per 16 bit timer1 und pescaller 8 den Overflow interrupt alle 0.5 sek bei 1MHz auslösen und lassen das ZL register um 1 bit jeweils bei einem interrupt erhöhen. Die Programmadresse von Segment wurde in den ZL und ZH register geladen: ldi ZL, LOW(Segment*2) ldi ZH, HIGH(Segment*2) Was ist z.B hier nicht verstehe: WIESO *2 hinter dem Segment? (Habs so im Tutorial gelesen.) So hier klappt auch alles Richtig... naja nach der Zahl 9 kommt halt nur mist, aber da hab ich noch nix gefunden um das zu verhindern. Meine Frage jetzt... wie mache ich es um z.B 2 Anzeigen zu betreiben? Nennt sich dann ja Multiplexing weil ich jeweils nur 1 Anode z.B durch einen Transistor ansteuere. Ich glaub ich hab nach dem langen proggen einfach keine ideen mehr. Könntet ihr mir Helfen? ( PS: Endziehl soll ein Belichtungstimer mit 3x 7Segmentanzeigen werden.)
Das '*2' bei der Adresse kommt daher, dass der Programmspeicher Wortorganisiert ist, d.h. jede Adresse spricht 16 Bit an. Da der lpm-Befehl, mit dem Du die Daten laden kannst, aber einzelne Bytes anspricht, wird die eigentliche Adresse mit zwei Multipliziert. Je nachdem, ob das LSB (also das Bit Nr. 0) 0 oder 1 ist, wird das erste oder das zweite Byte in einem Wort angesprochen. Hier war letzte Woche oder so ein Thread, in dem das ziemlich ausführlich breitgetreten wurde. Ich such den mal raus...
So, hier isses: http://www.mikrocontroller.net/forum/read-1-388467.html Da ist das mit der indirekten Adressierung mit einer Lookup-Tabelle im Flash ausführlich beschrieben.
@Kri: Ich glaub, Du hast die Frage (oder die Antwort) nicht ganz verstanden! Es geht sehr wohl um zwei Bytes!
Probiers mal mit einem 8-fach Schalter (74xxx oder kleines CPLD) und einem anderen Pin als Adressleitung zum Auswählen. (das mit *2 hab ich wohl überlesen - sorry)
@Kri: Er braucht keine externen Elemente! Das ist Verschwendung... Weiter gehts: Das Multiplexen geht eigentlich recht einfach: Du hast Deine 7 Segmente an 7 µC-Pins angeschlossen. Jetzt musst Du noch die gemeinsamen Anschlüsse der Displays auf je einen Portpin legen. Wenn Du den gemeinsamen Pin am µC als Ausgang schaltest und eine '1' ins Portregister schreibst, kannst Du die Daten für das dazugehörige Digit an den anderen 7 Pins ausgeben. Dann schaltest Du den gemeinsamen Pin des ersten Digits auf Eingang um (im DDR..), damit er hochohmig abgeschlossen ist und kein nennenswerter Strom mehr durch die LEDs fließt. Bei Displays mit gemeinsamer Anode ist es u.U. sinnvoll, den Pull-Up am Portpin auszuschalten, damit die Anzeige wirklich keinen Saft mehr kriegt (also PORTX.n auf 0). Dann die Daten für das zweite Digit ausgeben, den gemeinsamen Pin auf Ausgang und 1 im Portregister stellen. Das ganze immer wieder hin und her, und zwar möglichst mit ein paar hundert Hz, damits nicht flimmert...
Na und, er fragte ja nach dem "*2" ;) @Alexander: Beim Multiplexbetrieb musst du dein Programm einfach so anpassen, dass nacheinander alle Anzeigen über die gemeinsame Anode aktiviert und mit dem anzuzeigenden Zeichen belegt werden. Das Ganze dann so schnell, dass ein kompletter Durchlauf max. etwa 20ms (entspricht 50Hz, mehr wäre noch besser) dauert. Zuerst versorgst du also Digit 0 mit Strom (Anode an die Versorgungsspannung, die anderen offen) und gibst für die Segmente so wie oben dein Zeichen aus. Das lässt du dann ein Weilchen so stehen und schaltest dann zur nächsten Anzeige, gibst wieder die entsprechenden Segmente aus usw. Du hast also an den Anoden ein "laufendes Bit", von Digit 0 bis Digit x. Hoffe das war verständlich :)
Ach ja, wenn Du sowieso schon Transistoren an den Anoden Deiner Displays hast, brauchst Du natürlich den Pin nicht mit dem DDRX umzuschalten. Dann kannst Du ihn als Ausgang lassen und brauchst nur im Portregister umzuschalten.
@johnny.m: Grmpf, warst schneller ;) Erzähl ihm aber mal keinen Mist von wegen "Anode an den Portpin". Pro Pin liegt der max. Strom bei etwa 20mA, im Falle einer 8 wird da aber sicher einiges mehr fliessen (u.U. 8 * 10mA = 80mA = Port tot). Also Treiber (Transistor) nicht vergessen!
@Philipp: Kommt drauf an, was er für Displays verwendet. Ansonsten haste völlig recht (bis auf den max. Strom, der liegt bei den AVRs bei 40mA pro Pin...)
Waren's doch 40mA? Naja auch egal, jedenfalls würde ich in jedem Fall einen Transistor verwenden. Achja, oben wären's natürlich 7 * 10mA, den Punkt hat er ja eh net angeschlossen...
Naja, er schreibt ja sowieso irgendwas von Transistoren. Ich denke auch, dass 50Hz auf jeden Fall zu wenig sind. Habe das mal ausprobiert und festgestellt, wenn wirklich kein Flimmern mehr sichtbar sein soll, dann sollte man schon auf Frequenzen jenseits von 200Hz gehen. OK, es gibt Leute, die beschweren sich bei 5kHz noch über das Flackern. Die schicke ich aber dann meist direkt zum Augenarzt...
Ok danke schonmal für die Infos... muss gleich in den Keller und dort das zweite Display anschließen, dann gehts hier weiter. Naja und zuvor Staubsaugen :D sonst macht Mutter stress ohne ende ^^
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.