- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 11 bis 20 von 23

Thema: Erfahrungen und Erfahrungsaustausch mit Arexx Robot-Arm-mini

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @Ralf:
    Ok, ich würde den RC5-Code in die Lib in die ISR(TIMER2_COMP_vect), also in den 100us Interrupt einklinken.
    Beispiel:
    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
    // ----------------------------------------------------------------------------
    Dazu müßte man im Header der Lib die Variablen definieren:
    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)
    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.
    Als Eingangspin habe ich PD7 genommen.
    Geändert von Dirk (27.03.2011 um 12:29 Uhr)
    Gruß
    Dirk

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress