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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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
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
Zbyt wiele cennego czasu procesora , tracisz na "głupotki" - niepotrzebne ekstrawagancje - jak przerwanie INT0 i CLS.
Spróbuj najpierw "normalnie" , jak w przykładowym programie z katalogu Samples , a potem eksperymentuj.
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
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
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
Cześć...
W procedurze obslugi przerwania:
należy od razu po wejsciu do niej ,wyłączyć obslugę przerwania!
a na początku po użyciu:
nie używaj już :
proponuję również prznieść:
do procedury obsługi przerwania np.:
a flagę CODE wykorzystać tylko do obsługi(wyświetlania) poza procedurą Receive.
W procedurze obslugi przerwania:
Kod: Zaznacz cały
Receive: 'wykonanie przerwania = ~100 cykli
Code = 1
Return
Kod: Zaznacz cały
Receive: 'wykonanie przerwania = ~100 cykli
Disable Int0 ' <<<<<<<<<<<<<<<<<<<<
Code = 1
Return
Kod: Zaznacz cały
Config Rc5 = Pind.2
Kod: Zaznacz cały
Config Pind.2 = Input
Kod: Zaznacz cały
Getrc5(address , Command)
Kod: Zaznacz cały
Receive: 'wykonanie przerwania = ~100 cykli
Disable Int0 ' <<<<<<<<<<<<<<<<<<<<
Getrc5(address , Command)
Code = 1
Return
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
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
RC5
Witam! Mam podobny problem jak kolega z odbiorem kodu RC5 na AVR.
Moj program wyglada nastepujaco:
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.
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
Re: RC5
Warto również skonfigurować INT0 na zbocze , a nie na stan np. "Config Int0 = Falling "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
Piotrek
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??
Co może być grane??
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ć
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ć
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.
[ 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....
[ 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.
Pozdrawiam
Piotrek
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 20 gości