hallo dino dieter, hier ist eine änderung,
setzen von bit0 und bit1 wurde zusammengefasst.
halbbit-routinen wurden geschaffen.
es kann der ganze code gesendet werden "send_code(toggle,addresse,commando)".
läuft auf dem AVR16 8mhz 100%.
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");
}
void halbbit_high(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++)
asm volatile("nop");
PORTB=0;
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)
{
DDRB=1;
uint8_t command,i;
command=37;
for (i = 14; i < command; i++)
{
send_code(1,27,i); // toggle, addresse, commando
}
}
wer andere programmvorschläge für die erleichterung hat kann diese noch reinbringen.
Lesezeichen