Hallo Leute,
Habe mich mal versucht an einer kleinen IR Fernbedienung. Mal wieder komme ich nicht weiter und bin auf eure Hilfe angewiesen.
Mein Problem ist jetzt einfach das auf Modulieren der 36kHz. Meine Zeitbasis für die "0" & "1" stehen bereits.
Wie baue ich jetzt den Träger mit ein? Mir fehlen die ansätze wie ich genau vorgehen muss. Habe es mit einem "delay" versucht (wollte ich so auch nicht lassen) aber das funktioniert auch nicht wirklich, ich denke mal das mein Ablauf nicht stimmt.
CodeBox C
Würde mich mal wieder über eure Hilfe freuen.
Habe mich mal versucht an einer kleinen IR Fernbedienung. Mal wieder komme ich nicht weiter und bin auf eure Hilfe angewiesen.
Mein Problem ist jetzt einfach das auf Modulieren der 36kHz. Meine Zeitbasis für die "0" & "1" stehen bereits.
Wie baue ich jetzt den Träger mit ein? Mir fehlen die ansätze wie ich genau vorgehen muss. Habe es mit einem "delay" versucht (wollte ich so auch nicht lassen) aber das funktioniert auch nicht wirklich, ich denke mal das mein Ablauf nicht stimmt.
CodeBox C
/* * Send_RC5.c * * Created: 24.06.2015 16:58:52 * Author: Jan */ #define F_CPU 16000000 #define RC5_HALF_BIT_TIME 8 // 8 * 110µs = 880µs #define RC5_SEND_ON PORTD |= (1<<PD1) #define RC5_SEND_OFF PORTD &= ~(1<<PD1) #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdbool.h> void rc5_send_command(uint16_t command); void rc5_send_one(void); void rc5_send_zero(void); void delay_880(void); void rc5_modulation(void); volatile static uint8_t rc5_half_bit_cnt, rc5_state; volatile uint16_t modulation = 0x00; uint16_t rc5_byte = 0x00; int main(void) { DDRB |= (1<<PB7); DDRD |= (1<<PD1); TCCR0A = (1<<WGM01); // CTC TCCR0B = (1<<CS01); // 8 ( ca. 110µs @ 16 MHz ) TCCR1B = (1<<CS10); // 1 ( ca. 36 kHz @ 16 MHz ) TCCR1B |= (1<<WGM12); // CTC TIMSK0 = (1<<OCIE0A); // OutputCompare0A TIMSK1 = (1<<OCIE1A); // OutputCompare1A OCR0A = (0xDB); OCR1A = (0x00DD); sei(); while(1) { rc5_send_command(0b11000000001100); _delay_ms(100); //rc5_send_command(0b011111111111110); } } /* send a 14 bit command to the IR - Receiver */ void rc5_send_command(uint16_t command) { uint16_t send_byte = command; for (uint16_t x = 0 ; x < 14 ; x++) { if (send_byte & 0x8000) { rc5_send_one(); } else { rc5_send_zero(); } send_byte <<= 0x0001; } } /* send a logical one to the Receiver ( 1 --> 0 ) */ void rc5_send_one(void) { rc5_state |= (0x80); RC5_SEND_ON; delay_880(); rc5_state &= ~(0x80); RC5_SEND_OFF; delay_880(); } /* send a logical zero to the Receiver ( 0 --> 1 ) */ void rc5_send_zero(void) { RC5_SEND_OFF; delay_880(); RC5_SEND_ON; delay_880(); } void delay_880(void) { while(1) { if ((rc5_state & 0x01) == 0x01) { rc5_half_bit_cnt = 0x00; rc5_state &= ~(0x01); break; } } } void rc5_modulation(void) { RC5_SEND_ON; _delay_us(3); RC5_SEND_OFF; _delay_us(3); } /* called every 110 µs */ ISR(TIMER0_COMPA_vect) { rc5_half_bit_cnt++; if (rc5_half_bit_cnt >= RC5_HALF_BIT_TIME) { rc5_half_bit_cnt = 0x00; rc5_state |= 0x01; } } /* called every 1,3 µs */ ISR(TIMER1_COMPA_vect) { }
Würde mich mal wieder über eure Hilfe freuen.
Zuletzt bearbeitet: