Hallo
Bisher war es noch keine Mühe *kicher*
Hier habe ich gezeigt, wie man die 36kHz (ich nehme mal an, dies ist auch die Frequenz deines SFH) auf die LineLEDs bringt:
https://www.roboternetz.de/phpBB2/vi...=470683#470683
Davon brauchst du eigentlich nur das Timersetup:
Zwei Halbwellen mit 72kHz, (15000000/72000)-1 sind ca. 208Code:TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN! OCR2 = 208; // 36kHz @15MHz TIMSK |= (1 << OCIE2);
Und eine angepasste ISR bei der PA3 mit 72kHz getoggelt wird:
Zusammen sollte das dann ungefähr so funktionieren:Code:ISR (TIMER2_COMP_vect) { static uint8_t status=0; if(status) { led_set(LED_R_YE, 1); PORTA |= (1<<PA3); status=0; } else { led_set(LED_R_YE, 0); PORTA &= ~(1<<PA3); status=1; } }
Kontrolle mit Digicam, ich kann es natürlich nicht selbst testen. Ein asuro oder RP6 müßte das Signal auch erkennen.Code:// nibobee IR-LEDs an PA0 und PA1 im Wechsel mit 36kHz ansteuern 10.1.2010 mic // https://www.roboternetz.de/phpBB2/vi...=479870#479870 // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0) // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1) // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden // Der Empfänger SFH5110 ist mit PA2 (X2-AN2) verbunden #include <nibobee/iodefs.h> #include <nibobee/delay.h> #include <nibobee/led.h> #include <stdlib.h> #define FALSE (1==0) #define TRUE (1==1) int main(void) { led_init(); delay(2000); // wait4programmer // Timer2-Setup für 72kHz TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN! OCR2 = 208; // 36kHz @15MHz DDRA |= (1<<PA1) | (1<<PA0); // Anoden der LEDs mit Vorwiderstand (??? Ohm) an PA0/1 PORTA &= ~((1<<PA1) | (1<<PA0)); // low = LEDs aus DDRA &= ~(1<<PA3); // keine 72kHz-Ansteuerung PORTA &= ~(1<<PA3); // deshalb Kathoden-Pin auf Ausgang ohne PullUp if(TRUE) led_set(0,1); // true-Test ;) sei(); // und los while(1) { DDRA |= (1<<PA3); // Trägerfrequenz an Kathoden einschalten TIMSK |= (1 << OCIE2); // ISR aktivieren led_set(2,1); PORTA |= (1<<PA0); // rechte IR-LEDs einschalten delay(1000); // zwei Sekunden mit 36kHz blinken PORTA &= ~(1<<PA0); // IR-Leds wieder ausschalten led_set(2,0); led_set(1,1); PORTA |= (1<<PA1); // dito für linke IR-LEDs delay(1000); PORTA &= ~(1<<PA1); led_set(1,0); TIMSK &= ~(1 << OCIE2); // ISR ausklinken DDRA &= ~(1<<PA3); // keine Trägerfrequenz an Kathoden PORTA &= ~(1<<PA3); // bedeutet alle IR-LEDS aus led_set(LED_R_YE, 0); // Kontroll-LED aus delay(2000); // zwei Sekunden dunkel } } ISR (TIMER2_COMP_vect) { static uint8_t status=0; if(status) { led_set(LED_R_YE, 1); // Kontroll-LED PORTA |= (1<<PA3); status=0; } else { led_set(LED_R_YE, 0); PORTA &= ~(1<<PA3); status=1; } }
Das war jetzt etwas Mühe ;)
btw. ist delay() echter Schrott! Mit dieser ISR könnte man auch die Sleep()-Funktion ala asuro nachbilden.
Gruß
mic







Zitieren

Lesezeichen