Hallo, ich wollte mich mal mit dem Programmieren von µCs beschäftigen und habe mir einen atmega644P gekauft und entsprechend diesem Tutorial: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment und dem erfos Prog-S ISP-Programmer eine Platine gebastelt. Das hat bedingt Funktioniert nur hatte ich Probleme mit dem Abfragen von Eingängen. Daraufhin habe ich mir Steckbrett und ein Spannungsmessgerät gekauft. auf dem Steckbrett habe ich nun einen Atmega48 benutzt, da ich mir nicht sicher bin ob das Problem am Controller liegt und ich lieber die Billigeren zerschieße. Soweit so gut hat das dann auch mit dem Datenblatt (http://www.atmel.com/Images/doc2545.pdf) geklappt. Wenn ich nun Pins als Ausgänge definiere und auf High setzte habe ich auch konstant 5V und andersrum auch 0V. Wenn ich jedoch einen Pin als Eingang nehme und mit nem Taster per Abfrage ne LED bei zum leuchten bringen will klappt nix. Die LED leuchtet ununterbrochen etwas dunkler und sobald ich den Taster drücke, leuchtet sie heller. Vorwiderstand is drin, Kondensatoren auch. Am Ausgang messe ich ohne Knopfdruck knapp über 1V. Hier mein Code: #include <avr/io.h> int main(void) { while(1) { DDRD=0x00; DDRB=0xFF; if(PIND & (1<<PD0)) { PORTB=(1<<PB0); }else { PORTB=0x00; } } } Ich hab einfach überhaupt keine Ahnung was ich falsch mache. Hilfe wäre an der Stelle echt super :D Achja wenn ich mit dem Messgerät an den Ausgang am µC gehe dann leuchtet die LED nicht mehr - nur noch bei Tastendruck ^^.
Florian Loers schrieb: > Wenn ich jedoch einen Pin als Eingang nehme und mit nem Taster per > Abfrage ne LED bei zum leuchten bringen will klappt nix. Ein bisschen kommt es auf deine Schaltung drauf an. Falls dein Taster nach Gnd schaltet, brauchst du einen Pull-Up Widerstand. Am einfachsten ist, wenn du den internen aktivierst.
Pullups werden doch nur aktiviert wenn man auf einen PIN als Ausgang definiert oder? Ich hatte eigentlich vor über den Schalter PD0 auf high zu setzten und dann halt im µC dadurch die LED an PB0 zum leuchten zu bringen. Meinst du sowas wie low active oder was?
Florian Loers schrieb: > Pullups werden doch nur aktiviert wenn man auf einen PIN als Ausgang > definiert oder? Zum aktivieren der Pullups:
1 | PORTD = 0xff; |
xD ok ich hab nicht gewusst dass das klappt. ICh hab gelernt dass man die so als Ausgänge einstellt. und mit 0 halt als Eingang und irgendwie is der schalter ja n Eingang hm... 100 Dank für die Hilfe :D Kannst du mir auch erklären warum dass jetzt funktioniert und nicht wenn die Pullups nich an sind? Nur aus Interesse.
Florian Loers schrieb: > Kannst du mir auch erklären warum dass jetzt funktioniert und nicht wenn > die Pullups nich an sind? Nur aus Interesse. Das liegt daran, weil der Pin sonst in der Luft hängt und "irgendwelche, komischen, undefinierbaren" Signale auffängt. Aber eben kein Plus.
Ok und wofür braucht man dann DDRA=0x00; ? Also wann braucht man keine Pullupwiderstände?
Florian Loers schrieb: > Ok und wofür braucht man dann DDRA=0x00; ? Also wann braucht man keine > Pullupwiderstände? Hä? Also nochmals zusammengefasst: DDRX=1: AUSGANG Mit PORTX=1 wird der Ausgang "angeschaltet" (gesetzt) Mit PORTX=0 wird der Ausgang "ausgeschaltet" Mit PINX=1 kann bei manchen AVRs der Ausgang getoggelt werden DDRX=0: EINGANG Mit PORTX=1 wird der Pullup aktiviert Mit PORTX=0 wird der Pullup deaktiviert Mit PINX kann man den Eingang abfragen Bitte lies das AVR-GCC-Tutorial!!! Vor allem: AVR-GCC-Tutorial: Zugriff auf IO-Ports
Entschuldigung. Ich habe schon viel mit dem Tut gearbeitet. Hab das wohl irgendwie durcheinander gebracht. Dankeschön nochmal :D
Bzw unser Lehrer hat uns mal erklärt das der befehl PINX nur für Eingänge und PORTX nur für Augänge gilt und das ansonsten das gleiche ist... insofern weiß ich ja wo die Verwirrung her kommt.
Florian Loers schrieb: > Bzw unser Lehrer hat uns mal erklärt das der befehl PINX nur für > Eingänge und PORTX nur für Augänge gilt und das ansonsten das gleiche > ist... insofern weiß ich ja wo die Verwirrung her kommt. Den Lehrer würde ich gerne mal kennenlernen... ;)
Wir haben immer nur alles Theoretisch gemacht. Irgenwann hab ihc mir mal das STK 600 mit nach Hause genommen und den ganzen kram ausprobiert: Nix hat funktioniert. Außer das erste Programm... Lauflicht. :D naja Ich will n Roboter bauen (Kindheitstraum) und fang halt jetzt wo abi durch is mal die 3 Jahre unterricht nachzuholen :D Ich bastel die Tage nochmal ne kleine "Huckepack" ISP-Platine. Sollte ich Fragen dazu hier wieder stellen oder einen neuen Beitrag? Ich frag weil ich tatsächlich noch nie bisher selber was in nem Forum fragen musste :D bisher haben immer andere meine Fragen gestellt.
Florian Loers schrieb: > Ok und wofür braucht man dann DDRA=0x00; ? Also wann braucht man keine > Pullupwiderstände? Da hat dein Lehrer etwas Verwirrung gestiftet. Obwohl er nicht grundsätzlich Unrecht hat mit den Pullups und den Eingängen. Das ist bei verschiedenen Controllern, allen voran 8051, auch so. Nur beim AVR ist es eben nicht so! Beim AVR wird zwischen Eingang und Ausgang umgeschaltet. Dazu sind die DDR-Register. 0 = Eingang, 1 = Ausgang. Einen Pullup braucht man z.B. wenn man einen Taster einlesen will. Solange der Taster offen ist, hängt der Portpin in der Luft. Deswegen schaltet man ihn über den (eingebauten) Pullup an Vcc. Und legt mit dem Betätigen des Tasters GND an. mfg.
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.