Odbiornik Rc5


8.16667
Ocena: None Średnia: 8.2 (6 głosujących)

Urządzenie to współpracuje z układami mikroprocesorowymi zawierającymi klawiaturę w formie przycisków zwieranych do masy. Układ włączony jest równolegle do klawiatury urządzenia sterowanego i po odebraniu sygnału z pilota pracującego w standardzie Rc5 powoduje wymuszenie stanu niskiego na odpowiednim przycisku. Układ którym sterujemy odbierze to jako naciśnięcie przycisku na klawiaturze. Odbiornik ten został zaprojektowany jako pilot do przedwzmacniacza cyfrowego ale po zmianie oprogramowania może działać z dowolnym innym urządzeniem. Układ działa w oparciu o mikrokontroler AT89C2051 (lub ATTiny2313) i kilka elementów pomocniczych. Zasilanie pobierane jest ze sterowanego urządzenia.

Działanie:


Schemat ideowy odbiornika przedstawiony jest na rysunku poniżej:

Sercem układu jest mikrokontroler U1 (AT89C4051) wraz z rezonatorem kwarcowym X1 (12MHz) i kondensatorami C1 (22pF) i C2 (22pF). Kondensator C3 (1uF) zapewnia reset procesora po włączeniu napięcia zasilania. Układ U2 (TSOP1736) jest odbiornikiem podczerwieni pracującym na częstotliwości 36KHz. Elementy R3 (220R) i C5 (100uF) stanowią obwód zasilania układu U2. Dioda D1 wraz z rezystorem ograniczającym prąd R4 (330R) służy do sygnalizowania poprawnie odebranej transmisji w kodzie Rc5. Kondensator C4 (47uF) filtruje napięcie zasilające mikrokontroler. Rezystory R1 (1k) i R2 (1k) podciągają piny P1.0 i P1.1 mikrokontrolera do plusa zasilania. Wyjścia sterujące układu (Port P1) oraz zasilanie (5V) wyprowadzone są na złącze SW_Goldpin.

Budowa:


Układ można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym można ściągnąć tutaj. Montaż układu jest prosty i nie powinien sprawić trudności. W pierwszej kolejności należy wlutować rezystor R1 leżący pod mikrokontrolerem. Kolejność pozostałych elementów jest dowolna. Pod procesor bezwzględnie konieczna jest podstawka, w przeciwnym wypadku nie będzie możliwe jego zaprogramowanie. Pomocą przy konstrukcji może okazać się dostępny tutaj schemat montażowy.

Zamiast mikrokontrolera AT89C2051 można zastosować ATTiny2313. W takim wypadku nie należy montować rezystorów R1 i R2 oraz kondensatora C3. Rezonator kwarcowy X1 należy wymienić na 16MHz bo pod taki program był kompilowany. Dla rezonatora 12MHz jaki był w pierwotnym układzie należy zmodyfikować program (pierwszą linijkę z dyrektywą $crystal wpisując 12000000 zamiast 16000000). Ustawienia fusebitów mikrokontrolera ATTiny2313 dostępne są w rozdziale "Programowanie"

Wykaz Elementów:


1x Listwa Gold Pin 1x10

1x 220R
1x 330R
2x 1k

2x 22pF
1x 1uF Elektrolit
1x 47uF Elektrolit
1x 100uF Elektrolit

1x Rezonator Kwarcowy 12MHz
1x Dioda LED
1x AT89C2051 + Podstawka
1x Odbiornik podczerwieni TSOP1736

Programowanie:

UWAGA! W przypadku korzystania z wersji programu dla AVR, podczas kompilacji w nowym bascomie linia konfiguracji RC5 powinna wyglądać następująco:

Config Rc5 = Pind.2 , Wait = 2000 

Mikrokontroler został zaprogramowany w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

'****************************
           'Konfiguracja
'****************************
$crystal = 12000000                                           '12MHz
$regfile = "89C4051.DAT"
 
Config Rc5 = P3.2
Reset Tcon.0                                                  'reaguje na zbocze narastajace
On Int0 Odbierz_rc5
Enable Int0
Enable Interrupts
 
 
Dim Odebrano As Bit
Dim Komenda As Byte , Adres As Byte
 
Dioda Alias P3.7
'****************************
      'Petla glowna
'****************************
Do
  If Odebrano = 1 Then
     Odebrano = 0
     If Adres = 0 Then
       Disable Int0
 
       Waitms 100
       Reset Dioda
 
       Select Case Komenda
         Case 1:                                              'vol+
           Reset P1.7
         Case 2:                                              'bas+
           Reset P1.6
         Case 3:                                              'treb+
           Reset P1.5
         Case 4:                                              'vol-
           Reset P1.3
         Case 5:                                              'bas-
           Reset P1.2
         Case 6:                                              'treb-
           Reset P1.1
         Case 15:                                             'we
           Reset P1.0
         Case 13:                                             'mute
           Reset P1.4
       End Select
 
       Waitms 100
       Set Dioda
       P1 = 255
 
       Enable Int0
     End If
  End If
Loop
End
'****************************
      'Inne Etykiety
'****************************
Odbierz_rc5:
  Getrc5(adres , Komenda)
  Adres = Adres And &B00011111                                'zerowanie bitu 5
  Odebrano = 1
Return
'****************************

Poniżej przedstawione są ustawienia fusebitów mikrokontrolera ATTiny2313 (nie dotyczy AT89C2051 jaki został uzyty w pierwotnej wersji):

Zdjęcia Projektu:

ZałącznikWielkość
Schemat41.01 KB
Płytka7.86 KB
Płytka (odbicie lustrzane)7.88 KB
Płytka (9 na stronie)50.99 KB
Montowanie10.59 KB
Opis5.28 KB
Opis (odbicie lustrzane)5.31 KB
Kod Źródłowy2.14 KB
Program po kompilacji (BIN)454 bajty
Program po kompilacji (HEX)1.29 KB
Kod Źródłowy (dla ATTiny2313, BASCOM AVR)1.22 KB
Program po kompilacji (BIN) (dla ATTiny2313, BASCOM AVR)586 bajtów
Program po kompilacji (HEX) (dla ATTiny2313, BASCOM AVR)1.63 KB
Kod Źródłowy (dla ATTiny13, BASCOM AVR) (nie testowany)1.05 KB



Portret użytkownika EDC

RC5 na ATtiny13

Wczoraj taką wersję sobie do rolet zrobiłem na malutkiego ATtiny13 :) Działa bez tego timera.

'Odbiornik RC5
'Wyjścia w stanie niskim tak długo jak trzyma się przycisk
$regfile = "attiny13a.dat"                                  '44% Flash
$crystal = 9600000
$hwstack = 24
$swstack = 18
$framesize = 16
 
$lib "mcsbyte.lbx"                                          'wykorzystamy bibliotekę która ogranicza się do
                                                             'uzywania tylko bajtów celem zmniejszenia kodu
Config Portb.3 = Output
Config Portb.4 = Output                                     'tu diody ale mogą to być wyjścia
Led_r Alias Portb.3
Led_l Alias Portb.4
Set Led_r                                                   'żeby nie włączyć dwóch kierunków na raz
Set Led_l
 
Config Rc5 = Pinb.0                                         'WAŻNE bez Wait=2000 (domyslne jest 100)
 
Dim Address As Byte                                         'typ urządzenia np.0-telewizor, 8-sat
Dim Command As Byte                                         'np 17 ciszej,16 głośniej
Dim Odczekaj As Byte
Const Deelay = 20
 
Enable Interrupts                                           ' zezwolenie na przerwania
'*** START ***
Do
 
Getrc5(address , Command)                                   'sprawdź czy pilot nadaje
 
If Address <> 255 Then                                      'jeśli Wpisać "If Address=0 Then"
  Command = Command And &B01111111                          'to zawęzimy tylko do telewizorów
 
 Select Case Command
 
   Case 16                                                  'przycisk pilota +
      Reset Led_l
      Odczekaj = Deelay
   Case 17                                                  'przycisk pilota -
      Reset Led_r
      Odczekaj = Deelay
 
  End Select
 
End If
 
If Odczekaj <> 0 Then Decr Odczekaj
 
If Odczekaj = 0 Then
 Set Led_l
 Set Led_r
End If
 
Loop
End
'*** KONIEC ***

-

BARTek
Moja strona

Portret użytkownika pablo5-5

ATmega328p

Witam,
Mam problem z odbiorem sygnałów z pilota RC5 na mikrokontrolerze ATmega328p. Czy ten procek prawidłowo obsługuje polecenia GETRC5? Działają mi tylko przyciski o kodzie od 1 do 63. Przyciski, które mają komendy powyżej 64 nie działają. Ten sam kod programu pod ATmega8 działa prawidłowo, odbiera komendy powyżej 64, a ATmega328 (z tym samym kodem, zmienione oczywiście $regfile) nie odbiera komend powyżej 64.
Jaka może być tego przyczyna?

Portret użytkownika EDC

Odp. ATmega328p

Jaką masz wersję Bascoma? Podstawowe RC5 działa własnie do 64 komend. Cytat z instrukcji

Quote:
The command sequence is six bits long, allowing up to 64 different commands per address

Jest jeszcze Extended ale nie mam pilota z wyższymi kodami żeby sprawdzić.
Procesor nie ma tu nic do rzeczy chyba. Jedyne na co zwróciłbym uwage to to że Timer0 musisz sobie odpuścić w swoim projekcie bo jest zajęty przez RC5. Więc jesli masz tam jeszcze coś na Timer0 to musisz to przenieść na Timer2.

-

BARTek
Moja strona

Portret użytkownika pablo5-5

Wersja Bascoma 2.0.7.3.

Wersja Bascoma 2.0.7.3. Niczego innego nie używam w Timer0.
Co to jest ten: Extended?
Ten sam program na ATmega8 działa, na 328p - nie.

Portret użytkownika EDC

Odp. ATmega328p

Możesz spróbować utworzyć nowy projekt i tam skopiować kod bez nagłówka $regfile i na samym końcu dodać ten z 328p.
(albo zapisz jako nowy)
Chodzi o to by pozbyć się pliku CFG który jest obok projektu. Jeśli kompilator przy kopiowaniu zapyta czy "Leave the CFG file? " to odpowiedz "No"
Czasem pewne ustawienia są brane z pliku CFG i warto przy innym procesorze stworzyć nowy projekt niż tylko zmieniać nagłówek.
Zobacz też czy nie używasz tam starego Waitms przy Config RC5, a jak nie, to na odwrót, spróbuj dopisać.
FuseBity masz ustawione? Bo fabrycznie nowa śmiga chyba na 1MHz (ma włączony CKDIV8)

-

BARTek
Moja strona

Portret użytkownika pablo5-5

ATmega328p

Witam, wrzucam kod całego mojego programu:

$regfile = "m328pdef.dat"
$crystal = 8000000
 
$lib "mcsbyte.lbx"
$baud = 19200                                                                  ' use baud rate
 
Config Portb = &B00000110 : Portb = &B00000000                                 'config: 0-wejście, 1-wyjście: stan początkowy
Config Portc = &B00011011 : Portc = &B00000000
Config Portd = &B00000000 : Portd = &B00000000
 
Config Rc5 = Pind.2 , Timer = 2 , Wait = 2000
Set Portd.2
 
Triak1 Alias Portb.1
Triak2 Alias Portb.2
Triak3 Alias Portc.0
Triak4 Alias Portc.1
Test Alias Portc.3
Test2 Alias Portc.4
 
Const Liczba_krokow = 200
 
'Config Timer1
Set Tccr1b.3                                                                   'tryb CTC: WGM11
Set Tccr1b.1                                                                   'Prescale = 8: CS11
Set Timsk1.1                                                                   'włączenie przerwań od układu porównującego licznika Timer1A: OCIE1A
Ocr1a = 44.6
On Oc1a Przertimer1
 
Config Int1 = Rising
On Int1 Przerint1
 
Enable Interrupts
Enable Int1
 
Dim Kanal1_green As Integer
Dim Kanal2_blue As Integer
Dim Kanal3_yellow As Integer
Dim Kanal4_red As Integer
Dim Bufor_g As Integer
Dim Bufor_b As Integer
Dim Bufor_y As Integer
Dim Bufor_r As Integer
Dim Kroki As Word
Dim I As Byte
Dim L As Byte
Dim Ac230_on As Bit : Ac230_on = 0
Dim Adres As Byte
Dim Komenda As Word
Dim Komenda_new As Word
Dim Togglebit As Bit
Dim Odebr_kod As Bit : Set Odebr_kod
Dim Jasnosc_100proc As Bit : Jasnosc_100proc = 0
Dim Jasnosc_0proc As Bit : Jasnosc_0proc = 1
Dim Jasnosc_25proc As Byte : Jasnosc_25proc = 17
Dim Jasnosc_50proc As Byte : Jasnosc_50proc = 32
Dim Jasnosc_75proc As Byte : Jasnosc_75proc = 42
Dim Max_jasnosc As Byte : Max_jasnosc = 60
Dim Aktualna_jasnosc As Byte
Dim Jasnosc_50proc2 As Byte
 
Declare Function Procent(byval Krok_fun As Byte) As Integer
Declare Sub Jasniej
Declare Sub Ciemniej
 
Do
Getrc5(adres , Komenda)
If Adres <> 255 Then
   Komenda = Komenda And &B01111111
 
   Select Case Komenda
      Case 12:
         If Jasnosc_100proc = 0 Then
            Jasnosc_0proc = 0
            For I = 0 To Max_jasnosc
               Call Jasniej
            Next I
            Aktualna_jasnosc = I - 1
            Jasnosc_100proc = 1
         Elseif Jasnosc_100proc = 1 Then
            For I = Aktualna_jasnosc To 0 Step -1
               Call Ciemniej
            Next I
            Aktualna_jasnosc = I + 1
            Jasnosc_100proc = 0
            Jasnosc_0proc = 1
         End If
         Komenda = 0
         Adres = 255
 
      Case 108:
         Test = 1
 
      Case 107:
         Test = 0
 
   End Select
   Adres = 255
End If
 
Loop
End
 
Function Procent(byval Krok_fun As Byte)
   Local A As Word
   Local B As Word
 
   A = Liczba_krokow
   B = Krok_fun * A
   Procent = B / 100
End Function
 
Sub Jasniej
   Kanal1_green = Procent(i)
   Kanal2_blue = Procent(i)
   Kanal3_yellow = Procent(i)
   Kanal4_red = Procent(i)
   Waitus 2
End Sub
 
Sub Ciemniej
   Kanal1_green = Procent(i)
   Kanal2_blue = Procent(i)
   Kanal3_yellow = Procent(i)
   Kanal4_red = Procent(i)
   Waitus 4
End Sub
 
Przertimer1:
If Bufor_g = Kroki And Bufor_g > 0 And Kroki > 0 Then
   Triak1 = 1
End If
If Bufor_b = Kroki And Bufor_b > 0 And Kroki > 0 Then
   Triak2 = 1
End If
If Bufor_y = Kroki And Bufor_y > 0 And Kroki > 0 Then
   Triak3 = 1
End If
If Bufor_r = Kroki And Bufor_r > 0 And Kroki > 0 Then
   Triak4 = 1
End If
 
Decr Kroki
 
Return
 
Przerint1:
 
Reset Tccr1b.1                                                                 'zatrzymanie Timer1
 
Triak1 = 0 : Triak2 = 0 : Triak3 = 0 : Triak4 = 0                              'wyłączenie wszystkicha triaków
 
Kroki = Liczba_krokow
 
Bufor_g = Kanal1_green
Bufor_b = Kanal2_blue
Bufor_y = Kanal3_yellow
Bufor_r = Kanal4_red
 
Tcnt1 = 0
 
Set Tccr1b.1
Set Ac230_on
 
Return

Wykorzystuję w nim Timer1 do sterowania fazowego (regulacja jasności żarówek na czerech kanałach). Timer ten musiałby pozostać niezmieniony, nietknięty, tym bardzie, że nie mam w domu oscyloskopu, żeby cokolwiek podejrzeć.
Zauważyłem, że gdy skrócę czas wykonywania przerwania od Timera1, tzn.: "Przertimer1", np. usunę linię:

Decr Kroki

wtedy pilot działa poprawnie, tzn. wykrywa przyciski o komendzie większej niż 64. Jeżeli tylko ta powyższa linia jest, przyciski o kodzie powyżej 64 (np. 107, 108) są nie rozpoznawalne przez ATmegę.
Wygląda tak jakby te dwa Timery (Timer1 i Timer2) gryzy się ze sobą. Próbowałem zmienić timer pilota na Timer0, ale nic to nie dało, podobnie jak usunięcie polecenia Wait = 2000 w linii konfiguracyjnej RC5.

Może ktoś znajdzie jakiś błąd w moim programie, co jest źle.

Portret użytkownika EDC

Odp.ATmega328p

Tak z marszu bym zrezygnował z tego $lib "mcsbyte.lbx" albo wpisał $lib "mcsbyteint.lbx".
Potem zmienił bym zapis tego przerwania bo każdy And wymaga obliczenia tych trzech warunków a na końcu porównania/zsumowania ich wyników.
Napisał bym to przynajmniej tak:

Przertimer1:
If Kroki > 0 Then
 
 If Bufor_g > 0 Then
  If Bufor_g = Kroki Then Triak1 = 1
 End If
 
 If Bufor_b > 0 Then
  If Bufor_b = Kroki Then Triak2 = 1
 End If
 
 If Bufor_y > 0 Then
  If Bufor_y = Kroki Then Triak3 = 1
 End If
 
 If Bufor_r > 0 Then
  If Bufor_r = Kroki Then Triak4 = 1
 End If
 
End If
 
Decr Kroki
 
Return

..jak nie całkiem inaczej, ale to może jutro :)

-

BARTek
Moja strona

Portret użytkownika pablo5-5

Dzięki, teraz działa super.

Dzięki, teraz działa super. Nawet sterowanie jasnością żarówki też działa lepiej. Wtedy niby działało, ale w pewnych krytycznych sytuacjach, trochę się chrzaniło. Teraz jest idealnie.
A możesz mi powiedzieć dlaczego tamta wersja przerwania (ta moja pierwotna) była zła i powodowała tyle problemów? To przerwanie trwało zbyt długo, czy jak?

Portret użytkownika EDC

Odp. ATmega328p

W Bascom tak samo zapisuje się bitowy iloczyn logiczny jak i iloczyn logiczny. Może to brzmi jak masło maślane ale sens widać w porównaniu do zapisu w C.
Bitowy iloczyn logiczny w C zapisujemy & co znaczy w Bascom And
Iloczyn logiczny w C zapisujemy && co znaczy w Bascom również And
Różnica polega na tym,że przy bitowym iloczynie bit po bicie porównujemy ze sobą bity i wynikiem może być 1 albo 0.
Żeby natomiast iloczynem porównać trzy warunki trzeba je najpierw obliczyć czy na przykład A jest większe od B co daje znów 1 albo 0, potem czy C jest większe D co daje 1 albo 0 i dopiero na końcu porównać te wyniki czyli czy na przykład są to dwie jedynki które trzeba jeszcze na czas obliczeń przechowywać.
Tak więc jeśli używamy And w odniesieniu do "Bitów" wynik mamy natychmiast a w odniesieniu do warunków wymaga to obsługi całego porównania mimo że zapisane jest podobnie.
And używam więc najczęściej do operacji na bitach. Jeśli decyzja ma być podjęta przy kilku warunkach to lepiej je zagnieździć. Przykładem może być to pod spodem. Obydwa zapisy robią dokładnie to samo z ta róznicą że ten zapis bez And zajmuje 16 bajtów mniej w procesorze! Co się przekłada na zapis wielu instrukcji.

If A > B And C < D Or F > G And G < D Then Set Status_bit 
 
If A > B Then 
 If C < D Then Set Status_bit 
Elseif F > G Then 
 If G < D Then Set Status_bit 
End If 
 

Wyrażenia "porównanie" użyłem w celu zobrazowania. Iloczyn to oczywiście mnożenie. Jeśli coś mnożymy razy zero to wynik będzie zero. Jeśli więc jednym z wyników będzie zero to będzie to dla procesora wyglądało tak: 1 x 1 x 0 =?
Tylko trzy jedynki dają jeden, a każde zero daje na końcu wynik zero.
Każda cyfra pomnożona przez zero daje zero.

-

BARTek
Moja strona

Portret użytkownika jaman

Jakiego ukladu wykonawczego

Jakiego ukladu wykonawczego uzyc aby wlaczyc tasme led na 12V?

Portret użytkownika mirley

Re: RC5

Do tasmy led to najlepiej użyć tranzystora mosfet N, 5V na jego bramce powinno wystarczyc do jego otwarcia.

Tranzystor powinien byc podłączony od strony masy, bramka do procesora, źródło do masy a dren do katody (-) taśmy led. anoda taśmy led powinna byc podłączona do zasilacza, którego masa powinna byc wspólna z ukladem Rc5 i tranzystorem mosfet

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Grzegorz N

sterowanie

Witam!

Czy dało by się użyć tego modułu jaki części zdalnego sterowania wzmacniacza?
Potrzebne były by cztery sygnały. Dwa ze stanem wysokim tak długo jak wciśnięty jest dany klawisz (VOL+ oraz Vol-) na pilocie oraz trzy zmieniające stan po przyciśnięciu danego klawisza (power on/off oraz wejście A/B i mute on/off).
Stany tych trzech ostatnich musiały by zostac zapisane nawet po wyłączeniu zasilania.
Było by możliwe takie wykorzystanie układu?

A może jakiś inny pomysł?

Portret użytkownika matrix

Re: sterowanie

Raczej na 999% nie jest możliwe wykorzystanie w ten sposób tego układu. Wszystko jeszcze zależy od tego jakim sygnałem sterowane są przyciski w Twoim wzmacniaczu. Ale jak pisałem, na 99% nie.
Napisz jaki masz wzmacniacz to może coś wymyślimy...

Portret użytkownika mirley

Re: pilot

Problem to będzie z trzymaniem klawisza... bo nie ma z pilota sygnału zwrotnego kiedy puszczono klawisz.... pilot generuje impulsy jak klawisz jest trzymany a zatem trzeba programowo podtrzymac stan i opóścić go jak nie pojawi się kolejny impuls.... szczerze mówiąc nie wiem czy jest to konieczne bo jak masz wzmacniacz cyfrowy to on powinien na te impulsy tez zareagowac dobrze...

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika lucastg

Sterowanie ciagłe

Witam mam pytanie jak zmienic kod by podawał stan wysoki na wyjściu tak długo jak bedzie wciśniety dany klawisz pilota ? ( chodzi mi oto ze wciskam klawisz pilota i na pinie pojawia sie stan wysoki ale nie na jakis ustalony czas tylko ciagle do momentu puszczenia klawisza ) ?

Portret użytkownika marekszy

re.Sterowanie ciagłe

A czytałeś post 50 na stronie 8