PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Header zum senden von RC5 Code



Grillmeister Markus
09.03.2008, 14:07
Hallo zusammen,
ich habe hier mal ein header gemacht, das das senden von RC5 deutlich vereinfacht. Ich poste jetzt einfach mal das header und einen Beispiel-Code (nach dem drücken auf den Taster (an PD3) wird der RC5-Command "25" gesendet), zusammen mit dieser (http://www.sprut.de/electronic/ir/rc5.htm) URL sollte es sich eigentlich von selbst erklären.
Bisher habe ich den Code nur an einem 2313 ausprobiert, läuft mit 8mhz und 3.6864 mhz einwandtfrei. Die wartezeiten (865us sollten laut obiger Website eigentlich 889us sein) habe ich per oszi abgestimmt. Als Vorlage zur Abstimmung diente der "sendrc5"-Command in Bascom.

Zur Beschaltung:
Die IR-LED hängt über einen passenden Vorwiderstand mit der Kathode an PD2 und mit der Anode an +5V.

Das header:

#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>


void bit1(void)
{
DDRD |= (1<<PD2); // PD2 als Ausgang

PORTD |= (1<<PD2); // PD2 auf 1
_delay_us(865); // Zustand für das erste Halbbit beibehalten

for (uint8_t i=0; i<32; i++) // Zustand für das zweite Halbbit (36khz-Frequenz)
{
PORTD &= ~(1<<PD2); // PD2 auf 0
_delay_us(13.8);
PORTD |= (1<<PD2); // PD2 auf 1
_delay_us(13.8);
}
}


void bit0(void)
{
DDRD |= (1<<PD2); // PD2 als Ausgang

for (uint8_t i=0; i<32; i++)
{
PORTD &= ~(1<<PD2); // PD2 auf 0
_delay_us(13.8);
PORTD |= (1<<PD2); // PD2 auf 1
_delay_us(13.8);
}

PORTD |= (1<<PD2); // PD2 auf 1
_delay_us(865);
}

Beispiel zur anwendung:

#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <util/RC5.h>

void io_init(void)
{
DDRD |= (1<<PD2); // PD2 auf Ausgang
DDRD &= ~(1<<PD3); // PD3 auf Eingang für Taster
PORTD |= (1<<PD2); // PD2 auf 1
PORTD |= (1<<PD3); // PD3 Pullup für Taster
}


void main(void)
{
io_init();

while(1)
{

if ( !(PIND & (1<<PIND3)))
{
_delay_ms(200); // Taster entprellen

// Startbits
bit1();
bit1();
// Togglebit
bit0();
// Addressbits
bit0();
bit0();
bit0();
bit0();
bit0();
// Commandobits
bit0();
bit1();
bit1();
bit0();
bit0();
bit1();

PORTD |= (1<<PD3); // PD3 Pullup für Taster
}
}

}

Vielleicht hat ja auch jemand Lust, das Ganze so zusammenzufassen, dass man im hauptprogramm nur noch einen Befehl hat (z.B. "send_RC5(<Address>; <Togbit>; <Command>);") und das header-File den Rest erledigt.

mfg Markus