//#include #include #include #include #define MODE_RUN 1 #define MODE_STOP 0 #undef TASTERTEST //#define TASTERTEST int global_led_zustand = 0; int volatile sekunden = 0; int volatile cnt_200_ms = 0; int volatile mode = MODE_STOP; // wird von taste in mode run gebracht int volatile schon_mal_gedrueckt = 0; int volatile taste = 0; void init(void) { // initialisierung DDRA = 0xff; DDRB = 0x00; DDRC = 0x00; DDRD = 0x00; /* alle Pins von Port D als Eingang */ PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */ TCCR0 = 0x05; //b00000101 TCNT0 = 0x00; // zaehlt von hier ab bis zu 0xff TIMSK = 0x01; // TOIE0 MCUCR = 0x02; // The falling edge of INT0 generates an interrupt request. GICR = 0x40; TCCR2 = 0x05; // dient zur entprellung der tasten TIMSK |= 0x40; //toie2 } void led_toggle(void) { if(global_led_zustand == 0) { global_led_zustand = 1; PORTA = 0xFF; } else { global_led_zustand = 0; PORTA = 0x00; } } void led_off(void) { #ifdef TASTERTEST ; #else PORTA = 0xFF; #endif } void led_on(void) { #ifdef TASTERTEST ; #else PORTA = 0x00; #endif } int get_time(void) //aktuelle systemzeit { return sekunden; } int get_diff_to_time(int time) { return sekunden - time; //achtung ueberlauf nicht abgefanden } int main(void) { int an_time = get_time(); int drehschalter_stellung = 0; //[10, 20, 30,...] dient zum vergleich, ob veraendert int led_status = 1; init(); /*vgl. asm branch init*/ led_off(); sei(); //Main loop while(1) { if(!(PIND & (1<= 3) { led_off(); an_time = get_time(); led_status = 0; } } else if(led_status == 0) { if(get_diff_to_time(an_time) >= drehschalter_stellung) { led_on(); an_time = get_time(); led_status = 1; } } } else { led_off(); } } return 0; /* never reached */ } ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */ { /* Interrupt Code */ cnt_200_ms++; TCNT0 = 0x40; if(cnt_200_ms == 5) { sekunden++; cnt_200_ms=0; } } ISR(INT0_vect) { if(mode == MODE_RUN) mode = MODE_STOP; else mode = MODE_RUN; /* Interrupt Code */ //led_toggle(); } ISR(TIMER2_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */ { /* Interrupt Code */ TCNT2 = 0x00; if(!(PIND & (1<