Hallo Pebisoft
In dem Code oben, stehen doch alle Lösungen.
Der Code läßt doch eine LED mit ungefähr 36 KHz leuchten für ca 889 µs. Danach 889µ aus.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 } }
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







Zitieren

Lesezeichen