Hi ich wollte fragen ob der Code so funktionieren könnte. Hab leider kein Oszi da. Wenn der Timer läuft wird im 76 KHz Takt ein Pin getoggelt als Trägerfrequenz. Die Senderoutinen schalten dann den Timer ein oder aus um ein Bit zu senden. #include "main.h" uint8_t on=0x00; uint16_t testbefehl = 0xAAAA; void InitPorts(void){ } //76KHz Timer void InitTimer0(void){ TCCR0=0x00; TCNT0=0x2e; //TCCR0=0x01; } INTERRUPT (SIG_OVERFLOW0){ TCNT0=0x2e; PORTC^=PORTC&(1<<5); } void InitDevice(void){ cli(); InitPorts(); InitTimer0(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x01; sei(); } void IRSend(uint16_t* befehl){ for(int i=0;i<14;i++){ Manchester((uint8_t)((*befehl>>i)&0x01)); } for(int i=0;i<50;i++){ Delay_us(1778); } TCCR0=0x00; PORTC&=~(1<<5); } void Manchester(uint8_t onebit){ switch(onebit){ case 0x00: TCCR0=0x01; Delay_us(889); TCCR0=0x00; Delay_us(889); break; case 0x01: TCCR0=0x00; Delay_us(889); TCCR0=0x01; Delay_us(889); break; } } void main(void){ IRSend(&testbefehl); }
habe mal als versuch diesen rc5-sendecode geschrieben. ist hier und da noch verbesserungswürdig, aber er funktioniert auf einem avr 8mhz. ohne timer. es wird im test die zahl 1-14 gesendet, das toggle und das commando. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <string.h> #include <stdint.h> #define IR_LED_PORT PORTB #define IR_LED_PIN PB0 #define IR_LED_PIN_1 PB1 #define IR_LED_DDR DDRB #define IR_LED_ON IR_LED_PORT |= (1<<IR_LED_PIN) #define IR_LED_OFF IR_LED_PORT &= ~(1<<IR_LED_PIN) //89ms pause void ms_89(void) { uint32_t zaehler; for (zaehler=0; zaehler<118666; zaehler++) asm volatile("nop"); } void halbbit_high(void) { uint8_t i,zaehler; //890us Impuls mit 36kHz senden //Bei 28us Periodendauer ergibt das 32 Impulse for(i=0; i<32; i++) { IR_LED_ON; for (zaehler=0; zaehler<18; zaehler++) asm volatile("nop"); IR_LED_OFF; 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 ms_89(); // warte 89ms } int main(void) { IR_LED_DDR|=(1<<IR_LED_PIN_1); IR_LED_DDR|=(1<<IR_LED_PIN); IR_LED_PORT|=(1<<IR_LED_PIN_1); uint8_t command,i; command=32; for (i = 14; i < command; i++) { send_code(1,7,i); // toggle, addresse, commando } IR_LED_PORT &= ~(1<<IR_LED_PIN_1); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.