hallo muraad, dieses demo sendet 2 zahlen (10,20), es soll ja gemäss aussage 8 zahlen senden können. wie kann man es ändern, das es ein byte (8bit) sendet die man dann empfnagen kann. er hat dort 2x timecount in einem bereich von-bis abgefragt. wie weit geht eigentlich die von-bis abfrage wenn ich z.b. 8 byte abfragen kann und wie könnte man das nutzen für 8 bit.
mfg pebisoft
Code:
/* IR-Routine:
Es werden unterschiedlich lange Impulse gesendet und vom Empfänger ausgewertet.
Exemplarisch werden 10 verschiedene Längen implementiert, wovon jeder dann als
Befehl betrachtet werden kann. Dies ist zunächst die trivialste Variante, reicht
aber für einfach Fernsteuerungen aus.
Variation von pulse: 10 ... 20 ... 30 ...... 100*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <lcd.c>
//#define send
#define receive
#ifdef send
volatile unsigned char empty = 0;
volatile unsigned char pulse = 0;
SIGNAL (SIG_OVERFLOW0) {
if (pulse) {
DDRB |= (1<<PB1);
empty = 1;
pulse--;
}
if (!pulse) {
empty = 0;
DDRB &= ~(1<<PB1);
}
}
void ir_init_send (void) {
//36kHz Träger
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);
OCR1A = 111;
ICR1 = 222;
//Timer-Interrupt alle 2,048ms zur Signalerzeugung --> 1/(8MHz/256/64)
TCCR0 = (1<<CS01) | (1<<CS00); //Prescaler von 64
TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt aktivieren
}
void ir_send (unsigned char byte) {
//Senderoutine
if (!empty)
pulse = byte;
}
#endif
#ifdef receive
volatile unsigned short timecount = 0;
volatile unsigned char empty = 0;
volatile unsigned char rec_byte = 0;
SIGNAL (SIG_OVERFLOW0) {
//-----<allgemein>-------
if (!(PINB & (1<<PB0))) { //Low-Pegel = log. 1 am Sender
timecount++;
empty = 1;
}
else {
empty = 0;
}
if ((!empty) && (timecount)) {
//-----<Auswertung>------ //8fache Abtastung
if ((timecount > 70) && (timecount < 90)) { //pulse war 10
rec_byte = 10;
}
if ((timecount > 150) && (timecount < 170)) { //pulse war 20
rec_byte = 20;
}
timecount = 0;
}
}
void ir_init_receive (void) {
//Abtastung realisieren
//Timer-Interrupt alle 0,256ms zum Signalempfang --> 1/(8MHz/256/8)
TCCR0 |= (1<<CS01); //Prescaler von 8
TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt aktivieren
lcd_init (LCD_DISP_ON);
}
unsigned char ir_receive (void) {
//Empfangsroutine
return rec_byte;
}
#endif
int main (void) {
#ifdef send
ir_init_send ();
DDRC &= ~(1<<PC5);
#endif
#ifdef receive
ir_init_receive ();
#endif
sei ();
for (;;) {
#ifdef send
if (!(PINC & (1<<PC5))) {
delay (65000); //Entprellung
ir_send (10);
}
if (!(PINC & (1<<PC4))) {
delay (65000); //Entprellung
ir_send (20);
}
#endif
#ifdef receive
if (rec_byte) {
lcd_gotoxy (0,0);
if (rec_byte == 10)
lcd_puts ("10");
if (rec_byte == 20)
lcd_puts ("20");
}
#endif
}
return 0;
}
Lesezeichen