Hi alle, ich habe zwischen PortD und PortC eines ATMEGA64 acht LEDs verdrahtet. Die Teile sind LowCurrent LEDs, als Widerstände habe ich 1650 Ohm genommen. Das Programm, mit dem ich die Polarität immer umschalte, ist in Bascom geschrieben: $regfile = "m64def.dat" $crystal = 1000000 Do Ddrd = &B11111111 Portd = &B11111111 Ddrc = &B00000000 Portc = &B00000000 Waitms 500 Ddrd = &B00000000 Portd = &B00000000 Ddrc = &B11111111 Portc = &B11111111 Waitms 500 Loop Eigentlich sollten die Dinger doch blinken. Aber irgendwie tut sich gar nichts. Auch wenn ich zwischen den Pins Spannung messen will, bleibt die bei Null. Die Fuses JTAG und M103 sind beide deaktiviert, das Problem sollte es also nicht sein. Programmiert habe ich mit TwinAVR, das scheint auch einwandfrei zu laufen. Habe ich einen Denkfehler? Vielen Dank! Gruß Sebezahn
Ich kenne TwinAVR zwar nicht, nehme aber an, dass Ddrc und Ddrd die Datadirection Ports sind. Sowohl bei Port C als auch PortD müssen diese Werte dann immer auf &B11111111 sein, damit beide Ausgänge sind. BTW: Ich verstehe nicht, warum du die Polarität umkehrst? handelt es sich um zweifarbige LEDs? Zum Blinken würde es doch reichen, bei der Anode zwischen VCC und GND zu wechseln.
Die Vowiderstände der LED's scheinen ein wenig zu gross dimensioniert zu sein. R = (U - ULED) / I Also mal angenommen R = (3.3V - 1.6V) / 5mA = 340 Ohm Vielleicht liegt der Fehler also nur in der Hardware. Gruss, Johnny
Ich bin zwar kein Bascom Spezialist, aber soweit ich sehe schaltest du nicht nur den Zustand der Ports um sondern auch jedesmal die Richtung (DDRC,DDRD). Wenn die LED's zwischen den Ports hängen, ist immer jeweils eine Seite "in der Luft". So müsste es funktionieren : $regfile = "m64def.dat" $crystal = 1000000 Ddrd = &B11111111 Ddrc = &B11111111 Do Portd = &B11111111 Portc = &B00000000 Waitms 500 Portd = &B00000000 Portc = &B11111111 Waitms 500 Loop
Noch einfacher ist: $regfile = "m64def.dat" $crystal = 1000000 Ddrd = &B11111111 Ddrc = &B11111111 Portd = &B11111111 Do Portc = &B00000000 'Einschalten Waitms 500 Portc = &B11111111 'Ausschalten Waitms 500 Loop Weniger Tipparbeit wenn Du &HFF bzw. &H00 verwendest.
Ach ja, und dimensioniere die Widerstände so, wie Johnny schon postete, dann klappt auch mit'm Blinken. Grüße
Hi alle, danke erstmal für die vielen Anregungen. Zu den Vorwiderständen: Ich dachte, aus dem Port eines AVR kommen 5 Volt, die LEDs brauchen nur 2mA und ca. 1,7 Volt, das habe ich im Datenblatt nachgeschaut. Wären also (5V-1,7V) / 0.002A = 1650 Ohm. Oder denke ich da falsch? Ich werde mal 5Volt direkt anschließen, habe ich irgendwie noch nicht dran gedacht. Aber zwischen den Ports kann ich auch überhaupt keine Spannung messen. Dass ich die Ports "umdrehe" und die LEDs von beiden Seiten mit Strom versorge, ist tatsächlich so gedacht. Deshalb bin ich ja auch nicht mit einer Seite gegen Masse gegangen. Leuchten sollen sie allerdings nur "in einer Richtung", klar. Umgekehrt werden die Dinger mit ein wenig mehr Programmierarbeit zu Fotosensoren. Wer mehr wissen möchte, ist herzlich zu weiteren Diskussionen eingeladen. ;-) Nochmal zum Grundverständnis für mich: Ich habe acht Dioden ZWISCHEN den Ports hängen, also PC1 auf PD1, PC2 auf PD2 usw. Ddrd = &B11111111 Portd = &B11111111 Ddrc = &B00000000 Portc = &B00000000 Ich schalte mit DDRD=&B111.. alle Pins auf Output... und mit Portd = &B11... auf high. Mit anderen (laienhaften) Worten: Aus den Pins kommt Strom. DCRC = &B00.. legt die Gegenstücke auf Input, also "nehmen" die Strom entgegen, Portc = &B000... deaktiviert den Pullup-Widerstand, richtig? In der nächsten Phase ist es genau umgekehrt. Und bei einer Phase müssten Sie leuchten. Tun sie aber nicht. Oder habe ich da einen fundamentalen Denkfehler? Ich werde morgen im Labor als erstes die Dioden gegen 5 Volt legen, danach mal gegen 3,3 Volt und mal schauen, ob die überhaupt was ausgeben. Auf die einfachsten Tests kommt man nicht. Und danach nehme ich mal das Programm von pschober... Vielen Dank Euch allen nochmal, für weitere Anregungen bin ich jederzeit dankbar! Gruß Sebezahn
> Mit anderen (laienhaften) Worten: Aus den Pins kommt > Strom. DCRC = &B00.. legt die Gegenstücke auf Input, also > "nehmen" die Strom entgegen, Und hier ist dein Denkfehler. Der Port muss immer auf 'Output' geschaltet sein. Wenn der Ausgabepin dann auf 1 geschaltet wird, fungiert er als Stromlieferant. Liegt der Ausgabepin auf 0 fungiert er als Stromsenke.
Hi, ja, das erklärt einiges. Ich hoffe auf einen erfolgreicheren morgigen Tag... Vielen Dank! Sebezahn
@sebezahn Du musst Dir darüber klar werden, was DDRx (Data Dirction Register) ist und die Befehle PORT und PIN bedeuten. Ferner solltest Du Dir ansehen, wie der Pullup funktioniert. Ein kuzer blick in die Kapitel des GCC-Tutorials kann Dir sehr helfen, auch wenn Du mit BASCOM programmierst.
@Marc Ich denke sein Fehler war eine etwas naive Denkweise: Der Strom kommt aus dem einen Port raus, rinnt durch die LED und rinnt in einen anderen Port hinein. Raus - rein. Also muss der eine Port als Ausgang geschaltet werden und der andere als Eingang. Auch bei einem auf Ausgang geschalteten Port kann der Strom in diesen Port hinein-'fliessen'. Nämlich dann wenn das Potential (sprich die Spannung) ausserhalb des Ports höher ist als innerhalb des Ports. Bei einem Port bezeichnet die Datenrichtung (Ausgang/Eingang) eigentlich nur wer den Pegel (sprich die Spannung) an diesem µC-Pin vorgibt: Der µC oder die externe Schaltung. (vereinfacht ausgedrückt)
Hi, klar, eigentlich logisch, "naiv" ist nett g. Wenn ich das jetzt richtig verstanden habe, heißt INPUT, dass ich quasi messen kann, ob von extern eine Spannung anliegt. OUTPUT heißt hingegen, dass der uC Lieferant ist, je nach Pegel von Spannung oder Masse. Entschuldigt bitte die sehr unphysikalische Ausdrucksweise, aber es geht jetzt nur ums Grundverständis. Ich werde gleich testen, dann schreibe ich heute abend auf jeden Fall, wie es und warum es hoffentlich geklappt hat. Danke nochmal, der Gedankenwirrwarr ist erstmal beseitigt! Gruß Sebezahn
Richtig. Input = der uC can feststellen was am pin liegt (GND oder VCC) Output = der uC legt fest welcher Pegel anliegt (GND oder VCC) Für ne LED reicht es übrigesn diese z.B. per Vorwiderstand an VCC zu legen, dann ist Pin = GND LED an, Pin = VCC Led aus :)
Ja jetzt hast du es. Und ein Eingang hat immer einen sehr hochen Eingangswiderstand deshalb kann da nicht viel Strom fließen und deshalb leuchten deine LEDs nicht.
Ah ja, mit 5V und 2mA für die LED's ist die Dimensionierung völlig ok. Ich lebe wohl schon zu fest in der 3.3V Welt :-)
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.