Hallo
Die fehlende Kommunikation nervt mich auch. Ich bin auch dran mit dem asuro-IR-Transceiver zu experimentieren, aber es klappt noch nicht wirklich:
Code:
// Nibobee IR-Kommunikation mit den LineLEDs. 15.11.09 mic
// Die #defines in der iodefs_nibobee.h sind mir zu umständlich ;)
#define LineLEDs_on PORTB &=~(1<<PB4)
#define LineLEDs_off PORTB |= (1<<PB4)
#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
#include <nibobee/sens.h>
void IRwriteChar(uint8_t zeichen)
{
uint8_t i, temp=0;
// oje :(
for(i=0; i<8; i++) if(zeichen & (1<<(7-i))) temp&=~(1<<i); else temp|=(1<<i);
UCSRB |= (1<<TXEN);
UCSRA=1<<TXC; // TXC-Flag löschen falls gesetzt
UDR = temp; // Zeichen ins Senderegister des UARTs
while (!(UCSRA & (1<<TXC))) // Solange das Schieberegister nicht leer ist,
{
}
UCSRA=1<<TXC; // TXC-Flag setzen bedeutet löschen!!!
UCSRB &= ~(1<<TXEN);
}
int main(void) {
uint8_t c;
led_init(); // IO-Ports der LEDs als Ausgänge konfigurieren
sens_init(); // und Fühler aktivieren
#define BAUD_2400 2400 //IR speed - 2400 Baud
//#define UBRR_BAUD_2400 (((15000000/16)/BAUD_2400)-1)
#define UBRR_BAUD_2400 390
UBRRH = UBRR_BAUD_2400 >> 8; // Baudrate auf 2400 setzen
UBRRL = (uint8_t) UBRR_BAUD_2400;
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
OCR2 = 208; // 36kHz @15MHz
TIMSK |= (1 << OCIE2);
DDRB |= (1<<PB4); // LineLED ist ein Ausgang
LineLEDs_on; // LineLED schaltet gegen GND!
DDRD |= 2; // TXD Ausgang und low
PORTD &= ~2;
sei();
led_set(LED_L_YE, 1);
while(!sens_getLeft() && !sens_getRight());
led_set(LED_L_YE, 0);
while(1)
{
c=65;
IRwriteChar(c); // Zeichen in Sendepuffer schreiben
delay(200);
}
return 0;
}
// Die ISR erzeugt die 36kHz-Trägerfrequenz und "lauscht" gleichzeitig am TXD-Pin
// um die seriellen Daten auf die Trägerfrequenz zu mischen. Die IR-Leds sind immer
// an wenn nicht gesendet wird.
ISR (TIMER2_COMP_vect)
{
static uint8_t status=0;
if(status)
{
if(PIND & 2) led_set(LED_R_YE, 1); else led_set(LED_R_YE, 0);
if(PIND & 2) LineLEDs_off; else LineLEDs_on;
status=0;
}
else
{
led_set(LED_R_YE, 0);
LineLEDs_on;
status=1;
}
}
Das delay-Problem habe ich auch gefixt: Die Funktion heißt delay(), im Linienprogramm wir _delay_ms() verwendet.
Frohes Weitertesten
mic
Lesezeichen