Gast
#1710149
Hallo nochmal... Hänge wieder einmal an einer Aufgabe und weiß nicht genau wie ich sie realisieren kann. Und zwar soll ich eine LED 30sec zum leuchten bringen wenn ein taster gedrückt wurde! Wird dieser in der Zeit nochmal gedrückt sollte der Timer neu beginnen. Soll ich das mit Interrupts realisieren? Ich hab es mit einer for-Schleife probiert und das 30sec leuchten schon hinbekommen. Jetzt wollte ich sie mit break abbrechen, aber das funktioniert irengdwie nicht. mache ich was falsch oder ist der ansatz schon schief? int main(void) { initDisplay(); SET_BIT(DDRB, DDB2); SET_BIT(PORTB, PB2); // Licht zu Beginn AUS! while(1) { SwitchQuery(); // Tastenabfrage if(Taste_4) { Taste_4 = 0; CLR_BIT(PORTB, PB2); // Licht dauerhaft an! } if(Taste_x) { Taste_x = 0; CLR_BIT(PORTB, PB2); SwitchQuery(); for (i=0; i<ON_TIME; i++) // 30sec Licht an! { if (Taste_x) { break; } _delay_ms(100); } SET_BIT(PORTB, PB2); // Licht an! } } } void SwitchQuery() { // Umschaltung Port C, Bit 0..3 auf Eingang CLR_BIT(PORTD, ENABLE); // Enable-Signal auf 0 DDRC = DDRC & 0xF0; // Port C auf Eingabe schalten PORTC = 0x0F; // Pullup-Rs eingeschaltet _delay_us(10); // Wartezeit Umstellung Hardware-Signal // Einlesen der 3 Tastensignale sw1 = (PINC & (1 << PC0)); // aktuelle Werte der Tasten 1-4 lesen sw2 = (PINC & (1 << PC1)); sw3 = (PINC & (1 << PC2)); sw4 = (PINC & (1 << PC3)); // Auswertung der 3 Tasten if (((sw1==0)|(sw2==0)|(sw3==0 // falls Taster 1-3 und NICHT Taster 4 gedrückt ist { Taste_x = 1; // Taste_x setzen (Licht an) } if (sw4==0) // falls Taster 1-3 UND Taster 4 gedrückt ist { Taste_4 = 1; // Taste_4 setzen (Licht aus) } DDRC = DDRC | 0x0F; // PortC wieder auf Ausgang } Wär cool wenn ihr mir da helfen könntet! gruß xASP