Ich hab den Code jetzt nochmal grundlegend geändert.
Was mir nie aufgefallen ist. Bei rc5 dauert ein Bit zu senden 1778us, in der Mitte entscheidet sich ob 1 oder 0. Bei 1 muss in der Mitte der Zeit ein wechsel von high auf low sein, bei 0 ein wechsel von low auf high.
D.h. man muss auch mit einbeziehen was das letzte Bit war(0 oder 1) und damit der aktuelle Signalpegel.
Ich hab jetzt ne neue Funktion, mit deinen for() Schleifen, die das alles macht.
Code:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include <stdint.h>
uint16_t zaehler;
uint32_t zaehler1;
#define PWM_PORT DDRD
#define PWM_BIT PD5
void us_889(void)
{
for (zaehler=0; zaehler<1185; zaehler++)
asm volatile("nop");
}
void ms_89(void)
{
for (zaehler1=0; zaehler1<117105; zaehler1++)
asm volatile("nop");
}
void rc5_init(void) {
//36kHz Träger
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);
OCR1A = 111;
ICR1 = 222;
}
void rc5_send(uint16_t code) // Nur die ersten 14Bits zählen die obersten 2 werden ignoriert
{
uint8_t i,X;
// Prüfen ob das erste Bit low oder high ist um zu wissen wie man anfängt
if(code&(1<<0)); // Ist erstes Bit high
{
i=1; // letztes Bits war high
PWM_PORT|= (1<<PWM_BIT); //wenn ja, PWM 36kHz Signal auf high
us_889(); // halbe Bitzeit warten
PWM_PORT&= ~(1<<PWM_BIT); // PWM 36kHz Signal auf low
us_889(); // zweite halbe Bitzeit
}
else
{
i=0;
us_889(); // halbe Bitzeit warten
PWM_PORT|= (1<<PWM_BIT);
us_889(); // zweite halbe Bitzeit
}
// Sendet die letzten 13Bits und prüft wie das letzte Bit war
for(X=1;X<=13;X++)
{
if((i=1)&&(code&(1<<X)) // letztes Bit war high und nächstes ist high
{
PWM_PORT|= (1<<PWM_BIT); // high
us_889();
PWM_PORT&= ~(1<<PWM_BIT);
us_889();
}
else if((i=1)&&(!(code&(1<<X)))) // letztes high und nächstes low
{
i=0;
us_889();
PWM_PORT|= (1<<PWM_BIT);
us_889();
}
else if((i=0)&&(code&(1<<X))) // letzes low, nächstes high
{
i=1;
us_889();
PWM_PORT&= ~(1<<PWM_BIT);
us_889();
}
else if((i=0)&&(code&(1<<X))) // letzes low, nächstes low
{
PWM_PORT&= ~(1<<PWM_BIT);
us_889();
PWM_PORT|= (1<<PWM_BIT);
us_889();
}
else
asm volatile ("nop"); // zu else sollte es nie kommen
}
ms_89(); // Pause falls gleich noch etwas gesendet wird
}
int main(void)
{
ir_init_send();
rc5_send(0b0000110001001111); // Sendet das was du in deinem Code senden wolltest
}
Ach und was das beim Asuro mit dem USART Pins zu tun hat weis ich auch nicht. Auf jedenfall wird das nicht das rc5 Protokoll sein denk ich.
Viele grüße Muraad
Lesezeichen