Probleme mit externem Interrupt
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);
}