bin gerade die timer und die interuppt funktion am testen und will das nach 3 sekunden die led angeht aber es tut sich nix kann mir jemand sagen was ich falsch mache??? #include <avr/io.h> //Bibliotheken(Headerfiles einbinden) io=input output bibliiothek #include <avr/interrupt.h> #define F_CPU 16000000UL volatile int a=0; ISR ( TIMER0_OVF_vect ) { a++; //das gleiche wie a=a+1 if (a == 300) {PORTD |= (1<<PD5);} //led1setzen } int main (void) { DDRD = 0x00; //Datenrichtungsregister D alles 0 (Eingänge) //DDRD = (1 << DDD5); //eine 1 für ausgang an Stelle 5 // DDRD = (1 << DDD7); DDRD = (1 << DDD5) | (1<<DDD7) | (1<<DDD6); //Quarztakt wird durch 1024 geteilt 16MHz/1024=15625Hz // 15625Hz/100Hz(10ms)=156,25 TCCR0 |= (1<<CS00)|(0<<CS01)|(1<<CS02); TCNT0 = 156; // Vorladen TIMSK |= (1<<TOIE0); // Interrupts freigeben sei(); while(1) { } return 0; }
Erstens musst Du den Pin, an dem die LED hängt, als Ausgang konfigurieren, und nicht als Eingang! Du musst den Timer auch in der ISR wieder nachladen, sonst dauert das ganze mehr als doppelt so lang. Sind die anderen Timer alle belegt? Wenn nicht, dann nimm einen von denen (Timer 2 z.B.) und betreibe ihn im CTC-Modus. Dann kannste Dir das lästige und ungenaue Vorladen komplett sparen. BTW: Bist Du sicher, dass die LED Low-Side angeschlossen ist und bei einer 1 am Pin angeht? In vielen Fällen ist es andersrum. EDIT: Sehe grad, dass das sowieso fürchterlich chaotisch ist. Der Pin wird ja tatsächlich drei Zeilen weiter auf Ausgang geschaltet. Daran liegts also nicht. Allerdings ist das "DDRD = 0x00;" irritierend und überflüssig. Und: Bitte formatiere den Code vernünftig! Unten unter den "Wichtigen Regeln" steht, wie es geht... Noch ein EDIT: Ist im Makefile bzw. AVRStudio der richtige Controller angegeben?
hallo hab das Problem gelößt habe die fusebits nicht auf den externen Quarz gestellt und deswegen vorher mit 1MHz gearbeitet jetzt läuft es danke
1 | #include <avr/io.h> //Bibliotheken(Headerfiles einbinden) |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define F_CPU 16000000UL
|
5 | |
6 | volatile int a=0; |
7 | |
8 | ISR ( TIMER0_OVF_vect ) //auslößen des Timerinteruppts |
9 | {
|
10 | |
11 | TCNT0 = 100; // Vorladen |
12 | |
13 | a++; //das gleiche wie a=a+1 |
14 | if (a >= 500) //500*9,984ms=4,992s |
15 | {PORTD |= (1<<PD5);} //led1 setzen |
16 | }
|
17 | |
18 | int main (void) |
19 | {
|
20 | |
21 | DDRD = (1 << DDD5) | (1<<DDD7) | (1<<DDD6); //DDRD 5(Led1) 6(LED2) 7(Summer) als Ausgänge |
22 | |
23 | // Initialisierung des Timers:
|
24 | |
25 | TCCR0 |= (1<<CS00)|(0<<CS01)|(1<<CS02); //Quarztakt wird durch 1024 geteilt 16MHz/1024=15625Hz |
26 | |
27 | TCNT0 = 100; // Vorladen 15625Hz/101,16Hz(9,984ms)=156 256-156=100 |
28 | |
29 | TIMSK |= (1<<TOIE0); // Interrupts aktivieren und damit Timer starten |
30 | |
31 | sei(); // globale Interrupts zulassen |
32 | |
33 | |
34 | while(1) { } //endlosschleife um programm nicht zu beenden |
35 | |
36 | |
37 | return 0; //Rückgabewert an das Betriebssystem (wird nie erreicht wegen while Schleife) |
38 | }
|
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.