
/*
Üblicher Telegrammaufbau:
Die zeitliche Dauer jedes gesendeten Bits beträgt 1,778 ms, 
die 14 Bits eines Rahmens benötigen 24,889 ms zur Übertragung. 
Der Datenrahmen wird bei gedrückter Taste alle 113,778 ms wiederholt.


Repeater:
  - Warte auf Trägersignal
  - Empfang für 30ms in FiFo. Abtastung des Eingangssignals mit Trägerfrequenz.
  - Fifo senden  (dauert 30ms), dabei Empfang ignorieren

  - ergibt notwendige Speichertiefe von 1080 Bit (135 Bytes) bei 36KHz
  
  - in 128 Bytes bekommt man 28ms. Sollte reichen.
  
  TINY25 mit 8MHz int. RC
  Empfänger an PB1
  SendeDiode an PB0
  36KHz Timer T0  
  

#define F_CPU 8000000UL  /* CPU clock in Hertz */

#include <inttypes.h>
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>


#define RX_HIGH (PINB & 2)
#define LED_EIN (PORTB=1)
#define LED_AUS (PORTB=0)

#define U8 unsigned char
#define FIFO_LEN 128

static U8 fifo[FIFO_LEN];

int main(void){
  register U8 index;    
  register U8 ebit=1;
  register U8 ebyte=0;    
  
  
  DDRB = 1;
  PORTB=0;    
  TCCR0A = (1<<WGM01); //CTC
  TCCR0B = (1<<CS00);   //1:1, 8MHz
  OCR0A = 221;
  TIFR |= (1<<OCF0A); //Clear OCF0A
  
  while(1){
    while (RX_HIGH){
      LED_AUS;
    }
    TCNT0 = 0;
    TIFR |= (1<<OCF0A); //Clear OCF0A
    //Auslesen des Empfängersignals mit 36KHz (alle 27,7us)
    index=0;
    ebyte=0;
    ebit=1;
    do{
      if (!RX_HIGH) ebyte|=ebit; //Ich sah Licht!
      ebit<<=1;  
      //ebit &=0xff; <--Bei Datentyp U8 nicht nötig!
      if (!ebit){
        ebit=1;
        fifo[index++] = ebyte;
        ebyte=0;
      }      
      while ( !(TIFR & (1<<OCF0A)) ) //Warte, bis 27,7us rum
        ;
      TIFR |= (1<<OCF0A); //Clear OCF0A
    }while (index<FIFO_LEN);

    //Speicherinhalt wieder ausgeben
    ebit=1;  
    index=0;
    TIFR |= (1<<OCF0A); //Clear OCF0A
    do{
      while ( !(TIFR & (1<<OCF0A)) ) //Warte, bis 27,7us rum
        ;
      TIFR |= (1<<OCF0A); //Clear OCF0A
      if (fifo[index] & ebit){
        LED_EIN;
      }
      _delay_us(13);
      LED_AUS;
      ebit<<=1;  
      //ebit &=0xff;
      if (!ebit){
        ebit=1;
        index++;
      }      
    }while (index<FIFO_LEN);
  }   
}
//EOF
