Hallo
Nun funktioniert meine IR-Kommunikation auch:
Jetzt muss ich nur noch lernen wie man die USART-Funktionen der nibobee-Lib nutzt ;)Code:// Nibobee IR-Kommunikation mit den LineLEDs. 16.11.09 mic // Das Programm verwendet einen netten Effekt des USART: Bei aktivierten Transmitter // und aktiven Senden kann man im Hintergrund den Pegel des TX-Pins einlesen ;) // Diesen Effekt verwende ich hier um in der ISR des Timer2 die 36kHz-Impulse zu // erzeugen und an den Linien-IR-Leds auszugeben. Terminaleinstellung: 2400,8,none,1 // Das funktioniert im Hintergrund mit allen Ausgaben die mit dem USART gesendet // werden. Ich habe zum Testen drei kleine Funktionen angehängt: // writeChar(char) sendet ein einzelnes Zeichen // writeString(string) sendet einen String // writeInteger(wert, basis) sendet Integerwerte in bin, hex und dec // Das sollte auch mit der Nibobee USART-Lib funktionieren und hätte dann sogar // einen Sendebuffer. Ich weiß nur noch nicht wie man die anwendet :) // 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> #include <stdlib.h> // C standard functions (e.g. itoa...) void writeChar(uint8_t data ); void writeString(char *string); void writeInteger(int16_t number, uint8_t base); int main(void) { uint8_t c; led_init(); // IO-Ports der LEDs als Ausgänge konfigurieren sens_init(); // und Fühler aktivieren #define UBRR_BAUD_2400 390 // Baudrate auf 2400 setzen UBRRH = UBRR_BAUD_2400 >> 8; UBRRL = (uint8_t) UBRR_BAUD_2400; UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1 UCSRB |= (1<<TXEN); // Senden enablen TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN! 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()); // warten auf Taste led_set(LED_L_YE, 0); writeString("\n\rIR-Kommunikation mit nibobee\n\r"); writeString("Empfang über asuro/Yeti-IR-Transceiver\n\r"); writeString("16.11.09 mic\n\n\r"); while(1) { for(c='A'; c<='Z'; c++) writeChar(c); writeChar(10); writeChar(13); for(c='a'; c<='z'; c++) writeChar(c); writeChar(10); writeChar(13); for(c=0; c<16; c++) { writeInteger(c, 10); writeChar('-'); writeInteger(c, 16); writeChar('-'); writeInteger(c, 2); writeString("\n\r"); } writeChar(10); delay(500); } 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. ISR (TIMER2_COMP_vect) { static uint8_t status=0; if(PIND & 2) // Der TSOP invertiert die empfangenen Daten! { led_set(LED_R_YE, 0); // Kontrollanzeige LineLEDs_off; } else { if(status) { led_set(LED_R_YE, 1); LineLEDs_on; status=0; } else { led_set(LED_R_YE, 0); LineLEDs_off; status=1; } } } void writeChar(uint8_t data ) // Code aus ATMega16-Datenblatt { while ( !( UCSRA & (1<<UDRE)) ); UDR = data; } void writeString(char *string) { while(*string) writeChar(*string++); } void writeInteger(int16_t number, uint8_t base) { char buffer[17]; itoa(number, &buffer[0], base); writeString(&buffer[0]); }
Gruß
mic
[Edit]
Timer-Setup ohne OC2-Pin eingefügt







Zitieren
Lesezeichen