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