Hallo
Die fehlende Kommunikation nervt mich auch. Ich bin auch dran mit dem asuro-IR-Transceiver zu experimentieren, aber es klappt noch nicht wirklich:
Das delay-Problem habe ich auch gefixt: Die Funktion heißt delay(), im Linienprogramm wir _delay_ms() verwendet.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; } }
Frohes Weitertesten
mic







Zitieren

Lesezeichen