Hallo,
2. versuch
die Function init_interrupts wird nicht aufgerufen, also läuft der Timer nicht !
PS:
Und auch mal das Fusebits CKDIV8 anschauen, das ist standardmäsig aktiviert, mit diesem wird der Takt nochmal durch 8 geteilt.
Guten Abend zusammen
Ich programmiere nun schon den ganzen Abend am Timer, doch aus unerklärlichen Gründen funktioniert das ganze nicht. Was ich machen will: Eine LED in (vorerst beliebigen Takt) blinken zu lassen.
Folgende ausgangslage: Atmega168, interne Frequenz (8 Mhz, ausser ich hätte die Fusebits falsch gesetzt, ich glaube aber nicht).
LED an PD2.
Zuerst habe ich versucht, es nach dem Wiki von Roboternetz (und auch noch anderen Tutorials) zu programmiere, da bekam ich aber immer die Meldung vom Compiler, er kenne TCCR nicht.
Also habe ich das Datenblatt zur Hand genommen und gesucht. Da habe ich andere Registernamen gefunden, mit denen funktioniert zwar das Compilieren, aber die LED bleibt auf AN.
Hier noch der Code. Ich nehme an, dass der Interrupt nicht (richtig) startet.Code:#include <avr/interrupt.h> #include <avr/io.h> #define F_CPU 8000000 volatile unsigned int counter0; ISR(SIG_OVERFLOW1) //ISR { counter0++; //counter erhöhen } void init_interrupts(void) //interrupt initialisieren { TCCR1B |= (1<<CS00); //prescaler auf 64 TCCR1B |= (1<<CS01); //prescaler sei(); TIMSK1 |= (1<<TOIE1); //interrupts starten } inline void sleepms(uint16_t msec) { uint16_t i; for(i=0; i<msec; i++) { sleep(100); } } inline void sleep (uint8_t t) { counter0 = 0; while (counter0 < t); } int main(void) { while(1) { DDRD |= (1<<PD2); PORTD |= (1<<PD2); //LED einschalten sleepms(1000); PORTD &= ~(1<<PD2); //LED ausschalten sleepms(1000); return 0; } }
Ach ja, ich arbeite mit avr-gcc (falls es noch andere avr-c-compiler gibt, wüsste ich jetzt gar nicht) und avrdude unter Linux.
Im voraus Danke, falls mir jemand helfen kann...
Gruss Dave
Hallo,
2. versuch
die Function init_interrupts wird nicht aufgerufen, also läuft der Timer nicht !
PS:
Und auch mal das Fusebits CKDIV8 anschauen, das ist standardmäsig aktiviert, mit diesem wird der Takt nochmal durch 8 geteilt.
Zuerst mal danke für die sowohl schnelle wie auch späte Antwort...
Den Clock-Teiler habe ich deaktiviert, das hat auch funktioniert...
Wegen der Warteschleife: Ich habe es mal kurz durchgelesen und werde es nun ausprobieren, aber irgendwo habe ich mal gelesen, man solle das nicht so machen (weiss nicht mehr wieso). Aber im Momment werde ich es wohl doch dabei belassen, so sollte es immerhin funktionieren...
gruss Dave
Guten Morgen nochmals...
So... mitlerweile funktioniert es.
Und nicht, dass ich noch Urheberrechtsprobleme bekomme: der Code ist grösstenteils vom tuxgraphics.orgCode:#include <avr/io.h> //#include <inttypes.h> #define F_CPU 8000000 // 8 MHz #include <util/delay.h> void sleepms(unsigned int ms) /* delay for a minimum of <ms> */ { // we use a calibrated macro. This is more // accurate and not so much compiler dependent // as self made code. while(ms) { _delay_ms(0.96); ms--; } } int main(void) { while(1) { DDRD |= (1<<PD2); PORTD |= (1<<PD2); //LED einschalten sleepms(1500); PORTD &= ~(1<<PD2); //LED ausschalten sleepms(500); } return 0; }
gruss dave
Lesezeichen