die irdiode geht bei mir vom pinb0 (kann beliebig sein) über
einen 100ohm widerstand an +5volt.
ist ein testaufbau und kann jederzeit verbessert werden.
damit kann ich meinen fernseher steuern.
..avr16/8 mhz...habe ich genommen.
Code:#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include <stdint.h>
#define IR_LED_PORT PORTB
#define IR_LED_PIN PB0
#define IR_LED_DDR DDRB
#define IR_LED_ON IR_LED_PORT |= (1<<IR_LED_PIN)
#define IR_LED_OFF IR_LED_PORT &= ~(1<<IR_LED_PIN)
//89ms pause
void ms_89(void)
{
uint32_t zaehler;
for (zaehler=0; zaehler<118666; zaehler++)
asm volatile("nop");
}
void halbbit_high(void)
{
uint8_t i,zaehler;
//890us Impuls mit 36kHz senden
//Bei 28us Periodendauer ergibt das 32 Impulse
for(i=0; i<32; i++)
{
IR_LED_ON;
for (zaehler=0; zaehler<18; zaehler++)
asm volatile("nop");
IR_LED_OFF;
for (zaehler=0; zaehler<18; zaehler++)
asm volatile("nop");
}
}
void halbbit_low(void)
{
uint16_t zaehler;
//890us Pause
for (zaehler=0; zaehler<1186; zaehler++)
asm volatile("nop");
}
//Eine 0 oder 1 senden
void Send_Bit(uint8_t code)
{
if (code==0)
{
halbbit_high();
halbbit_low();
}
else
{
halbbit_low();
halbbit_high();
}
}
void send_code(uint8_t toggle, uint8_t address, uint8_t command)
{
uint8_t mask,i;
Send_Bit(1); //Erstes Startbit=1
Send_Bit(1); //Zweites Startbit=1
//Togglebit
if(toggle==0)
{
Send_Bit(0);
}
else
{
Send_Bit(1);
}
//5 Bit Addresscode
mask=0x10; //Beginn bei MSB
for(i=0; i<5; i++)
{
if(address&mask) //Send 1
{
Send_Bit(1);
}
else //Send 0
{
Send_Bit(0);
}
mask>>=1; //Nächstes Bit
}
//6 Bit Kommandocode
mask=0x20; //Beginn bei MSB
for(i=0; i<6; i++)
{
if(command&mask) //Send 1
{
Send_Bit(1);
}
else //Send 0
{
Send_Bit(0);
}
mask>>=1; //Nächstes Bit
}
//Übertragung komplett
PORTB=0; //IR-LED abschalten
ms_89(); // warte 89ms
}
int main(void)
{
IR_LED_DDR|=(1<<IR_LED_PIN);
uint8_t command,i;
command=32;
for (i = 14; i < command; i++)
{
send_code(1,7,i); // toggle, addresse, commando
}
}