- SF800 Solar Speicher Tutorial         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: RC5 Empfang mit TSOP1736

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

    LiFePo4 Akku selber bauen - Video
    Ich verzweifel da noch dran, hab jetzt Stunden mit ausprobieren verbracht aber ich komme auf keinen grünen Zweig...
    Bei dem Code unten bekomme ich immer eine 17-stellige Zahl, dabei sollen einfach nur alle Bits in die Variable rc5.gesamt kopiert werden...

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <math.h>
    #include <inttypes.h>
    #include <compat/deprecated.h>
    
    
    
    
    struct rc5_parts
     {
        volatile char s_bit;
    	volatile uint8_t addresse;
    	volatile uint8_t code;
    	volatile char rdy;
    	volatile uint16_t gesamt;
     } volatile rc5;
    
    volatile uint8_t bitnummer = 0;
    
    void init_rc5()
    {
     MCUCR |= (1<<ISC11);  //wait falling edge
     GICR |= (1<<INT1);    //enable INT1
     TCCR0 |= (1<<CS02);   //Prescaler 256
     cbi(DDRD,PD3); 
    }
    
    //****************************************************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_OVERFLOW0)
    {
     bitnummer++;
     if(rc5.s_bit == 1 && bitnummer < 14)
      {
        if((PIND & (1<<PD3)) != 0)
    	 {
    	  rc5.gesamt |= (1<<(14-bitnummer));
    	  TCNT0 = 228;
    	 }
    	else
    	 {
    	  rc5.gesamt &= ~(1<<(14-bitnummer));
    	  TCNT0 = 228;
    	 }
      }
      if(rc5.s_bit == 1 && bitnummer == 14)
      {
        cbi(TIMSK,TOIE0);
    	TCNT0 = 0;
    	rc5.rdy = 1;
      }
    }
    
    SIGNAL(SIG_INTERRUPT1)
    {
     
     
     if(rc5.s_bit==0)
       {
        TCNT0 = 228;
    	rc5.s_bit = 1;
    	sbi(TIMSK,TOIE0);
    	cbi(GICR,INT1);
       }
    }
       
    int main(void)
    {
     init_usart();
     init_rc5();
     sei();
     char result[10];
     
     for(;;)
      {
       if(rc5.rdy == 1)
        {
         itoa(rc5.gesamt,result,10);
    	 char hello2[15] = "RC5-Code: ";
         send_string(result);
    	 rc5.rdy = 0;
    	 rc5.gesamt = 0;
    	 rc5.s_bit = 0;
    	 bitnummer = 0;
    	 sbi(GICR,INT1);
    	}
      }
    }

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Hast du nen Pullup an dem Port?
    Disclaimer: none. Sue me.

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Ja, gegen VCC. texttextextextextext

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Deine IRQs kommen doch mit -28, das ist 1/4 Bit. Für den ersten (ab INTx) ist das ok, aber danach sollten sie mit 1/2 Bit (-56) oder 1 Bit (-111) kommen. Du hast es auf 1 Bit ausgelegt (also ohne Konsistenzprüfung etc). Bist du sicher, daß du RC5 sendest?
    Disclaimer: none. Sue me.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Genau, erst 1/4 Bit und dann immer ein ganzes Bit. Ich gehe davon aus, dass RC5 gesendet wird, da ich in Basic mit dem GetRC5()-Befehl die Commandos empfangen kann und es sich um eine Philipps-Fernbedienung handelt.

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Dann sollte doch in der Timer0-ISR Timer0 auf -111 preloadet werden, oder?

    Ausserdem ist es ratsam, die IRQ-Flags vor Aktivierung einer IRQ zu resetten. Sonst bekommst du evtl eine INT1-IRQ, ohne daß es nach Aktivieren der IRQ ein INT1-Ereignis gab.
    Disclaimer: none. Sue me.

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Hi,
    ich hatte das mit dem Preloaden so verstanden, dass der Timer bis 256 zählt und ich will, dass er nach 111 Schritten einen Overflow auslöst
    ->256-111 = 145
    Wie soll ich dass denn sonst machen? Das mit dem Flag-resetten werde ich ausprobieren.

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Jo, -111 = 145. ich rechne immer mit den negativen, ist einfacher.
    Disclaimer: none. Sue me.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test