Witam. Mam pewien problem. Próbuję zrobić nadajnik kodu RC5 z użyciem mikrokontrolera AT Tiny26L SMD w Bascomie AVR 1.11.7.0. Niestety, polecenie RC5Send nie działa na tym układzie (Assignment Error [Timer1: 0 0: 112] i Assignment Error [Compare1a: 0 111: 112]).
Próbowałem więc zastosować procedurę opisaną na stronie http://www.mcselec.com/an_105.htm która działa poprawnie dla 90s2313 (testowałem). Jednak dla AT Tiny już nie chce.
Zmieniłem typ procesora, próbowałem z różnymi kwarcami (ustawiłem zewnętrzny rezonator).
Zastąpiłem polecenie Compare1a odwołaniem do rejestru Ocr1a i polecenie Timer1=0 poprzez Tcnt1=0 ponieważ bez tego nie było poprawnej kompilacji. Próbowałem zmieniać trochę wartość T_oc1 w górę i w dół ale dalej nic.
Oto kod, który stosuję (trochę przerobiony, zaremowałem kilka niepotrzebnych linii)
Kod ten działa dla 90s2313 (oczywiście przy pinie Pb.3 i normalnych poleceniach Timer1 i Compare1a). Zbudowałem odbiornik RC5 na płytce testowej AVT2500, mam pilota Philips, czyli na pewno RC5, sygnał z pilota dekoduje poprawnie, nadajnik zbudowany na 90s2313 działa (ten kod akurat włącza CD w wieży). Zauważyłem za to, że na AT Tiny sygnał nie jest dekodowany i jest on jakby słabszy (po podłączeniu wyjścia TFMS5360 do diody LED reaguje ona na pilota i nadajnik na 90s2313 z dużej odległości, natomiast na AT Tiny z kilku centymetrów i to ledwo ledwo, przez kilka sekund a później jakby coraz słabiej). Podłączenie przez ULN2803 diody nadawczej nic nie dało, wydaje się że układ nie generuje sygnału na częstotliwości 36kHz, ale odbiornik jak wyżej opisałem jako tako chwyta, poza tym próbowałem zmieniać wartość T_oc1 co ma chyba wpływ na częstotliwość (mogę się mylić) ale nie zauważyłem żadnej poprawy.
Co może być przyczyną że akurat na tym mikrokontrolerze nie działa? Czy fakt że w 90s2313 Timer1 jest 16-biotwy a w AT Tiny 8-bitowy może tu mieć jakieś znaczenie, skoro zliczanie i tak mieści się z obrębie 8 bitów (do 110). Ponadto wyjście OC1A jest także wejściem programującym MISO ale nawet odłączenie od programatora nic nie daje. Jeszcze jedno - przebieg w symulacji dla 90s2313 i AT Tiny jest identyczny.
A może ktoś zaproponuje jakiś kod w Assemblerze (nie znam się na nim, ale jako wstawkę mogę zastosować).
Próbowałem więc zastosować procedurę opisaną na stronie http://www.mcselec.com/an_105.htm która działa poprawnie dla 90s2313 (testowałem). Jednak dla AT Tiny już nie chce.
Zmieniłem typ procesora, próbowałem z różnymi kwarcami (ustawiłem zewnętrzny rezonator).
Zastąpiłem polecenie Compare1a odwołaniem do rejestru Ocr1a i polecenie Timer1=0 poprzez Tcnt1=0 ponieważ bez tego nie było poprawnej kompilacji. Próbowałem zmieniać trochę wartość T_oc1 w górę i w dół ale dalej nic.
Oto kod, który stosuję (trochę przerobiony, zaremowałem kilka niepotrzebnych linii)
Dim Rc5_address As Byte
Dim Rc5_command As Byte
'Dim Key As Byte
'Dim Key_prev As Byte
Dim Rc5_bit_nr As Byte
Dim Toggle_bit As Boolean
' 36kHz carrier reload value
'Const T_oc1 = 55 'value for 4MHz crystal
Const T_oc1 = 110 'value for 8MHz crystal
'Const T_oc1 = 138 'value for 10MHz crystal
Const Carrier_on = &B01000000 'IR 36kHz carrier on
Const Carrier_off = &B11000000 'IR 36kHz carrier off
'Config Kbd = Portb 'keyboard connected at Port b
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
'Timer1 = 0 - to zastąpiłem poleceniem:
Tcnt1=0
'Compare1a = T_oc1 - to zastąpiłem poleceniem: 'Pb.3 = OC1 = IR carrier output 36 kHz
Ocr1a=T_oc1
Declare Sub Logic_0
Declare Sub Logic_1
Tccr1a = Carrier_off
Toggle_bit = 0
'---[ set RC-5 System Address ]-------------------------------------------------
'Pracuję na stałej komendzie i adresie:
Rc5_address = 20
Rc5_command = 63
'Rc5_address = 0 'TV = 0
'Rc5_address = 5 'VCR = 5
'Rc5_address = 20 'CD = 20
'---[ main program loop ]-------------------------------------------------------
Do
'Key = Getkbd() 'get keyboard value
Waitms 1 'small delay
'If Key <> 16 Then 'test if key is pressed else key = 16
'If Key_prev <> Key Then Toggle_bit = Not Toggle_bit 'set toggle bit
'Rc5_command = Lookup(key , Rc5_commands) 'get RC-5 command
'---[ transmit Address and Command as 14 bit RC-5 code ]------------------------
'Ddrb.3 = 1 'set OC1 (Pb.3) = IR carrier output - zastąpiłem zgodnie z rozkładem pinów:
Ddrb.1 = 1
Logic_1 'first start bit
Logic_1 'second start bit
If Toggle_bit = 0 Then Logic_0 Else Logic_1 'toggle bit
For Rc5_bit_nr = 4 To 0 STEP -1 '5 bit address, msb first
If Rc5_address.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
Next
For Rc5_bit_nr = 5 To 0 STEP -1 '6 bit command, msb first
If Rc5_command.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
Next
Tccr1a = Carrier_off
Waitms 87 'frame gap delay
'End If
'Key_prev = Key 'save last key value
Loop
End
'-------------------------------------------------------------------------------
Sub Logic_0
Tccr1a = Carrier_on
Waitus 883
Tccr1a = Carrier_off
Waitus 884
End Sub
Sub Logic_1
Tccr1a = Carrier_off
Waitus 883
Tccr1a = Carrier_on
Waitus 884
End Sub
'Rc5_commands:
'Data 1 , 2 , 3 , 0 'column 4 not used (3x4 keypad)
'Data 4 , 5 , 6 , 0
'Data 7 , 8 , 9 , 0
'Data 10 , 11 , 12 , 0
Kod ten działa dla 90s2313 (oczywiście przy pinie Pb.3 i normalnych poleceniach Timer1 i Compare1a). Zbudowałem odbiornik RC5 na płytce testowej AVT2500, mam pilota Philips, czyli na pewno RC5, sygnał z pilota dekoduje poprawnie, nadajnik zbudowany na 90s2313 działa (ten kod akurat włącza CD w wieży). Zauważyłem za to, że na AT Tiny sygnał nie jest dekodowany i jest on jakby słabszy (po podłączeniu wyjścia TFMS5360 do diody LED reaguje ona na pilota i nadajnik na 90s2313 z dużej odległości, natomiast na AT Tiny z kilku centymetrów i to ledwo ledwo, przez kilka sekund a później jakby coraz słabiej). Podłączenie przez ULN2803 diody nadawczej nic nie dało, wydaje się że układ nie generuje sygnału na częstotliwości 36kHz, ale odbiornik jak wyżej opisałem jako tako chwyta, poza tym próbowałem zmieniać wartość T_oc1 co ma chyba wpływ na częstotliwość (mogę się mylić) ale nie zauważyłem żadnej poprawy.
Co może być przyczyną że akurat na tym mikrokontrolerze nie działa? Czy fakt że w 90s2313 Timer1 jest 16-biotwy a w AT Tiny 8-bitowy może tu mieć jakieś znaczenie, skoro zliczanie i tak mieści się z obrębie 8 bitów (do 110). Ponadto wyjście OC1A jest także wejściem programującym MISO ale nawet odłączenie od programatora nic nie daje. Jeszcze jedno - przebieg w symulacji dla 90s2313 i AT Tiny jest identyczny.
A może ktoś zaproponuje jakiś kod w Assemblerze (nie znam się na nim, ale jako wstawkę mogę zastosować).