@Ralf:
Ok, ich würde den RC5-Code in die Lib in die ISR(TIMER2_COMP_vect), also in den 100us Interrupt einklinken.
Beispiel:
Dazu müßte man im Header der Lib die Variablen definieren:Code:// Dies VOR die ISR: volatile RC5data_t RC5_newdata; // Decoded RC5 data // Dies hier IN die ISR (ans Ende!): // ---------------------------------------------------------------------------- // RC5 reception code (adapted for Robot Arm from Asuro Lib): #define F_ISR 10e3 // 10kHz (100µs) #define RC5_TIME 1.778e-3 // 1.778ms #define RC5_SAMPLES_PER_BIT_MIN (uint8_t)(F_ISR * RC5_TIME * 0.4) #define RC5_SAMPLES_PER_BIT_EARLY (uint8_t)(F_ISR * RC5_TIME * 0.75) #define RC5_SAMPLES_PER_BIT_LATE (uint8_t)(F_ISR * RC5_TIME * 1.25) #define RC5_PAUSE_SAMPLES 250 // 25ms (RC5 pause: 88.889ms) static uint8_t RC5_lastsample = 0; // Last read sample static uint8_t RC5_timecounter = 0; // Bit time counter static uint16_t RC5_bitstream = 0; // RC5 bit stream static uint8_t RC5_bitcounter = 0; // RC5 bit counter uint8_t sample = 1; if(PIND & RESERVE_PD7) // Read RC5 input (PD7) sample = 0; if(RC5_timecounter < 255) // Time counter limited to 8 bit RC5_timecounter++; if(RC5_lastsample != sample) { // Detect edges if(RC5_timecounter <= RC5_SAMPLES_PER_BIT_MIN) RC5_bitcounter = 0; // Edge to early else { if(RC5_bitcounter == 0) { // RC5 start bit if((sample == 1) && (RC5_timecounter > RC5_PAUSE_SAMPLES)) { RC5_bitstream = 1; // Store start bit RC5_bitcounter++; } else RC5_bitstream = 0; // To long pause: Error RC5_timecounter = 0; // Reset bit time counter } else { // RC5 bits 2..14: if(RC5_timecounter >= RC5_SAMPLES_PER_BIT_EARLY) { if(RC5_timecounter <= RC5_SAMPLES_PER_BIT_LATE) { RC5_bitstream = (RC5_bitstream << 1) | sample; RC5_bitcounter++; } else RC5_bitcounter = 0; // To late: Error RC5_timecounter = 0; // Reset bit time counter } } } } else { if(RC5_timecounter > RC5_SAMPLES_PER_BIT_LATE) { // No edge in bit? if(RC5_bitcounter == 14) { // All 14 RC5 bits read? RC5_newdata.data = RC5_bitstream; RC5_Ready = 1; // New data received! } RC5_bitcounter = 0; // Reset RC5 bit counter } } RC5_lastsample = sample; // Store sample in sample buffer // ----------------------------------------------------------------------------
Probier das mal! Wenn RC5_Ready true (1) wird, wurden Daten in RC5_newdata empfangen. Das Hauptprogramm müßte also RC5_Ready ständig pollen (z.B. in einer task_RC5 in der Hauptschleife). Nachdem die Daten aus RC5_newdata gelesen wurden, muss man noch RC5_Ready false setzen, damit die nächsten Daten empfangen werden können.Code:typedef union { uint16_t data; // RC5 data structure (14 bits): struct { unsigned key_code : 6; // RC5 key code C0..C5 unsigned device : 5; // RC5 device address A0..A4 unsigned toggle_bit : 1; // RC5 toggle bit F unsigned key_codeC6 : 1; // RC5 key code bit 6 !(C6) unsigned start_bit : 1; // RC5 start bit 1 unsigned notused : 2; }; } RC5data_t; // RC5data_t RC5_data; // Received RC5 data volatile uint8_t RC5_Ready; // RC5 data ready (true/false)
Als Eingangspin habe ich PD7 genommen.







Zitieren

Lesezeichen