Hallo, ich habe ein Problem mit meiner ATMega 128 Schaltung. ich versuche schon länger eine LED zum blinken zu bekommen, die mit vcc verbunden ist und über den Controller auf Masse gezogen wird. Aber ausser das sie entweder kontinuierlich, bzw. gar nicht leuchtet tut sich nichts. Die LED die blinken soll hängt an PA0. An PA1 und PA2 sind ebenfalls LED, die dauerhaft leuchten sollen. mein Quellcode dazu ist: #include <avr/io.h> #include <util/delay.h> void delay_ms(int ms) { int t; for(t=0; t<=ms; t++) _delay_ms(1); } void main(void) { DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2); while(1) { PORTA &= ~(1<<PA0); delay_ms (100); PORTA |= (1<<PA0); delay_ms (100); } } bzw. als Versuch ohne delay: #include <avr/io.h> void main(void) { int t; int f; DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2); while(1) { for (t=0; t<=10; t++) { PORTA &= ~(1<<PA0); } for (f=0; f<=10; f++) { PORTA |= (1<<PA0); } } } Wer kann mir sagen, wo mein Denkfehler liegt? mfg Florian
Hmm, scheint Du initialisierst den Port-Pin falsch:
1 | DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2); |
müßte doch
1 | DDRA = (1 << PA0) | (1 << PA1) | (1 << PA2); |
heißen ?
DDA0 etc stimmt schon. Spielt aber keine Rolle, da sowohl DDA0 als auch PA0 über ein #define jewiles zu 0 expandieren. Das Programm an sich schaut soweit ok aus. Aber es kommt schon mal vor, dass man ein extrem langsames Blinken mit einem stationären Zustand verwechselt (wenn das Blinken zb. sich über 20 Sekunden erstreckt). Daher fragen wir mal die Umgebung ab. Dein ATMega128 läuft mit welcher Taktfrequenz? Weiss das auch der Compiler? (Sprich hast du oder AVR-Studio auch das Makro F_CPU richtig besetzt? Bist du ach 100% sicher, dass der Mega mit der von dir genannten Taktfrequenz läuft? Wenn du nicht an den Fusebits gespielt hast, dann läuft der mit 1Mhz egal welchen Quarz du extern angeschlossen hast. Also probier mal folgendes:
1 | #define F_CPU 1000000UL
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | void delay_ms(int ms) |
7 | {
|
8 | int t; |
9 | for(t=0; t<=ms; t++) |
10 | _delay_ms(1); |
11 | }
|
12 | |
13 | void main(void) |
14 | {
|
15 | DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2); |
16 | while(1) |
17 | {
|
18 | PORTA &= ~(1<<PA0); |
19 | delay_ms (100); |
20 | PORTA |= (1<<PA0); |
21 | delay_ms (100); |
22 | }
|
23 | }
|
Hallo, Also mein Controller läuft mit einem 3,686411 MHz Quarz. Ich habe mal einen Screenshot von den Fusebits angehängt. Laut Datenblatt sollte der Controller also auch auf den externen Quarz eingestellt sein. Ob dieser allerdings real auch anschwingt kann ich im moment ohne Oszi nicht nachprüfen. Als Programmierumgebung nutze ich WinAVR und Ponyprog zum Programmieren. Die Quarzfrequenz habe ich im Makefile eingestellt. Derzeitiger Stand ist, das die LED alle drei leuchten. Durch setzen der Pins als Eingang mit DDRA=0xFF; bzw. DDRA=0x00; kann ich die LED anschalten bzw. ausschalten. Nur das gewünschte blinken kommt nicht zustande. mfg Florian
Florian M. wrote:
> Ich habe mal einen Screenshot von den Fusebits angehängt.
Watchdog ein, was soll das ?
Vor dem Watchdog einschalten erstmal das Datenblatt dazu lesen !!!
Peter
Mit welcher Optimierungsstufe betreibst du den Compiler. Benutzte Os Ansonsten: Verändere mal die Zeiten. Mach die 100 mal grösser oder kleiner. Da stimmt irgendwas am Timing nicht. Mach auch mal folgendes: void main(void) { DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2); PORTA = 0b00000100; ... Jetzt muss Led2 nicht leuchten, Led1 leuchten und Led0 solte eigentlich blinken (aber das hatten wir schon). Wenn das Muster Led2/nicht Led1/schon nicht da ist, dann läuft der Prozessor aus irgendeinem Grund nicht. Denke aber nicht dass das der Fall ist, da du ja anscheinend eine Reaktion auf das Umschalten der Pins kriegst.
Danke, es lag am Watchdog. Wie ich den allerdings Aktiviert habe weiss ich nicht. Muss dann ungewollt passiert sein. mfg Florian
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.