Nochmal hallo

Weil mich das Thema "asuro als Fernbedienung" selbst auch sehr interessiert habe ich mal eine Art Grundgerüst gebastelt:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>

#define  OFF    0
#define  ON     1

volatile unsigned char count72kHz;

/* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */
void Sleep(unsigned char time72kHz)
{
   count72kHz = 0;
   while (count72kHz < time72kHz);
}
/* function to read out switches */
unsigned char PollSwitch (void)
{
   unsigned int i;

   DDRD |= (1 << PD3);            // Switches as Output
   PORTD |= (1 << PD3);                  // Output HIGH for measurement
   ADMUX = (1 << REFS0) | (1 << MUX2);   // AVCC reference with external capacitor
   Sleep(10);

   ADCSRA |= (1 << ADSC);         // Start conversion
   while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
   ADCSRA |= (1 << ADIF);         // clear ADCIF
   i = ADCL + (ADCH << 8);

   PORTD &= (1 << PD3);

   //return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
   return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
}
/* function for serial communication */
void SerWrite(unsigned char *data,unsigned char length)
{
   unsigned char i = 0;
   UCSRB = 0x08; // enable transmitter
   while (length > 0) {
      if (UCSRA & 0x20) { // wait for empty transmit buffer
         UDR = data[i++];
         length --;
      }
   }
   while (!(UCSRA & 0x40));
   for (i = 0; i < 0xFE; i++)
      for(length = 0; length < 0xFE; length++);
}
// aus: https://www.roboternetz.de/phpBB2/ze...=328394#328394
void PrintChar(unsigned int x)
{
   char ergebnis[5]  = {'0','0','0','0','0'};
   while (x >=10000) { ergebnis[0]++; x -=10000; }
   while (x >= 1000) { ergebnis[1]++; x -= 1000; }
   while (x >=  100) { ergebnis[2]++; x -=  100; }
   while (x >=   10) { ergebnis[3]++; x -=   10; }
   ergebnis[4] +=x;
   SerWrite(ergebnis,5);
}
/* Front LED */
inline void FrontLED(unsigned char status)
{
   PORTD = (PORTD &~(1 << PD6)) | (status << PD6);
}
/* Status LED (OFF,GREEN,YELLOW,RED)*/
inline void StatusLED(unsigned char color)
{
#define GREEN   1
#define RED      2
#define YELLOW  3
#define GREEN_LED   (1 << PB0)
#define RED_LED     (1 << PD2)
#define GREEN_LED_ON  PORTB |=  GREEN_LED
#define GREEN_LED_OFF PORTB &= ~GREEN_LED
#define RED_LED_ON    PORTD |=  RED_LED
#define RED_LED_OFF   PORTD &= ~RED_LED
   if (color == OFF)    {GREEN_LED_OFF; RED_LED_OFF;}
   if (color == GREEN)  {GREEN_LED_ON; RED_LED_OFF;}
   if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
   if (color == RED)    {GREEN_LED_OFF; RED_LED_ON;}
}
void Msleep(int dauer)
{
   int z;
   for(z=0;z<dauer;z++) Sleep(72);
}
int main(void)
{
   //-------- seriell interface programmed in boot routine and already running -------
   //  prepare 36kHz for IR - Communication
   TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
   OCR2  = 0x6E; // 36kHz @8MHz
   TIMSK |= (1 << OCIE2); // 36kHz counter for sleep

   // prepare RS232
   UCSRA = 0x00;
   UCSRB = 0x00;
   UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
   UBRRL = 0xCF; // 2400bps @ 8.00MHz

   // I/O Ports
   DDRB = (1<<PB3) | (1<<PB0); // OC2 und GreenLED auf Ausgang
   DDRD = (1<<PD6) | (1<<PD2) | (1<<PD1); // FrontLED, RedLED und TXD auf Ausgang

   sei();
   FrontLED(ON);

   while(1)
   {
      StatusLED(RED);
      SerWrite("Hallo\r\n", 7);
      PrintChar(12345);
      SerWrite("\n\r", 2);
      PrintChar(PollSwitch());
      SerWrite("\n\n\r", 3);
      StatusLED(YELLOW);
      Msleep(500);
   }
   return(0);
}
/* uses timer2 (36kHz for IR communication */
/* counts falling and rising edge => 36kHz*2 = 72kHz */
SIGNAL (SIG_OUTPUT_COMPARE2)
{
   count72kHz ++;
}
In diesem 803Bytes (14 Pages) großen Programm habe ich die wichtigsten Funktionen aus der asuro-Library zusammenkopiert:

72kHz-Timer mit OCR
USART
Tasten
einige LEDs

Jetzt fehlt nur noch der RC5-Teil in der ISR. Das kann ja nimmer schwer sein. Beteiligung anderer asuro-Spezialisten erwünscht :)

Gruß

mic