/* Beeps Fuses LHE C2 DD FF Von da kommen wir: + -------o------------------------------. | | ATtiny85 | _____|______ | | Vcc | | .-------------------| PB5/Reset | | | .-------------| PB2 PB1|---. === | | .-------| PB3 | #< Lautsprecher | o o o o-| PB4 PB0|---' | | | | | |____________| | o o o o GND| | | | | | | GND -----o----o-----o-----o-----o-------' Mute Start 0 0 Beep3 0 1 Beep2 1 0 Beep3 1 1 Beep1 Mute = lo --> Reset --> Stille Einfachste Lösung: einen zweiten Tiny85 für diese codierten Signale am selben Lautsprecher --> nach Toanausgabe müssen bei beiden Tiny85 die Ausgänge PB0+PB1 hochohmig geschaltet werden --> das nachfolgende Programm ist für den Tiny85_R(echts) + -------o-----------------------------o----------------------------. | | Tiny85_L |Tiny85_R | ____|______ _____|____ | .->Mute | Vcc | | Vcc | Mute>-. | o-------------------|PB5/Reset | | PB5|--------' | | .-------------|PB2 PB1|---o-----------|PB1 PB2|--------<< Signal === | | .-------|PB3 | #< | PB3| | o o o o-|PB4 PB0|---o-----------| PB4| | | | | | |___________| Lautsprecher |__________| | o o o o GND| | | | | | | | | GND -----o----o-----o-----o-----o-------o----------------------------o----------------- Mute Start 0 0 Beep3 0 1 Beep2 1 0 Beep3 1 1 Beep1 Signal an Tiny85_R PB2 --> Tastenton wenn ca. 100ms low Stundenton wenn ca. 200ms low Alarm wenn ca. 250ms low ==> Low-Zeit Ursache Wirkung <100us Störung nichts tun 100us..<150ms Tastenton Beep4 150ms..<230ms Stundenton Beep5 230ms..1s Alarmton Beep6 */ #include #define F_CPU 8000000L #include void Beep4(void) { // Ton: Frequenz 1k9Hz Dauer 200ms for(int i=0; i<380; i++) { PORTB = 0b11101; _delay_us(263); PORTB = 0b11110; _delay_us(263); } } void Beep5(void) { // Ton: Frequenz 1k9Hz Dauer 400ms for(int i=0; i<760; i++) { PORTB = 0b11101; _delay_us(263); PORTB = 0b11110; _delay_us(263); } } void Beep6(void) { // irgendwas völlig anderes // Ton: Frequenz 2k5Hz Dauer 400ms for(int i=0; i<1000; i++) { PORTB = 0b11101; _delay_us(200); PORTB = 0b11110; _delay_us(200); } } int main(void) { unsigned int cnt50us = 0; PORTB = 0b11100; // PB2..4 Eingang mit Pullup, PB1,0 = Lautsprecher Gegentakt DDRB = 0b00011; while(1) { _delay_ms(10); // zur "Entprellung" kurz warten while ((PINB&0b00100)==0b00100) {} // warten, solange PB2 = hi cnt50us = 0; // Zähler zurücksetzen while ((PINB&0b00100)!=0b00100) { // solange PB2 = low if (cnt50us < 20000) cnt50us++; // mitzählen, wie lange PB2 = lo, Zähler bei 200000*50us = 1s begrenzen _delay_us(50); } DDRB = 0b00011; // zur Tonausgabe: Ausgänge aktivieren !!!!!!!!!! muss ins Programm für den Tiny85_L ebenfalls eingefügt werden !!!!!!!!!!!!! if (cnt50us < 2) ; // weniger als 10x10us = 100us low --> Störung, nichts tun else if (cnt50us < 3000) Beep4(); // mindestens 100us, aber weniger als 150ms low else if (cnt50us < 4600) Beep5(); // mindestens 150ms, aber weniger als 230ms low else Beep6(); // länger als 230ms low PORTB = 0b11100; // Gegentaktausgänge abschalten DDRB = 0b00000; // Pins auf "Eingang, hochohmig" schalten !!!!!!!!!! muss ins Programm für den Tiny85_L ebenfalls eingefügt werden !!!!!!!!!!!!! } }