/* * IR-Receiver.c * * Created: 16.09.2021 10:26:59 * Author : Simon Mederer */ #define F_CPU 16000000UL #include #include #include #include #include #include uint16_t addr_EEM EEMEM; //testdata uint8_t addresse [16] = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}; uint8_t key[32] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1}; typedef struct { bool receiving; bool done; uint16_t addr; uint32_t data; } IRrec_; IRrec_ IRrec = {false, false, 0, 0}; volatile uint16_t counter = 0; volatile uint16_t cntOne = 0; volatile uint16_t segC = 48; //Header: 3437us (HIGH) + 1641us (LOW) //"1": 455us (HIGH) + 1197us (LOW) //"0": 455us (HIGH) + 345us (LOW) void newRec( ) { //Grundgedanke: /* segC speichert die Bit-Nr, die aktuell gelesen wird. wenn segC == 48, beginnt ein neuer Code counter speichert die Zeit, die seit der letztn steigenden Flanke vergangen ist counter wird um 1 erhöht, wenn die in ISR(timer0_ovf) festgelegte Zeit vergangen ist hier: (256-31) * 62.5ns * 64 * counter = Zeit Es wird entschieden, ob entweder 0 oder 1 Bei 1: Schreiben an Bit, das in segC gespeichert ist - Bit 0 - 15 in Adresse - Bit 16 - 47 in Data */ uint32_t temp = 0; cli(); if(segC == 48){ //wenn die letzte steigende Flanke 43*120 = 5160us her ist //->Startbit if(counter >= 43) { counter = 0; IRrec.addr = 0; IRrec.data = 0; segC = 0; IRrec.done = false; } } else { //Max time für ein Bit ist vorüber -> Stop if(counter >= 15){ segC = 48; IRrec.receiving = false; } //mehr als 900us sind vergangen-> "1" else if(counter >= 8 && counter < 15) { //1 temp = 1; counter = 0; } if(segC >= 0 && segC < 16){ //temp = addresse[segC]; temp = temp << (15-segC); IRrec.addr |= temp; } else if(segC >= 16 && segC < 48) { //temp = key[segC-16]; temp = temp << (31 - (segC-16)); IRrec.data |= temp; } else { IRrec.receiving = false; IRrec.done = true; } segC++; } } ISR(INT0_vect) { if(IRrec.receiving == false){ IRrec.receiving = true; return; } newRec(); sei(); } //Overflow each 120us ISR(TIMER0_OVF_vect) { TCNT0 = 225; if(IRrec.receiving == true) counter++; //if(counter == 20){ // IRrec.en = false; //} } int main( ) { DDRB |= (1<