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.