Infrarotsender als Fernschalter
(EN google-translate)
(PL google-translate)
Genaue Besprechung: s. Vorlesung.
Die Empfängerseite wertet das digitale Signal des IR-Empfängerbausteins aus und schaltet damit die erste grüne LED:
#include <avr/io.h> int main(void) { DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRA |= 0b00000011; //PA0 und PA1 als Ausgang konfigurieren PORTA &= 0b11111100; //PA0 und PA1 auf Masse ziehen. //Empfängerseite für Schaltkonzept über Infrarot. //Wenn der Ausgang des TSOP31230 auf Masse geht, muß lediglich eine //LED eingeschaltet werden und andernfalls aus. //Der Ausgang des TSOP31230 liegt bei PD0 (RXD / Pin14) an. DDRD &= 0b11111110; while(1) { if((PIND & 0b00000001)==0) { PORTA |= 0b00000010; //PA1 auf 1 setzen } else { PORTA &= 0b11111101; //PA1 auf 0 setzen } } }
Code 0-1: Quelltext 01b_schalten_empfaenger.
Auf der Senderseite werden die Infrarot-LEDs mit 30kHz getaktet. Hierzu werden drei Möglichkeiten getestet: Modus 4, 10 und 14 des Timers 1 (vergl. Datenblatt und Vorlesung).
#define TAKTFREQUENZ 1000000 #include <avr/io.h> int main(void) { long pause; //Konfigurieren des Senders: //IR-Diode muß mit 30kHz getriggert werden. //Dazu: Timer1 in Modus 12: (kein PWM-Mode) //CTC, Einstellung der Zählgrenze mit ICR1: //Ausgänge toggeln //(vergl. Datenblatt) //Vorteilung für 30kHz bei 1000000 Systemtakt: //foc = 1000000/(2*N*Q)=30000 //Q=1000000/(30000*2*N), N=1, so ergibt sich Q=16,6666... ungefähr 17 //N=Vorteilung //Q=Zählgrenze in ICR1 TCCR1A = (0<<COM1A1) | (1<<COM1A0) | (0<<COM1B1) | (1<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); ICR1 = 16; DDRD |= 0b00100000; //PD5 als Ausgang schalten, PD1 in Ruhe lassen. //Gegenpol PD1 der IR-Diode als Ausgang setzen und auf Masse ziehen: DDRD |= 0b00000010; PORTD &= 0b11111101; while(1) { for(pause=0;pause<10000;pause++) DDRA=0; PORTD |= 0b00000010; //IR ausschalten for(pause=0;pause<10000;pause++) DDRA=0; PORTD &= 0b11111101; //IR einschalten } }
Code 0-2: Quelltext 01a_schalten_sender - Sender mit Modus 4.
#include <avr/io.h> int main(void) { long pause; DDRD |= 0b00100000; //PD5 als Ausgang schalten, PD1 in Ruhe lassen. //Gegenpol PD1 der IR-Diode als Ausgang setzen und auf Masse ziehen: DDRD |= 0b00000010; PORTD &= 0b11111101; ICR1 = 17; //für 1MHz //Modus 10, Phasenkorrekt mit ICR1 als Einstellung. TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (0<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); OCR1A = 8; //PWM-Breite auf 50% setzen. while(1) { for(pause=0;pause<10000;pause++) DDRA=0; OCR1A = 8; //PWM-Breite auf 50% setzen. for(pause=0;pause<10000;pause++) DDRA=0; OCR1A = 0; //PWM-Breite auf 0% setzen. } }
Code 0-3: Quelltext 01a_schalten_sender2 - Sender mit Modus 10.
#include <avr/io.h> int main(void) { long pause; DDRD |= 0b00100000; //PD5 als Ausgang schalten, PD1 in Ruhe lassen. //Gegenpol PD1 der IR-Diode als Ausgang setzen und auf Masse ziehen: DDRD |= 0b00000010; PORTD &= 0b11111101; ICR1 = 33; //für 1MHz //Modus 14, Fast PWM mit ICR1 als Einstellung. TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (0<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); OCR1A = 16; //PWM-Breite auf 50% setzen. while(1) { for(pause=0;pause<10000;pause++) DDRA=0; OCR1A = 16; //PWM-Breite auf 50% setzen. for(pause=0;pause<10000;pause++) DDRA=0; OCR1A = 0; //PWM-Breite auf 0% setzen. } }
Code 0-4: Quelltext 01a_schalten_sender3 - Sender mit Modus 14.