[BASCOM] RC5. Co robie nie tak? ;/

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Zablokowany
Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

[BASCOM] RC5. Co robie nie tak? ;/

Post autor: Thor » 18 mar 2007, 10:03

Witam zaczolem sie bawic przesylaniem komend na Rc5 i jakos mi to nie dziala. Raz udalo mi sie zrobic ale jak chcialem dac na wiecej kanalow to nie dzialalo mi to ;/ ;/, a potem nawet na 1 kanal ;/ ;/. Odbiornik to TFMS5480 a nadajnik zwykla dioda podczerwona. Wiem ze w nadajniku ma byc 5 przyciskow ale chcialem chociaz na 3 zrobic, a potem bym zdeklarowal te dwa kolejne i analogicznie do tych trzech, ale ze zmiana komend wysylanych :)

A programik napisalem w BASCOM i na ATmega8

Oto programim odbiornika:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Declare Sub P1
Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Led1 Alias Portc.5
Led2 Alias Portc.4
Led3 Alias Portc.3
Led4 Alias Portc.2
Led5 Alias Portc.1

Config Rc5 = Pind.2

Dim Address As Byte , Command As Byte
Enable Interrupts

Do
 Getrc5(address , Command)
 Command = Command And &B01111111
  If Address <> 255 Then
   Call P1
    End If
     Loop
End

 Sub P1:
If Command = 1 Then
Toggle Led1
End If

If Command = 2 Then
Toggle Led2
End If

If Command = 3 Then
Toggle Led3
End If

If Command = 4 Then
Toggle Led4
End If

If Command = 5 Then
Toggle Led5
End If

End Sub
A tutaj nadajnika:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinb.1 = Output

Dim Command As Byte , Address As Byte , Togbit As Byte

S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2

Set Portc.0
Set Portc.1
Set Portc.2


Do
 Debounce S1 , 0 , P1 , Sub
 Debounce S2 , 0 , P2 , Sub
 Debounce S3 , 0 , P3 , Sub
Loop

End

P1:
 Command = 1
   Togbit = 0
   Address = 1
 Do
   Rc5send Togbit , Command , Address
 Loop Until S1 = 1
Return

P2:
 Command = 2
  Togbit = 0
  Address = 2
 Do
  Rc5send Togbit , Command , Address
 Loop Until S2 = 1
Return

P3:
 Command = 3
  Togbit = 0
 Address =3
 Do
  Rc5send Togbit , Command , Address
 Loop Until S3 = 1

Return
Pozdrawiam Bartek

ps program poprawilem jak by ktos chcial to dziala


--------
Proszę w przyszłości ułatwić użytkownikom analizę, stosując się do zaleceń we "Wskazówkach dla piszących". ZbeeGin
Ostatnio zmieniony 19 mar 2007, 21:13 przez Thor, łącznie zmieniany 2 razy.

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 18 mar 2007, 13:45

witam,
RC5 jest modulowany nośną 36kHz, a ty masz odbiornik na 40 kHz.
Albo coś w oznaczeniach odbiornika nie tak (?).

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 18 mar 2007, 14:05

hmm mozliwe ze to to jest ze odbiornik mam zly ;/ jutro postaram sie kupic TFMS5360 bo ma wlasnie 36kHz i dam znac czy to dziala a programik sadze ze Dobrze napisany a inne pytanie jak przerobic ten program aby dzialal pod 38kHz bo TFMS5380 dziala na takiej czestotliwosci a nie na 40kHz:)



Pozdrawiam Bartek

piotrek7700
Użytkownik
Posty: 105
Rejestracja: 09 mar 2006, 8:15
Lokalizacja: Leszczyna
Kontakt:

Post autor: piotrek7700 » 19 mar 2007, 15:20

ja miałem pare tyg kłopot z rc5. ale kupiłem TFMS5360 dobudowałem mały pilocik na jakimś walającym się tiny2313 i wszytsko działa. w przypadku tiny trzeba zmienić w fusebitach żeby nie dzielił częstotliwości . wszystko ładnie pięknie działa więc jak będziesz miał pilot pracujący w rc5 to będzie działać. ja chodziłem po wiosce i okazało się że....nikt nie miał pilota na rc5:)

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 19 mar 2007, 21:12

wiec tak dobry Koledzy wymienilem odbiornik na TFMS5360 i nie dziala bo mam blad w programie a no taki ze Adresowanie nie moze byc zerem musi to byc liczba od 1 do 255
wiec w komedzie address=1,2,3 itd do 255 :) , a mam pytanie do was jedno jak zrobic ze jak wlaczam tzn naciskam guzik to dioda mi mruga musze szybko nacisnac aby mi nie zgasla dokladnie mi chodzi o to ze jak wlacze przycisk S1 to nie moge go juz drugi raz wlaczyc tylko np S2 albo S3 a jak S3 mam to Tylko S1 i S2 wiem jak zrobic aby gasly jak wlaczona S1 to reszta wylaczona ale tak aby mi nie mrugala ale jak raz nacisne to zalaczy sie a jak inny guzik to zgasnie ta a zalaczy sie inna i tak samo jak S1 raz zalaczy sie a nie bedzie zalaczac i gasnac itp

pozdrawiam Bartek

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 20 mar 2007, 11:22

witam,
Jeśli chodzi o odbiornik to oznaczenie które podałeś w pierwszym poscie brzmi TFMS5480. Wnioskuję z tego, że pomyliłeś się i chodziło ci o 40 kHz, a nie jak napisałeś w oznaczeniu 48 kHz.

Dalej, adress może być zerem zmień:

If Address <> 255 Then

na np.

if address >= 0 then cośtam

lub

if address = 0 then cośtam

Wszystko zależy jaki masz pilot, typowy pilot do TV nadający w standardzie RC5 działa na adresie = 0. Co nie zmienia faktu że mając nadajnik i odbiornik możesz sobie nadać co chcesz.

Odpowiedź na poprzednie pytanie, nie da się przerobić tego programu żeby działał na 38 kHz ani na żadną inną ilość kHz bo funkcja RC5SEND i GETRC5 jest napisana tylko i wyłącznie na częstotliwość 36 kHz. Można oczywiście zmodyfikować tą funkcję w assemblerze, ale wątpię żeby o to Ci chodziło.

Co do przycisków z diodami to (jeżeli dobrze zrozumiałem) chodzi Ci o to, żeby po naciśnięciu S1 mrugała dioda Led1, ale nie można było już użyć przycisku S1. Natomiast aktywne mogły by być S2 i S3. Przy czym wciśnięcie następnie S2 powodowałoby mruganie Led2, zgaszenie Led1 i czyniło by przycisk S2 nieaktywnym. Dobrze zrozumiałem?

Jeżeli tak to tutaj masz kod:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Declare Sub P1
Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Led1 Alias Portc.5
Led2 Alias Portc.4
Led3 Alias Portc.3
Led4 Alias Portc.2
Led5 Alias Portc.1

Config Rc5 = Pind.2

Dim Address As Byte , Command As Byte
Dim Led As Byte
Enable Interrupts

Do
 Getrc5(address , Command)
 Command = Command And &B01111111
  If Address <> 255 Then
   Call P1
    End If

     If Led = 1 Then
      Toggle Led1
        Led2 = 0
        Led3 = 0
        Led4 = 0
        Led5 = 0
     End If


     If Led = 2 Then
      Toggle Led2
        Led1 = 0
        Led3 = 0
        Led4 = 0
        Led5 = 0
     End If
     If Led = 3 Then
      Toggle Led3
        Led2 = 0
        Led1 = 0
        Led4 = 0
        Led5 = 0
     End If
     If Led = 4 Then
      Toggle Led4
        Led2 = 0
        Led3 = 0
        Led1 = 0
        Led5 = 0
     End If
     If Led = 5 Then
      Toggle Led5
        Led2 = 0
        Led3 = 0
        Led4 = 0
        Led1 = 0
     End If
 Waitms 100                                                 'zeby zobaczyc mruganie diody
Loop
End

Sub P1:
If Command = 1 Then Led = 1

If Command = 2 Then Led = 2

If Command = 3 Then Led = 3

If Command = 4 Then Led = 4

If Command = 5 Then Led = 5

If Command > 5 Then Led = 0
End Sub
Może nie elegancko to wygląda ale na szybkiego to tak można zrobić.
pozdrawiam
Ostatnio zmieniony 20 mar 2007, 17:40 przez asdek, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 20 mar 2007, 17:42

asdek pisze:... bo funkcja RC5SEND i GETRC5 jest napisana tylko i wyłącznie na częstotliwość 36 kHz
Co do funkcji RC5SEND to się zgodzę, jednak przy GETRC5 to odbiornik demoduluje częstotliwość nośną i procesor otrzymuje tylko dane binarne: "1"-jest nośna i "0"-brak nośnej.

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 20 mar 2007, 20:34

Witam Wiec tak to sa te programiki jak narazie dzialaja ale chodzi mi o to wlasnie jaka komeda albo jak zdeklarowac to ze jak jest wcisniety S1 to mi sie zalaczy dioda a nie bedzie mrugac a jak wcisne S2 to zgasnie dioda Led1 a zaswieci sie Led2 to juz zrobilem ale wlasnie chodzi mi o to aby mi nie mrugala i raz moge tylko nacisnac S1 albo inne to tylko zmieni swoj stan licznika na przeciwne a nie bedzie zmieniac tak dlugo jak S1 jest wcisniete :)



To jest nadajnik tzn pilot

Kod: Zaznacz cały

 ' nadajnik IRDA ATmega 8 5 kanałów

$regfile = "m8def.dat"
$crystal = 8000000

Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinb.1 = Output

Dim Command As Byte , Address As Byte , Togbit As Byte

S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2
S4 Alias Pinc.3
S5 Alias Pinc.4

Set Portc.0
Set Portc.1
Set Portc.2
Set Portc.3
Set Portc.4

Do
  Debounce S1 , 0 , P1 , Sub
  Debounce S2 , 0 , P2 , Sub
  Debounce S3 , 0 , P3 , Sub
  Debounce S4 , 0 , P4 , Sub
  Debounce S5 , 0 , P4 , Sub
Loop

End

P1:
  Command = 1
  Togbit = 0
  Address = 1
  Do
    Rc5send Togbit , Command , Address
  Loop Until S1 = 1
Return

P2:
  Command = 2
  Togbit = 0
  Address = 2
  Do
    Rc5send Togbit , Command , Address
  Loop Until S2 = 1
Return

P3:
  Command = 3
  Togbit = 0
  Address = 3
  Do
    Rc5send Togbit , Command , Address
  Loop Until S3 = 1
Return

P4:
  Command = 4
  Togbit = 0
  Address = 4
  Do
    Rc5send Togbit , Command , Address
  Loop Until S4 = 1
Return

P5:
  Command = 5
  Togbit = 0
  Address = 5
  Do
    Rc5send Togbit , Command , Address
  Loop Until S5 = 1
Return
A to jest odbiornik:

Kod: Zaznacz cały

'Odbiornik IRDA ATmega8 5 Kanalowy

$regfile = "m8def.dat"
$crystal = 8000000

Declare Sub P1

Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Led1 Alias Portc.5
Led2 Alias Portc.4
Led3 Alias Portc.3
Led4 Alias Portc.2
Led5 Alias Portc.1

Config Rc5 = Pind.2

Set Led2
Set Led3
Set Led4
Set Led5

Dim Address As Byte , Command As Byte

Enable Interrupts

Do
  Getrc5(address , Command)
  Command = Command And &B01111111
  If Address <> 255 Then
    Call P1
  End If
Loop

End


Sub P1:
If Command = 1 Then
  Toggle Led1
  Set Led2
  Set Led3
  Set Led4
  Set Led5
End If

If Command = 2 Then
  Toggle Led2
  Set Led1
  Set Led3
  Set Led4
  Set Led5
End If

If Command = 3 Then
  Toggle Led3
  Set Led1
  Set Led2
  Set Led4
  Set Led5
End If

If Command = 4 Then
  Toggle Led4
  Set Led1
  Set Led2
  Set Led3
  Set Led5
End If

If Command = 5 Then
  Toggle Led5
  Set Led1
  Set Led2
  Set Led3
  Set Led4
End If

End Sub

Pozdrawiam Bartek
Ostatnio zmieniony 20 mar 2007, 21:02 przez Thor, łącznie zmieniany 1 raz.

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 21 mar 2007, 12:15

Nic nie rozumiem z tego co napisałeś :P
Spróbuj używać znaków przestankowych może się dogadamy :)

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 21 mar 2007, 16:42

ehh ok mam wlaczone S1 automatycznie gdy wlacze mikrusa pod napiecie i w danej chwili nie moge drugi raz go wlaczyc , ale moge wlaczyc S2 lub S3 lub S4 lub S5 jesli wlacze np S2 to nie moge go juz uzyc ale moge uzyc S1 ,S3, S4 ,S5 to pierwsza czesc cio bym chcial zrobic Tylko nie wiem jak ;/ ;/


Druga czesc to ze jak nacisne np S2 to zmieni mi sie stan licznika tylko raz nawet jak przytrzymam go 10 sek a jak po 1 min nacisne go jeszcze raz to sie nic nie zmieni czyli jak bedzie aktywny np s2 to nie umiem go drugi raz wlaczyc i stan licznika tylko raz sie zmieni albo z 0 na 1 albo z 1 na 0

chyba rozumiesz ?

Pozdrawiam Bartek

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 21 mar 2007, 18:37

Wstaw

Kod: Zaznacz cały

TOGGLE Togbit
zamiast

Kod: Zaznacz cały

Togbit = 0
bo odbiornik nie wie, że zmienił się stan przycisku...
Albo... wstaw pierwsze polecenie w pętli DO...LOOP sprawdzającej stan przycisku (w podprogramie).

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 02 kwie 2007, 8:47

Witam Udalo mi sie to zrobic co chcialem :):)

pozdrawiam Bartek
Załączniki
Odbiornik IRDA ATmega8 5 Kanalowy.zip
(581 Bajtów) Pobrany 337 razy

Zablokowany