- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: RC5 Decoder

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270

    RC5 Decoder

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    nachdem ich vor einiger Zeit schonmal daran gescheitert war, einen RC5-Empfänger zu programmieren, wollte ich das jetzt im Zuge eines anderen Projects nochmal angehen und scheitere leider wieder, mein Coder ist hier:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <math.h>
    #include <inttypes.h>
    #include <compat/deprecated.h>
    
    volatile char s_bit;
    volatile uint8_t addresse;
    volatile uint8_t code;
    volatile char rdy;
    volatile uint16_t gesamt[14];
    
    volatile uint8_t bitnummer = 1;
    volatile char ergebnis[20] = "RC5 fertig!";
    
    void init_rc5()
    {
     MCUCR |= (1<<ISC01) | (1<<ISC00);;  //wait rising edge
     GICR |= (1<<INT0);    //enable INT0
     TCCR0 |= (1<<CS02);   //Prescaler 256
     cbi(DDRD,PD2);
    }
    
    //****************************************************USART******************************
    
    void init_usart(void)
    {
     UBRRL |= 0b01100111;
     UCSRB = (1<<TXEN) | (1<<RXEN);
     UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
    }
    
    void send_char(unsigned char s)
    {
     while (!(UCSRA & (1<<UDRE)));
     UDR = s;
    }
    
    void send_string(char *s)
    {
     while(*s != '\0')
      {
       send_char(*s);
       s++;
      }
    }
    
    //**********************************************************USART-ENDE********************
    
    
    SIGNAL(SIG_INTERRUPT0)
    {
     TIMSK |= (1<<TOIE0);
     char last_bit = 1;
     char test[3];
     uint8_t i;
     if(TCNT0<139 && bitnummer <= 14 && last_bit == 1) {
    	gesamt[bitnummer] = 1;
    	last_bit = 1;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(TCNT0>139 && TCNT0<194 && bitnummer <= 14 && last_bit == 1) {
    	gesamt[bitnummer] = 0;
    	last_bit = 0;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(TCNT0<139 && bitnummer <= 14 && last_bit == 0) {
    	gesamt[bitnummer] = 0;
    	last_bit = 0;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(TCNT0>139 && TCNT0<194 && bitnummer <= 14 && last_bit == 0) {
    	gesamt[bitnummer] = 1;
    	last_bit = 1;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(bitnummer == 14) {
    	gesamt[1] = 1;
    	send_string(ergebnis);
    	last_bit = 1;
    	bitnummer = 1;
    	TIMSK &= ~(1<<TOIE0);
    	TCNT0 = 0;
    	rdy = 1;
    	}
    } 
       
       
    int main(void)
    {
     init_usart();
     init_rc5();
     sei();
     uint8_t i;
     char test[3];
     char wert[10] = "RC5:";
     for(;;)
     {
      if(rdy==1) {
    	send_string(wert);
    	for(i=4;i<=8;i++) {
    		itoa(ergebnis[i],test,10);
    		send_string(test);
    		}
    	rdy = 0;
    	}
    	
     };
    }
    Das Signal vom TSOP ist invertiert, CPU ist ein M8@16Mhz.
    Der Ansatz ist, die erste steigende Flanke zu erkennen und dann jeweils zu schauen, nach welcher Zeit die nächste steigende Flanke kommt, dann weiss ich ja, ob ich HIGH oder LOW bin, wobei natürlich auch das vorherige Bit eine Rolle spielt, deswegen die 4 IF-Abfragen. Wenn mir da jemand weiterhelfen könnte, wäre das super, ich sitze da mittlerweile seit Tagen dran und komme nicht weiter.
    Danke
    Spurius

  2. #2

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    edit......................

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Spurius
    Gibt auch LEute hier, die dort nicht lesen...
    Ja, und genau deshalb habe ich den Link gepostet. Damit hier niemand seine Zeit damit verschwendet, auf etwas hinzuweisen, was ich dort schon geschrieben habe.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Sorry, hatte nicht gesehen dass du dort gepostet hattest! Habe dor mittlerweile geantwortet, hier der aktualisierte Code, der aber leider immer noch nicht funktioniert:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <math.h>
    #include <inttypes.h>
    #include <compat/deprecated.h>
    
    volatile char s_bit;
    volatile uint8_t addresse;
    volatile uint8_t code;
    volatile char rdy;
    volatile uint16_t gesamt[16];
    volatile char last_bit = 1;
    
    volatile uint8_t bitnummer = 1;
    volatile char ergebnis[20] = "RC5 fertig!";
    
    void init_rc5()
    {
     MCUCR |= (1<<ISC01) | (1<<ISC00);;  //wait rising edge
     GICR |= (1<<INT0);    //enable INT0
     TCCR0 |= (1<<CS02);   //Prescaler 256
     cbi(DDRD,PD2);
    }
    
    //****************************************************USART******************************
    
    void init_usart(void)
    {
     UBRRL |= 0b01100111;
     UCSRB = (1<<TXEN) | (1<<RXEN);
     UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
    }
    
    void send_char(unsigned char s)
    {
     while (!(UCSRA & (1<<UDRE)));
     UDR = s;
    }
    
    void send_string(char *s)
    {
     while(*s != '\0')
      {
       send_char(*s);
       s++;
      }
    }
    
    //**********************************************************USART-ENDE********************
    
    
    SIGNAL(SIG_INTERRUPT0)
    {
     char test[3];
     uint8_t i;
     if(last_bit == 1) {
     if(TCNT0<139 && bitnummer <= 14) {
    	gesamt[bitnummer] = 1;
    	last_bit = 1;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(TCNT0>139 && TCNT0<194 && bitnummer <= 14) {
    	gesamt[bitnummer] = 0;
    	last_bit = 0;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     }
     if(last_bit == 0) {
     if(TCNT0<139 && bitnummer <= 14) {
    	gesamt[bitnummer] = 0;
    	last_bit = 0;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     if(TCNT0>139 && TCNT0<194 && bitnummer <= 14) {
    	gesamt[bitnummer] = 1;
    	last_bit = 1;
    	TCNT0 = 0;
    	bitnummer++;
    	}
     }
     if(bitnummer == 14) {
    	gesamt[1] = 1;
    	last_bit = 1;
    	bitnummer = 1;
    	TCNT0 = 0;
    	rdy = 1;
    	}
    } 
       
       
    int main(void)
    {
     init_usart();
     init_rc5();
     sei();
     uint8_t i;
     char test[10];
     char wert[10] = "RC5:";
     for(;;)
     {
      if(rdy==1) {
    	send_string(wert);
    	for(i=9;i<=14;i++) {    // datenbits auslesen
    		itoa(gesamt[i],test,2);
    		send_string(test);
    		}
    	rdy = 0;
    	}
    	
     };
    }

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad