hallo, ich möchte einen signal für 889us erzeugen, das mit 36khz pulsiert. dieses 36khz sollen nur zur verfügung stehen, wenn ich ein bit über die ir-diode sende, 1bit besteht aus 2x 889us (ir-code). mfg pebisoft
Ja, schön... Und was ist jetzt deine Frage oder dein Problem??? Gruß Elektrikser
Jetzt kann sein dass ich mich um den faktor 2 verhaue... Timer compare register auf 111 (8MHz/36kHz/2) prescaler=1. 36 mal in jedem SIG_OUTPUT_COMPAREx interrupt den ausgang toggeln (36mal an, 36 mal aus, natuerlich abwechselnd) und dann 36+36 mal aus lassen, bzw. 72 mal auslaseen und dann toggeln, je nachdem ob du 1 oder 0 codieren willst. Muesste auch mit PWM gehen, habu nur im moment keine idee wie man die einzelnen bits codieren sollte. Ohne gewehr, ich bin pazifist :) Werner
hallo, haben es geschafft. kann jetzt mit dem avr16 8mhz mit diesem programm alle 14 bits senden im rc5-code. keine einzige fehlermeldung. klasse. die irdiode geht bei mir vom pinb0 (kann beliebig sein) über einen 100ohm widerstand an +5volt.der code kann mit dem rc5-programm aus diesem forum empfangen werden. der code: #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_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 PORTB=0; //IR-LED abschalten ms_89(); // warte 89ms } int main(void) { IR_LED_DDR|=(1<<IR_LED_PIN); uint8_t command,i; command=32; for (i = 14; i < command; i++) { send_code(1,7,i); // toggle, addresse, commando } }
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.