/* * HalloweenaugenServo_II.c * * Created: 02.01.2024 16:42:32 * Author : xxx */ #define F_CPU 9600000 //CPU auf 9,6MHz #include #include #include #include //Augen-Zeitvariablen: volatile uint8_t zeitAugenFst=0; volatile uint8_t zeitAugenEinsSek=0; volatile uint8_t zeitAugenZweiSek=0; volatile uint8_t zeitAugenDreiSek=0; volatile uint8_t zeitAugenVierSek=0; //Servo-Code: volatile uint8_t phase=0; volatile uint8_t ZeitZaehlerServo=0; volatile uint8_t servoZyklus=0; // Timer ist übergelaufen (alle 0,213ms (=256*0,000833ms)), neue Phase beginnt (?? Irgendwie fehlt hier noch der Faktor 10x um auf 17ms zu kommen?!) // Jede 8. Phase (~17,1ms) wird PB0=1 gesetzt und dann bei Erreichen des Vergleichswertes (OCR0A in der Main-Schleife löst "ISR(TIM0_COMPA_vect)" aus),s.u., wieder auf 0 gesetzt ISR(TIM0_OVF_vect) { // Servo nur in Phase 0 ansteuern if (phase==0) { PORTB |=(1< 0,97Sek) zeitAugenFst = zeitAugenFst+1; } phase = phase+1; // Nächste Phase 1... 2...8 => 0 if (phase > 8) { phase=0; } } // Timer hat Vergleichswert erreicht ISR(TIM0_COMPA_vect) { PORTB &= ~(1<~ 1 - 2 ms) } //Zufallszahlen für Zeitwerte volatile uint8_t laufZeit=0; //Zur Info: Max-Werte für Zeit: 245 (x+10<256), Anzahl: 50 //Ablage erfolgt im Flash-Speicher, um RAM zu sparen //const uint8_t zeitWerteSekundaer[50] PROGMEM = {52, 99, 167, 3, 55, 22, 119, 27, 153, 85, 22, 10, 103, 48, 24, 124, 11, 7, 57, 120, 47, 77, 138, 79, 20, 116, 52, 5, 191, 8, 153, 26, 72, 64, 18, 185, 30, 12, 3, 129, 112, 17, 197, 89, 15, 107, 2, 61, 164, 79}; //const uint8_t zeitWerteSekundaer[50] PROGMEM = {68, 9, 133, 14, 99, 104, 96, 93, 7, 123, 141, 39, 32, 29, 131, 6, 30, 148, 41, 122, 77, 43, 103, 5, 42, 81, 146, 24, 38, 82, 52, 136, 89, 118, 48, 71, 87, 69, 8, 61, 106, 73, 153, 109, 40, 147, 50, 10, 63, 121}; const uint8_t zeitWerteSekundaer[50] PROGMEM = {1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2}; uint8_t zufallsZeitWert(); int main(void) { //DDRB = 0x1f; // Eingänge: Reset PB5; Ausgänge: PB0-PB4 (0: Servo; 1-4: LED-Augen 1-4) //PORTB |= (1< Fast PWM TCCR0B=0; //Loesche Timer Counter Controll Register B TCCR0B |= (1<Prescaler 8 //TCCR0B |= (1<Prescaler 256 // Erlaube Interrupts //Timer/Counter Interrupt Mask Register: TIMSK0=0; TIMSK0 |= (1<59){ //Sekundentaktgeber //Sekunden-Taktgeber zurücksetzen zeitAugenFst = 0; //59 entspricht ca. 1 Sek. (0,97s) //Auge 1: zweite Zeitvariable prüfen (Anzahl an Sekunden) if (zeitAugenEinsSek>10) { zeitAugenEinsSek--; //Sekundären Zeitzähler reduzieren } else { //Wenn beide Zeitvariablen abgelaufen sind: //wenn Auge an, dann ausschalten if (PINB & (1<10) { //Sekundären Zeitzähler reduzieren zeitAugenZweiSek--; } else { //Wenn beide Zeitvariablen abgelaufen sind: //wenn Auge an, dann aus schalten if (PINB & (1<10) { zeitAugenDreiSek--; //Sekundären Zeitzähler reduzieren } else { //Wenn beide Zeitvariablen abgelaufen sind: //wenn Auge an, dann ausschalten if (PINB & (1<10) { zeitAugenVierSek--; //Sekundären Zeitzähler reduzieren } else { //Wenn beide Zeitvariablen abgelaufen sind: //wenn Auge an, dann ausschalten if (PINB & (1<58 && ZeitZaehlerServo<116) { // Servo nach rechts fahren OCR0A = 254; } if (ZeitZaehlerServo>115) //Ein links-rechts-Zyklus durchlaufen { //Sekundenzähler zurücksetzen ZeitZaehlerServo=0; servoZyklus=servoZyklus+1; } } } //while (1) return 0; } uint8_t zufallsZeitWert(){ //gibt Zufallswert für Zeit zurück if (laufZeit>49){laufZeit=0;} laufZeit++; return pgm_read_byte (zeitWerteSekundaer[laufZeit-1]); //Zugriff & Rückgabe von Wert aus dem im Flash abgelegten Array }