- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 28

Thema: RC5 Code von Roboternetz geht nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    #endif /* RC5_INT */
    {    code_t _code = code;    uint8_t _nint = nint;        uint8_t tcnt0 = TCNT0;    TCNT0 = 0;        if (0 == _nint)    {        /* INTx on both edges */        #if (RC5_INT == RC5_INT0)        MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01);        #elif (RC5_INT == RC5_INT1)        MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11);        #endif /* RC5_INT */                TIFR = (1 << TOV0);        TIMSK |= (1 << TOIE0);        _code.w = 0;    }    else    {        /* Number of bits of the just elapsed period */        uint8_t n = 1;                /* Bits received so far */        uint8_t _nbits = nbits;                /* is TCNT0 close to RC5_TICKS or RC5_TICKS/2 ? */        if (tcnt0 > RC5_TICKS + RC5_DELTA)        goto invalid;        else if (tcnt0 < RC5_TICKS/2 - RC5_DELTA)        goto invalid;        else if (tcnt0 > RC5_TICKS - RC5_DELTA)        n = 2;        else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA)        goto invalid;                /* store the just received 1 or 2 bits */        do        {            _nbits++;            if (_nbits & 1)            {                _code.w <<= 1;                _code.b[0] |= _nint & 1;            }        }        while (--n);                if (0)        {            invalid:                        /* disable INTx, run into Overflow0 */            #if (RC5_INT == RC5_INT0)            GICR &= ~(1 << INT0);            #elif (RC5_INT == RC5_INT1)            GICR &= ~(1 << INT1);            #endif /* RC5_INT */            _nbits = 0;        }                nbits = _nbits;    }    code = _code;    nint = 1+_nint; }
    Bei den ganzen if's wird geprüft, ob der Impuls falsch ist. Wenn alles korrekt ist wird die do-while ausgeführt. Prüfe da mal was angesprungen wird.

    EDIT: SCH****ß Formatierung -.-
    Die if-else abfragen in der INT0 ISR mit der darauffolgenden do-while-schleife

    mfg

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Was das timing anbelangt dürfte das Programm ziemlich heikel sein.
    Hab das mal auf meinem Pollin-Board aufgebaut und getestet. In der uart-Ausgabe springt der Cursor, zeigt aber nichts an.
    Ein anderes RC5-Programm läuft einwandfrei.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.08.2013
    Beiträge
    9
    So ich hab nun alle möglichkeiten durchgetestet und im Code dokumentiert, ich würde mich sehr freuen wenn du mir anhand dieser Information Näheres sagen könntest:

    Code:
    #if (RC5_INT == RC5_INT0)
    ISR(INT0_vect)
    #elif (RC5_INT == RC5_INT1)
    ISR(INT1_vect)
    #endif /* RC5_INT */
    {
    	
    	// Hier impuls sync mit tastendruck
    	 
    	code_t _code = code;
    	uint8_t _nint = nint;
    	
    	uint8_t tcnt0 = TCNT0;
    	TCNT0 = 0;
    	
    	if (0 == _nint)
    	{
    		
    		// Hier impulse mit erster fallender Flanke
    		 
    		/* INTx on both edges */
    		#if (RC5_INT == RC5_INT0)
    		
    		// Hier impulse mit erster fallender Flanke
    		
    		MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01);
    		#elif (RC5_INT == RC5_INT1)
    		
    		//Hier geht er nicht rein, wegen nutzung von INT0
    		
    		MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11);
    		#endif /* RC5_INT */
    		
    		TIFR = (1 << TOV0);
    		TIMSK |= (1 << TOIE0);
    		_code.w = 0;
    		
    		// Hier impulse mit erster fallender Flanke
    		
    	}
    	else
    	{
    		// Hier impulse mit erster steigender Flanke
    		
    		/* Number of bits of the just elapsed period */
    		uint8_t n = 1;
    		
    		/* Bits received so far */
    		uint8_t _nbits = nbits;
    		
    		/* is TCNT0 close to RC5_TICKS or RC5_TICKS/2 ? */
    		if (tcnt0 > RC5_TICKS + RC5_DELTA)
    		
    		goto invalid;
    		else if (tcnt0 < RC5_TICKS/2 - RC5_DELTA){
    			// Hier impulse mit erster steigender Flanke
    			
    		goto invalid;}
    		else if (tcnt0 > RC5_TICKS - RC5_DELTA){
    			// Hier geht er nicht rein!!
    			
    		n = 2;}
    		else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA){
    			// Hier geht er nicht rein!!
    			
    		goto invalid;}
    		
    		/* store the just received 1 or 2 bits */
    		do
    		{ 
    			// Hier geht er nicht rein!!!
    			
    			_nbits++;
    			if (_nbits & 1)
    			{
    				_code.w <<= 1;
    				_code.b[0] |= _nint & 1;
    			}
    		}
    		while (--n);
    		
    		if (0)
    		{
    			// Hier geht er nicht rein!!
    			
    				 
    			invalid:
    			
    			/* disable INTx, run into Overflow0 */
    			#if (RC5_INT == RC5_INT0)
    			
    				// Hier geht er mit erster steigenden Flanke rein
    				
    			GICR &= ~(1 << INT0);
    			#elif (RC5_INT == RC5_INT1)
    			
    			GICR &= ~(1 << INT1);
    			#endif /* RC5_INT */
    			
    			// Hier geht er mit erster steigenden Flanke rein
    			
    			_nbits = 0;
    		}
    		
    		// Hier geht er mit erster steigenden Flanke rein
    		
    		nbits = _nbits;
    	}
    	
    	// Hier geht er mit erster fallenden Flanke rein
    	
    	code = _code;
    	nint = 1+_nint;
    }

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Hier liegt ein Timingfehler vor, entweder ist dein Prozessor falsch getaktet oder deine Fernbedienung sendet kein RC5. Im Code springst du nämlich nur die Zeilen für einen ungültigen RC5 Code an.

    mfg

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Also der Code funktioniert ohne Änderungen, von SIGNAL abgesehen.
    Ich hatte einen Fehler in der UART-Ausgabe.
    In der UART-Ausgabe ist natürlich auch noch die Konvertierung auf ASCII mit itoa notwendig.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Berechtigungen

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

LiFePO4 Speicher Test