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:
Code:
TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
OCR2 = 208; // 36kHz @15MHz
TIMSK |= (1 << OCIE2);
Zwei Halbwellen mit 72kHz, (15000000/72000)-1 sind ca. 208
Und eine angepasste ISR bei der PA3 mit 72kHz getoggelt wird:
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;
}
}
Zusammen sollte das dann ungefähr so funktionieren:
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;
}
}
Kontrolle mit Digicam, ich kann es natürlich nicht selbst testen. Ein asuro oder RP6 müßte das Signal auch erkennen.
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
Lesezeichen