kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Zaehler
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
..7.4 Cloud
8 OOP
..8.1 Ansatz
..8.2 Uebung
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zufallsgenerator
..9.3 Sensoren
..9.4 Musterloesung
10 Cloud
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

7.1 Infrarotsender als Fernschalter


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 7.1-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 7.1-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 7.1-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 7.1-4: Quelltext 01a_schalten_sender3 - Sender mit Modus 14.