// Interrupt Routine für THRO an INT0: Bremslicht, Rückfahrlicht und Blaulichtmodus ISR(INT0_vect) { ////////////////////////////////////////////////////////////////////// ////////// Impuls wird kürzer als 1,5 ms: Hebel runter /////////// ////////////////////////////////////////////////////////////////////// _delay_us(1490); // Prüfe ob Impuls <1,5 ms lang ist: Ist Hebel nach unten ausgelenkt? if( !(PIND & (1 << PD2)) ) { // Ja, Hebel ist nach unten ausgelenkt! // Wurde Rueckfahrt schon detektiert? if( rueckfahrt_ja == 0 ) { // Nein! // Bremslicht aus und Rückfahrlicht an PORTD &= ~(1 << PD5); PORTD |= (1 << PD6); // Rueckfahrt wurde detektiert rueckfahrt_ja = 1; } } else { // Nein, Hebel ist nicht nach unten ausgelenkt! // Wurde "Nicht-Rueckfahrt" detektiert? if( rueckfahrt_ja == 1 ) { // Nein! // Bremslicht an und Rückfahrlicht aus PORTD |= (1 << PD5); PORTD &= ~(1 << PD6); // "Nicht-Rueckfahrt" wurde detektiert rueckfahrt_ja = 0; } } ////////////////////////////////////////////////////////////////////// ////////// Impuls wird länger als 1,5 ms: Hebel hoch ///////////// ////////////////////////////////////////////////////////////////////// _delay_us(60); // Prüfe ob Impuls >1,5 ms lang ist: Ist Hebel nach oben ausgelenkt? if( PIND & (1 << PD2) ) { // Ja, Hebel ist nach oben ausgelenkt! // Wurde Vorfahrt schon detektiert? if( vorfahrt_ja == 0 ) { // Nein! // Bremslicht aus PORTD &= ~(1 << PD5); // Vorfahrt wurde detektiert vorfahrt_ja = 1; } } else { // Nein, Hebel ist nicht nach oben ausgelenkt! // Wurde "Nicht-Vorfahrt" schon detektiert? if( vorfahrt_ja ==1 ) { // Nein! // Bremslicht an PORTD |= (1 << PD5); // "Nicht-Vorfahrt" wurde detektiert vorfahrt_ja = 0; } } } // Interrupt Routine für ELEV an INT1: Blaulicht und Warnblinker ISR(INT1_vect) { ////////////////////////////////////////////////////////////////////// ////////// Impuls wird kürzer als 1,5 ms: Hebel runter /////////// ////////////////////////////////////////////////////////////////////// _delay_us(1200); // Prüfe ob Impuls <1,5 ms lang ist: Ist Hebel ganz unten? if( !(PIND & (1 << PD3)) ) { // Ja Hebel ist ganz unten! // Muss der Hebel erst in Mittelstellung? if ( elev_down_reset_needed == 0) { // Nein, also Schalten! if( warnblinker_an == 0 ) warnblinker_an = 1; else warnblinker_an = 0; // Hebel muss anschließend in Mittelstellung elev_down_reset_needed = 1; } } // Hebel nicht ganz ausgelengt, sprich reset gilt else elev_down_reset_needed = 0; ////////////////////////////////////////////////////////////////////// ////////// Impuls wird länger als 1,5 ms: Hebel hoch ///////////// ////////////////////////////////////////////////////////////////////// _delay_us(600); // Prüfe, ob Imuls >1,5 ms lang ist: Hebel ganz oben? if( (PIND & (1 << PD3)) ) { // Ja Hebel ist ganz oben! // Muss der Hebel erst in Mittelstellung? if ( elev_up_reset_needed == 0) { // Nein, also Schalten! if( blaulicht_an==0) blaulicht_an = 1; else blaulicht_an = 0; // Hebel muss anschließend in Mittelstellung elev_up_reset_needed = 1; } } // Hebel nicht ganz ausgelengt, sprich reset gilt else elev_up_reset_needed = 0; }