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 } }







Zitieren

Lesezeichen