Skocz do zawartości

RC5 - brak danych.


w1941srobot

Pomocna odpowiedź

Napisałem sobie taki oto kod do obsługi rc5. Jako, że chciałem na sam początek odebrać tylko całą ramkę danych i wypisać ostatnie 8 bitów danych, dałem sobie spokój ze sprawdzaniem bitów startu itp. Niestety program nie działa tak jak powinien a mianowicie nic się nie wyświetla na diodach. Pilot jest dobry gdyż używałem go kiedyś w starym robocie gdzie kod był w bascomie i działało. Odbiornik to TSOP1736. Jest to 3 wersja kodu a zarazem najprostsza (do bólu). Pierwszych 2 nie wrzucam ponieważ myślę, że nie ma takiej potrzeby. Proszę o pomoc ponieważ koniecznie sam chciałem napisać własną bibliotekę do rc5. 🙂

MIKROKONTROLER - ATMEGA8

#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile char TIMER1=0;
volatile char dane=0;
volatile char i=0;

void rc5(void)
{
GICR=0;

for(i=0;i<=14;++i)
{

	while(!(TIMER1==6 && TCNT0==15)); //odczekaj az wartosc czasu bedzie wybosic 1545us

	if(!(PIND & 0b00000100))		// sprawdz stan portu
			{
				dane=dane<<1;

			}
		else
			{
				dane=dane<<1;
				dane|=0b00000001;
			}

	while(!(TCNT0==242)); // odczekaj pozostaly czas do konca bitu


	TCNT0=0;		//zerowanie tcnt0
	TIMER1=0;		//zerowanie zmiennej timer1

}	
TCCR0=0;		//zatrzymanie timera
TCNT0=0;		//zerowanie TCNT


}

int main(void)
{
DDRD=0x00;
DDRC=0xFF;

PORTC=0xFF;

MCUCR=0b00000010; //poziom narastajacy na int0 generuje przerwanie
GICR=0b01000000;
TIMSK=0b00000001; // przerwania od timera 
PORTC=0;

sei();

while(1)
{
//TCCR0=0b00000010;
_delay_ms(500);
PORTC=dane; //wyswietlenie danych na porcie C
_delay_ms(500);
dane=0;

GICR=0b01000000;
}

}


SIGNAL(SIG_INTERRUPT0)
{
TCCR0=0b00000010;	//start timera
rc5();

}



ISR(SIG_OVERFLOW0)
{

TIMER1++; //zwieksza co 255us

}
Link do komentarza
Share on other sites

Ogólnie idea dekodowania RC5 jest taka jak na rysunku niżej (moje stare notatki).

Już z niej wynika niejako sam algorytm dekodowania. Trzeba każdy bit próbkować co najmniej dwa razy, aby wykryć czy jest to 1 czy zero. I tutaj jest bardzo ważne zsynchronizowanie się, z bitem S1, a właściwie, odpowiednie zsynchronizowanie startu próbkowania. W 51' algorytm korzystał z przerwania INT, do wykrycia początku transmisji czyli Bitu S1, w tym przerwaniu oczekiwano ok 443us, po czym robiono próbkę, i zbierano kolejne dane do 32 bitowej zmiennej co 889us, już w przerwaniach od Timera (oczywiście wyłączano na ten czas INTa) Detekcja błędów polegała na tym że jeżeli trzy kolejne próbki, były zerami, lub jedynkami, to jest błąd transmisji, następnie analizowano pary bitów jak na rysunku.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.