Hallo,
wer kann mir sagen warum mein kleines Testprogramm mit der auskommentierten Zeile 53 statt Zeile 54 anders Läuft. (Zeile mit --> <-- markiert)
Was ich eigentlich erreichen wollte:
5 Mal blinken dann in Power Down Sleep Mode gehen. Aufwecken durch Tastendruck/externen Interrupt und alles wieder von vorne.
Irgendwie macht der externe Interrupt nie so genau was ich eigentlich will.
So hier der Code:
Code:#include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <stdint.h> #define TIMER1_END_VALUE 1 #define TIME_TILL_SLEEP 5 uint8_t volatile sleep_count; ISR(TIMER1_COMPA_vect); void init(void); int main(void) { init(); sei(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Sleep Mode setzen while (1) { if(sleep_count == TIME_TILL_SLEEP) { sleep_count = 0; sleep_mode(); //einschlafen } } return 0; } ISR(TIMER1_COMPA_vect) { static uint16_t run_led_active_count = 0; run_led_active_count++; if(run_led_active_count == 900) { PORTD = (1<<PIND3); } if(run_led_active_count >= 1000) { run_led_active_count = 0; sleep_count++; PORTD = 0x00; } } ISR(PCINT_vect) { //Interrupt Mask Register setzen für externen Interrupt //--> GIMSK |= ~(1 << PCIE); <-- GIMSK = 0x00; GIMSK |= (1 << PCIE); PORTD ^= (1 << PD0); } void init() { //Datenrichtung für die Ausgänge DDRD = (1 << DDD0) | (1 << DDD1) | (1 << DDD2) | (1 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6); DDRB = (1 << DDB0); //Setup Timer 1 OCR1A = TIMER1_END_VALUE; //Compare Value TCCR1B = (1<<WGM12); //CTC Mode TIMSK |= (1<<OCIE1A); //Output Compare A Match Interrupt Enable TCCR1B |= (1<<CS12) | (1<<CS10); //Timer1 aktivieren //setup external interrupts PCMSK |= (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT4); GIMSK |= (1 << PCIE); }







Zitieren

Lesezeichen