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 } } mfg pebisoft
@pebisoft Dann ist aber die Batterie deiner selbstgebauten Fernbedienung schnell leer ;) Wenn A) "...die irdiode geht bei mir vom pinb0 (kann beliebig sein) über einen 100ohm widerstand an +5volt..." und B) #define IR_LED_ON IR_LED_PORT |= (1<<IR_LED_PIN) #define IR_LED_OFF IR_LED_PORT &= ~(1<<IR_LED_PIN) dann ist die LED nach einem "IR_LED_OFF;" immer unter Strom. Das würde ich nicht aushalten - IMMER unter strom ;)
du sollst keine kritik üben, sondern einen konkreten vorschlag machen, damit es nicht so ist. monatenlang ward ihr zu dusselig einen sender zu programmieren und jetzt kommen die parasieten. mfg pebisoft
Na? Wie schreibt man Parasit? Wenn du deine LED auf einer Seite an 5V hängst und im Ruhezustand den AVR-Pin auf 0V legst, dann "leuchtet" sie ständig. Wenn du nicht von selbst drauf kommst, wie man das ändert, dann tut es mir leid.
@pebisoft ÄÄÄÄÄ "...konkreten vorschlag machen..."? Wenn Du <bold>*DAS*</bold> nicht zustandebringst ... Zudem was das nicht als Kritik gedacht, sondern als Hinweis auf eine Sache die offensichtlich übersehen worden ist!
@pebisoft "du sollst keine kritik üben," Uih, ganz böses Foul ! Dafür gibts nur eine einzige Lösung: stell Deinen Sch... nicht in ein Forum. Ein Forum ist ja gerade dazu da, um Kritik zu üben. Und gerade dieses Forum gefällt mir gut, weil es hier Sitte ist, einen mit der Nase auf den Fehler zu stoßen, ohne ihm die Lösung vorzukauen. Wenn Du nur als Gott angebetet werden willst, dann bist Du hier falsch. "monatenlang ward ihr zu dusselig einen sender zu programmieren" Uih, 2. ganz böses Foul ! Wer hat Dir denn hier versprochen, für Dich einen Sender zu programmieren ??? Niemand !!! Ich wüßte also nicht, was daran "dusselig" sein soll, eine Aufgabe nicht zu lösen, die man garnicht hat. Peter P.S.: Es kann auch nichts schaden, zu überlegen, wozu wohl der Dateianhang gedacht ist.
Hallo, trifft sich ja, daß hier ein Quellcode in C da ist. Brauch ich grad für meine Propeller Uhr um die DCF Zeit über IR zu übertragen :) Was ist denn die Lösung für das IR-Problem hier ? Die IR-LED auf der einen Seite an Masse hängen und mit dem AVR die Leitung auf High (sende) oder Low (aus) legen ? Nur damit ich nicht ganz dumm sterbe und es hier wieder zum Ursprungsthema zurückgeht. Peter
Naja die IR Diode würde ich jetzt nicht anders herum ansteuern, weil Microcontroller im allgemeinen als Open Collector ausgeführt werden. Soll heißen wenn Strom fließt sollter der Pin auf "null" sein. Die einfachste Lösung ist wohl in die Funktion "void send_code" als letzte Zeile noch "IR_LED_OFF;" ein zu fügen. Eventuell das gleich noch einmal Am Anfang bei einer Initialisierung. Gruß Aurel
Leute !! damit ihr nich dumm sterbt, #define IR_LED_ON IR_LED_PORT |= (1<<IR_LED_PIN) #define IR_LED_OFF IR_LED_PORT &= ~(1<<IR_LED_PIN) IR_LED_ON setzt Ausgang auf High Pegel,er hat aber die LED nach Vcc geschaltet, erdo IR_LED_ON schaltet die LED aus und IR_LED_OFF schaltet die LED an, weil ja dann der Ausgang auf Low geht und somit Strom fließt. Na, was wäre jetzt die cleverste Lösung ? Bevor auch das noch gefragt wird, einfach die #defines vertrauschen und hoffen das der Rest des Codes wirklich bipolare Manchastercodierung unterstützt. Also: #define IR_LED_OFF IR_LED_PORT |= (1<<IR_LED_PIN) #define IR_LED_ON IR_LED_PORT &= ~(1<<IR_LED_PIN) Gruß hagen
Hallo Hagen, danke für deine Sorge um mein Ableben aber an der Stelle habe ich schon vorgesorgt :-) Mit der ON/OFF Geschichte hast du völlig recht aber leider ist die Batterie immer noch leer. 1. Nach einem Reset sind die Ausgänge low d.h. die Diode brennt bis zum ersten Sendeeinsatz. --> Abhilfe: Bei der Initialisierung ein IR_LED_OFF; nach deiner Änderung. 2. Fast am Ende steht "PORTB=0; //IR-LED abschalten". Das muss natürlich auch gegen IR_LED_OFF; ersetzt werden oder PORTB=1; heißen. Gruß Aurel
@pebisoft Dein Code ist ja ganz nett, nur was mache ich bei einer anderen Quarzfrequenz. Dann geht das suchen (und rechnen) los, welche Schleifen geändert werden müssen, um die Zeiten zu bekommen. Du solltest das nochmal überarbeiten, am besten so, daß nur am Anfang ein paar #defines geändert werden müssen. Ansonsten komm mal runter von deinem hohen Ross, Peter hat eigentlich schon alles dazu gesagt. MfG Jens
Ungetestet und ohne Garantie // Timing Werte aus ASM-Listing ermittelt. Referenzfrequenz ist 8 MHz (8.0e6 Hz) // F_CPU im Makefile definiert. #define DELAY_89ms (uint32_t)(88997.875*(F_CPU/8.0e6)+0.499) #define DELAY_HALFBIT (uint16_t)(1184.019*(F_CPU/8.0e6)+0.499) #define DELAY_36kHz (uint8_t)(21.4*(F_CPU/8.0e6)+0.499) oder als Anhang der komplett überarbeitete und kommentierte (noch ungetestete) Code. P.S: Ich bin immernoch am überlegen wie ich's mit PWM mache :)
Kann nicht mal einer eine Maschine erfinden die diesem Bill G. automatisch eine knallt sobald wieder so ein Sch... passiert? rc5_send.szipfile in .zip umbenennen :)
kann mir einer erklären was es mit dem togglebit bei rc5_send_code auf sich hat? Und wie sende ich jetzt einen speziellen Code, bzw. gebe ich das an? ist das dezimal oder hex? Ich will zB Taste 7 von Code 030 Sanyo senden, geht das dann so: ? rc5_send_code(??siehe oben, 30, 7); Hoffe es kann mir noch wer helfen. mfg chris
Bist du dir sicher, dass Sanyo RC5 verwendet? Zum testen am besten IRMP aufbauen ;-) Das kann auch senden (IRSND) und ist besser dokumentiert.
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.