Hallo Pebisoft
In dem Code oben, stehen doch alle Lösungen.
Code:
for(i=0; i<32; i++)
{
PORTA &= ~(1<< LED_PIN); //oder welcher port auch immer (LED an)
//Hier eine Zeitschleife rein, die ca 13 µs verbrät
PORTA |= (1<< LED_PIN); //oder welcher port auch immer (LED aus)
//Hier eine Zeitschleife rein, die ca 13 µs verbrät
}
//890us Pause
for(i=0; i<32; i++)
{
//Hier eine Zeitschleife rein, die ca 27 µs verbrät
}
}
Der Code läßt doch eine LED mit ungefähr 36 KHz leuchten für ca 889 µs. Danach 889µ aus.
Hier mal ein Teil von meinem Code damals. Wie gesagt für einen Tiny mit 1,2 MHz. Mußte halt die Variablen in Register halten.
Code:
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
void licht_aus (void);
void licht_an (void);
void send_0 (void);
void send_1 (void);
void daten (void);
#define led 1
//Funktion zum senden einer 0 +++++++++++++++++++++++++++++++++++++++
void send_0 ()
{
licht_an();
licht_aus();
}
//Funktion zum senden einer 1 +++++++++++++++++++++++++++++++++++++++
void send_1 ()
{
licht_aus();
licht_an();
}
//Funktion Licht aus+++++++++++++++++++++++++++++++++++++++++++++++++
void licht_aus (void)
{
register uchar n asm("r2");
for(n=0;n< 146;n++) // 889µs Pause
{ asm volatile (" nop");
asm volatile (" nop");
}
}
//Funktion Licht an++++++++++++++++++++++++++++++++++++++++++++++++++
void licht_an ()
{
register uchar n asm("r2");
for(n=0;n<33;n++)
{
// 13 us Licht an ca 15 Takte
PORTB = 0x01; // LED an
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
// 13 us Licht aus ca 15 Takte
PORTB = 0x00; //LED aus
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
asm volatile (" nop");
}
}
//Funktion Daten senden++++++++++++++++++++++++++++++++++++++++++++++
void daten()
{
//Sendet immer nur zum Test diesen Code
//Adresse = 0
//Command = 1
// 2 Startbits senden
send_1();
send_1();
// Togglebit senden
send_0();
//Adresse senden
send_0();
send_0();
send_0();
send_0();
send_0();
//Comand senden
send_0();
send_0();
send_0();
send_0();
send_0();
send_1();
}
//Einstellen der Hardware des AVR++++++++++++++++++++++++++++++++++++
void init(void)
{
//Ports einstellen
DDRB = 0xff;
TCCR0 = (1<<CS02)| (1<< CS00);
//OSCCAL setzen sonst läuft er nicht sauber mit 1,2 MHZ
//nur bei TINY 12 mit internen Takt notwendig
asm volatile (" ldi 0x18, 0x3e");
asm volatile (" out 0x31, 0x18");
}
//Hauptprogramm++++++++++++++++++++++++++++++++++++++++++++++++++++++
void main (void)
{
init();
DDRB = 0xff;
register uchar d asm("r4");
for(;;)
{
daten();
TCNT0 = 0;
while ( TCNT0 < 36); //kleine Verzögerung
}
}
Die Funktion daten ist nicht so dolle. Der Sender hat jedoch immer nur eine RC5 Befehl gesendet, von daher.
MFG
Dieter
Lesezeichen