Hallo zusammen, ich bin am verzewifeln. Für den AT90USBKey2 habe ich mir eine Adapterplatine gemacht, damit mal die Ports des µC auch anständig nutzen kann. Ich selber bin ziemlicher Neuling auf dem ganzen Gebiet. Und habe nun folgedes Problem: Zum Test ob alle Pins ordnungsgemäß funktionieren habe ich zunächst ein kleines Lauflicht-Programm geschrieben. Es ist kein guter Programmierstil, aber es sollte auch nur zu Testzwecken sein. [c]#define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> void watchdog_off() { MCUSR &= ~(1<<WDRF); //Ack_wdt_reset(); WDTCSR |= (1<<WDCE) | (1<<WDE); //Wdt_change_enable(); WDTCSR = 0x00; //Wdt_stop(); } void Init(void){ // Alle Pins als Ausgang schalten DDRB = 0xFF; } int main(void) { watchdog_off(); Init(); while(1) { //Alle Pins 5V ausgeben PORTB = 0x01; _delay_ms(100); PORTB = 0x02; _delay_ms(100); PORTB = 0x04; _delay_ms(100); PORTB = 0x08; _delay_ms(100); PORTB = 0x10; _delay_ms(100); PORTB = 0x20; _delay_ms(100); PORTB = 0x40; _delay_ms(100); PORTB = 0x80; _delay_ms(100); } // while (1) } // main[\c] Leider tut sich an Port B aber 'null' (an den anderen Ports auch nicht). Da ich mir bei dem Programm nicht sicher war, habe ich anschließend versucht Spannung auf allen Pins auszugeben. Ergebnis ist entsprechend, die LEDs bleiben dunkel. Angeschlossen sind sie jeweils vom Pin zu Masse/GND, wobei das kurze Bein jeweils an GND liegt. [c]int main(void) { watchdog_off(); Init(); while(1) { //Alle Pins 5V ausgeben PORTB = 0xFF; } // while (1) } // main[\] Mit einem Durchgangsprüfer habe ich zunächst getestet ob ich beim löten Mist gebaut habe, aber da hat alles einen richtigen Eindruck gemacht. Zum Schluss bin ich hingegangen und habe einfach mal eine LED andersherum angeschlossen, von Vcc zum PortPin tut sich was. Was läuft fa schief? DDRX = 0b00001111 sollte doch die oberen vier auf Eingang setzen und die unteren auf Ausgang. In meinem Programm demnach alle auf Ausgang. Mit PORTX = 0b00001111 sollten doch die oberen vier 0V führen und die unteren vier ~5V ausgeben. In meinem Programm demnach alle 5V ausgeben. Habe ich hier etwas falsch verstanden? Ich hoffe jemand kann mir erklären was ich falsch mache. Gruß T. St.
Nimm mal einfach das einfachste Programm überhaupt:
1 | int main(void){ |
2 | DDRB = 0xFF; |
3 | PORTB = 0xFF; |
4 | while(1); |
5 | }
|
Wie programmierst Du? kommen auch keine Fehlermeldungen? Programmierst Du die richtige .elf- oder .hex-File ? Gruß Steven
T.St. schrieb: > [c]#define F_CPU 8000000 Bitte im Make-File bzw. Projekt definieren. > void watchdog_off() { > MCUSR &= ~(1<<WDRF); //Ack_wdt_reset(); > WDTCSR |= (1<<WDCE) | (1<<WDE); //Wdt_change_enable(); > WDTCSR = 0x00; //Wdt_stop(); > } Wieso verwendest du nicht die Watchdog-Funktionen von AVR-GCC (wdt.h)? > > void Init(void){ > // Alle Pins als Ausgang schalten > DDRB = 0xFF; > > } > int main(void) > { > > watchdog_off(); > Init(); > > while(1) > { > //Alle Pins 5V ausgeben > PORTB = 0x01; > _delay_ms(100); > PORTB = 0x02; Hast du die Compiler-Optimierungen an (mindestens -O1) sonst geht das _delay_ms nicht richtig
So, das einfachste Programm überhaupt habe ich nun getestet. Leider immer noch die selbe Sympthomatik. Ich überspiele das Programm (hex-File) mit Flipp falls das eine Rolle spielt. Devive verbinden (Open), Hex-Datei auswählen und dann die vier Haken links und "Run", anschließend gehe ich auf Start Application mit Reset. Ich verstehe nicht, warum die Port Pins keine Spannung ausgeben... Gruß
Jedenfalls fehlt dem Programm nichts. Entweder es liegt zwischen Programmiervorgang und µC oder ist an der Hardware was faul. Reset Pin auf low, geringe Versorungsspannung, LEDs zerschossen... Was auch immer. Wer suchet der findet... Gruß Steven
T.St. schrieb: > die LEDs bleiben dunkel. Angeschlossen sind sie jeweils vom Pin zu > Masse/GND, wobei das kurze Bein jeweils an GND liegt ohne Widerstand zur Strombegrenzung ???
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.