Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z RC5 na AVR

Remo
-
-
Posty:32
Rejestracja:22 lis 2003, o 21:00
Lokalizacja:Szczecin
Kontaktowanie:
Problem z RC5 na AVR

Postautor: Remo » 9 paź 2005, o 12:57

Witam,
napisałem programik do odczytu kodu RC5 i mam problem- niezależnie od tego który klawisz pilota zostanie wciśnięty, na wyświetlaczu zawsze pojawiają sie wartości 255 255.
Jako pilota używam Philipsa na układzie PCA8521 więc nie może być mowy o tym, że wysyła inny kod. Procek to 90s2313, kwarc i portd.2 odpowiednio ustawione w opcjach kompilatora
Poniżej listing mojego programu, proszę o pomoc.

Config Lcd = 16 * 1a
Cls
Declare Sub Main
Dim Address As Byte , Command As Byte , Code As Byte
Config Rc5 = Pind.2
Config Pind.2 = Input
Enable Interrupts
Enable Int0
On Int0 Receive

Sub Main
Do
Home
Lcd "Waiting for RC5"
If Code = 1 Then
Cls
Getrc5(address , Command)
Disable Int0
Cls
Lcd Address ; " " ; Command
Wait 1
Enable Int0
Code = 0
End If
Loop
End Sub

Receive:
Code = 1
Return

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 9 paź 2005, o 15:20

Zbyt wiele cennego czasu procesora , tracisz na "głupotki" - niepotrzebne ekstrawagancje - jak przerwanie INT0 i CLS.

Kod: Zaznacz cały

If Code = 1 Then Cls 'czyszczenie LCD-ka ~5.5ms Getrc5(address , Command) 'zanim ta funkcja zacznie dekodować sygnał z odbiornika , to pilot zdąży wytransmitować kilka bitów i ... kicha. Disable Int0 Cls Lcd Address ; " " ; Command Wait 1 Enable Int0 Code = 0 End If Loop End Sub Receive: 'wykonanie przerwania = ~100 cykli Code = 1 Return
Spróbuj najpierw "normalnie" , jak w przykładowym programie z katalogu Samples , a potem eksperymentuj.

Remo
-
-
Posty:32
Rejestracja:22 lis 2003, o 21:00
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Remo » 9 paź 2005, o 21:28

Dla odmiany po skompilowaniu pliku z katalogu samples "rc5.bas" i delikatnym zmodyfikowaniu dla LCD, wyświetla 255 127.
Czy przyczyną może być to, że zamiast SFH 505 używam TFM5360?
Poniżej listing sample'a po lekkiej modyfikacji- dalej nie działa

$lib "mcsbyte.lbx"
Config Lcd = 16 * 1a
Config Rc5 = Pind.2
Enable Interrupts
Dim Address As Byte , Command As Byte
Cls
Lcd "Waiting for RC5."
Do
Config Pind.2 = Input
Getrc5(address , Command)
Command = Command And &B01111111
Cls
Lcd Address ; " " ; Command
Loop
End

Awatar użytkownika
Lemur
-
-
Posty:17
Rejestracja:27 lip 2004, o 08:30
Lokalizacja:Pruszków

Postautor: Lemur » 10 paź 2005, o 08:43

Cześć...

W procedurze obslugi przerwania:

Kod: Zaznacz cały

Receive: 'wykonanie przerwania = ~100 cykli Code = 1 Return
należy od razu po wejsciu do niej ,wyłączyć obslugę przerwania!

Kod: Zaznacz cały

Receive: 'wykonanie przerwania = ~100 cykli Disable Int0 ' <<<<<<<<<<<<<<<<<<<< Code = 1 Return
a na początku po użyciu:

Kod: Zaznacz cały

Config Rc5 = Pind.2
nie używaj już :

Kod: Zaznacz cały

Config Pind.2 = Input
proponuję również prznieść:

Kod: Zaznacz cały

Getrc5(address , Command)
do procedury obsługi przerwania np.:

Kod: Zaznacz cały

Receive: 'wykonanie przerwania = ~100 cykli Disable Int0 ' <<<<<<<<<<<<<<<<<<<< Getrc5(address , Command) Code = 1 Return
a flagę CODE wykorzystać tylko do obsługi(wyświetlania) poza procedurą Receive.

Remo
-
-
Posty:32
Rejestracja:22 lis 2003, o 21:00
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Remo » 12 paź 2005, o 22:35

Dzięki za pomoc-szczególnie dla Ciebie Lemur- w końcu coś się zaczeło dziać chociaż czasem wyswietla jeszcze pewne przekłamania, ale na pewno chodzi o czas obsługi kodu RC5-muszę dopracować program .

Awatar użytkownika
Lemur
-
-
Posty:17
Rejestracja:27 lip 2004, o 08:30
Lokalizacja:Pruszków

Postautor: Lemur » 14 paź 2005, o 15:34

Zapomniałem jeszcze,że po wyłączeniu przerwania:
Disable Int0
należy powtórnie załączyć globalnie przerwania
Enable Interrupts
coby Timer0 mógł pracować celem analizy transmisji RC-5.
A propo ,może wykorzystujesz Timer0 do czegoś i kłóci się on z RC-5.
Na czas odczytu RC-5 należy Timer0 zatrzymać lub używać Timer1

Awatar użytkownika
edison
-
-
Posty:4
Rejestracja:19 paź 2005, o 12:09
Lokalizacja:Chrzanów/Kraków

RC5

Postautor: edison » 19 paź 2005, o 12:41

Witam! Mam podobny problem jak kolega z odbiorem kodu RC5 na AVR.
Moj program wyglada nastepujaco:

Kod: Zaznacz cały

$crystal = 1000000 'wewnetrzny oscylator $regfile = "m8515.dat" Config Porta = &B11111001 Porta = &B00000110 Config Portb = Output Portb = 0 Config Portc = Output Portc = 0 Config Portd = Input Portd = &B11111111 Config Rc5 = Pind.2 Enable Interrupts Enable Int0 On Int0 Czytaj Dim Adres As Byte , Komenda As Byte , I As Byte Do Portb = I Mod 10 Set Portb.4 Reset Portb.5 Waitms 4 Portb = I / 10 Set Portb.5 Reset Portb.4 Waitms 4 Loop Czytaj: Disable Int0 Getrc5(adres , Komenda) If Adres = 0 Then I = Komenda And &B01111111 End If Enable Int0 Return
Gdy funkcja getrc5() jest bezposrednio w glownej petli wszystko jest ok. Natomiast gdzy chce ja wywolac z przerwania pojawia sie problem i nic nie odbiera. Czy moze cos jest nie tak w moim kodzie? To jest moj programik testowy i bedzie on czescia wiekszego programu, daltego pokazalem tez wszystkie konfiguracje portow - byc moze gdzies tam tkwi blad. W glownej petli jest zawarta obsluga wyswietlacza LED.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Re: RC5

Postautor: szymel » 20 paź 2005, o 19:53

Witam! Mam podobny problem jak kolega z odbiorem kodu RC5 na AVR.
Moj program wyglada nastepujaco:

Kod: Zaznacz cały

... Czytaj: Disable Int0 'Ponieważ funkcja GetRC5 korzysta z przerwań(standardowo używa Timer0) , należy zezwolić na wykonywanie przerwan(globalnie). Enable Interrupts 'Właśnie tu ;) Getrc5(adres , Komenda) If Adres = 0 Then I = Komenda And &B01111111 End If Enable Int0 Return
Warto również skonfigurować INT0 na zbocze , a nie na stan np. "Config Int0 = Falling "

Piotrek

Remo
-
-
Posty:32
Rejestracja:22 lis 2003, o 21:00
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Remo » 22 paź 2005, o 21:12

Czuy mieliście może przypadek zakłóceń od RC5 w czasie wykonywania jakiejś pętli- co jakiś czas po mimo nie wysyłania żadnego kodu program na chwilę się zatrzymuje przy wykonywaniu pętli, i za chwilkę dalej rusza-jest to nieregularne, co 7-16 pętli. Jak odłącze odbiornik podczerwieni, wszystko jest ok.
Co może być grane??

PIOTR11
-
-
Posty:15
Rejestracja:20 kwie 2003, o 07:15
Lokalizacja:Chrzanów

RC5

Postautor: PIOTR11 » 30 paź 2005, o 09:34

Witam
Wiadomość dla edisona
To nie pójdzie na przerwaniach musi być w pętli głównej
wystarczy dopracować program
Temat już był poruszany tylko nie wiem na którym forum
Powodzenia PIOTR :idea:

neutronix
-
-
Posty:3
Rejestracja:5 paź 2005, o 19:16
Lokalizacja:wa-wa
Kontaktowanie:

Postautor: neutronix » 31 paź 2005, o 09:03

Wiadomość dla Remo
Tak, niestety odbiorniki typu TFMS lub SFH generują szpilki nawet jak nie odbierają dowolnego kodu IR nie tylko RC5 i jak taka szpilka wywoła przerwanie to niestety ...kicha.
Trzeba tak operować zezwoleniami na przerwania aby w trakcie wykonywania istotnego
podprogramu zablokować INT od RC5, a po wykonaniu natychmiast zezwolić

ROM
-
-
Posty:295
Rejestracja:5 lis 2004, o 10:48
Lokalizacja:Poznań

Postautor: ROM » 31 paź 2005, o 21:32

Tak, niestety odbiorniki typu TFMS lub SFH generują szpilki nawet jak nie odbierają dowolnego kodu IR nie tylko RC5...
Te czujki powinny mieć blokowane zasilanie tuż przy ich nózkach lub na nich.Standardowo to 47nF i równolegle 47uF.

Remo
-
-
Posty:32
Rejestracja:22 lis 2003, o 21:00
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Remo » 1 lis 2005, o 06:32

U mnie chodzi na przerwaniach-ze względu na specyfikę programu u mnie musi tak być.
Ale info od neutronixa i ROMa jest bardzo cenną podpowiedzią - dziś spróbuje pokombinować...

Awatar użytkownika
edison
-
-
Posty:4
Rejestracja:19 paź 2005, o 12:09
Lokalizacja:Chrzanów/Kraków

Postautor: edison » 3 lis 2005, o 13:42

Szczerze powiedziawszy nie bawilem sie ostatnio w odbior podczerwieni ale mysle, ze juz niebawem znowu sie za to wezme:) W kazdym badz razie jesli proba odbioru kodu nie pojdzie na przerwaniach i polecenie getrc5() musi byc w petli glownej, tak jak sugeruje PIOTR11, to prawdepowiedziawszy jestem w kropce. Niestety moj program bedzie tez docelowo sterowal wyswietlaczami LED wiec wstawienie komendy getrc5() jest niemozliwe, poniewaz "trzyma" ona program w miejscu na bardzo dlugi czas :/ Tak przynajmniej jest u mnie.

[ Dodano: 04-11-2005, 16:39 ]
Udalo mi sie rozwiazac problem z RC5 wiec wszystko jest ok:) Zeby rozwiac watpliwosci to dodam, że mozna spokojnie odbierac kod RC5 na przerwaniach. W moim przypadku pomoglo dodanie globalnego zezwolenia na przerwania "enable interrupts" zaraz przed komenda getrc5(). Tak jak mi sugerowano dalem tez wyzwalanie przerwania zboczem "falling". Dziekuje wszystkim za pomoc. :)

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 6 lis 2005, o 15:32

...
[ Dodano: 04-11-2005, 16:39 ]

Udalo mi sie rozwiazac problem z RC5 wiec wszystko jest ok:) Zeby rozwiac watpliwosci to dodam, że mozna spokojnie odbierac kod RC5 na przerwaniach. W moim przypadku pomoglo dodanie globalnego zezwolenia na przerwania "enable interrupts" zaraz przed komenda getrc5(). Tak jak mi sugerowano dalem tez wyzwalanie przerwania zboczem "falling". Dziekuje wszystkim za pomoc. :)
O globalnym zezwoleniu na wykonywanie przerwań , wspomniano przynajmniej 2-krotnie.

Pozdrawiam
Piotrek

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości