hallo muraad, dino dieter usw.
es ist vollbracht !
durch ausdauer und nicht aufgeben hat man das ziel erreicht.
ich kann jetzt unter winavr-c ganz sauber rc5-code (14bit) senden ohne interrupt.
es tritt über haupt kein übertragungsfehler auf, klasse.
die 36khz werden nur zur zeit des gesetzten bits erzeugt also nur immer 890us lang.
dank eurer hilfe ist es endlich gelungen.
wie man sieht ist das programm nicht kompliziert. und ist für jeden anfänger nachvollziebar.
hallo muraad, du kannst dieses programm auch wieder bekannt machen.
es läuft bei mir mit dem AVR16 und 8mhz.
ir-diode von portb0 über 10kohm nach 5volt.
der port kann beliebig gewählt werden.
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include <stdint.h>
//89ms pause
void ms_89(void)
{
uint32_t zaehler;
for (zaehler=0; zaehler<118666; zaehler++)
asm volatile("nop");
}
//Eine 0 senden
void SendBit0(void)
{
uint16_t i,zaehler;
//890us Impuls mit 36kHz senden
//Bei 28us Periodendauer ergibt das 32 Impulse
for(i=0; i<32; i++)
{
PORTB=1;
for (zaehler=0; zaehler<18; zaehler++) // ~14us
asm volatile("nop");
PORTB=0;
for (zaehler=0; zaehler<18; zaehler++) // ~14us
asm volatile("nop");
}
//890us Pause
for (zaehler=0; zaehler<1186; zaehler++)
asm volatile("nop");
}
//Eine 1 senden
void SendBit1(void)
{
uint16_t i,zaehler;
//890us Pause
for (zaehler=0; zaehler<1186; zaehler++)
asm volatile("nop");
//890us Impuls mit 36kHz senden
for(i=0; i<32; i++)
{
PORTB=1;
for (zaehler=0; zaehler<18; zaehler++)
asm volatile("nop");
PORTB=0;
for (zaehler=0; zaehler<18; zaehler++)
asm volatile("nop");
}
}
int main(void)
{
DDRB=1; // Portb1 = ausgang
while (1)
{
SendBit1(); //Erstes Startbit=1
SendBit1(); //Zweites Startbit=1
SendBit0(); //Togglebit
//5 Bit Gerätecode
SendBit0();
SendBit1();
SendBit0();
SendBit1();
SendBit1();
//6 Bit Kommandocode
SendBit1();
SendBit1();
SendBit1();
SendBit1();
SendBit1();
SendBit1();
//Übertragung komplett
PORTB=0; //IR-LED abschalten
ms_89(); // warte 89ms
}
}
mfg pebisoft
Lesezeichen