logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Dlaczego program na AT90S8535 nie odbiera kodu RC5 z TFMS5360?

Mikolaj_pl 12 Lis 2004 03:56 2677 20
REKLAMA
  • #1 979381
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Witam, mam pytanko dlaczego ten program nie działa.
    Program ma za zadanie odbierać kod RC5. Po sczytaniu kodu ma go podać na wyświetlacz.
    Do nóżki d.2 podłączyłem TFMS5360 w raz z opornikiem i kondensatorem. Procek zastosowałem AT90S8535.

    $regfile = "8535def.dat"
    $crystal = 8000000

    Enable Interrupts

    Dim A As Byte
    Dim B As Byte

    Config Rc5 = Pind.2
    Config Pind.2 = Input

    Do
    Enable Int0 'włączenie przerwania
    On Int0 Zczytywanie Nosave 'nastąpi skok
    Stop
    Zczytywanie:
    Getrc5(a , B) 'A - adres B - comand
    Cls
    Lcd A
    Lowerline
    Lcd B
    Waitms 500

    Disable Int0

    Loop

    Proszę o pomoc

    Pozdrawiam
  • REKLAMA
  • #2 979436
    Piotrek_P
    Poziom 18  
    Posty: 253
    Pomógł: 24
    Zrezygnuj z obsługi przerwania.
    W pętli zostaw tylko GetRc5... oraz instrukcje wyświetlające wynik na lcd.

    Pozdrawiam
    Piotrek
  • #3 979472
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Prawdopodobnie źródłem twojego problemu jest napisanie NOSAVE w deklaracji procedury obsługi przerwania . Oznacza to żęby BASCOM nie odkładał żadnych rejestrów na stosie przy wejściu do procedury przerwania
    Uzywa sie tego TYLKO wtedy gdy procedura jest napisana w asemblerze i wiesz jakich rejestrów używasz ( Ewentualnie instrukcje BASCOMA które nie zmnieniają rejestrów )
    U ciebie program idzie w maliny
    Tak w ogóle to procedura obsługi przerwania powinna być ( może nawet musi ) po ostatniej instrukcji programu zakończonej "END" ( u ciebie w ogóle nie widze ).

    I powiedz mi jeszcze po co uzywasz STOP - zatrzymujesz program zanim się na dobre zacznie.
    Nie będę poprawiał Twojego kodu - skorzystaj z helpa.

    ----------------------------------
    Config Rc5 = Pind.2

    'the interrupt routine is inserted automatic but we need to make it occur
    'so enable the interrupts
    Enable Interrupts

    'reserve space for variables
    Dim Address As Byte , Command As Byte
    ' NIE WIDZIAŁEM U CIEBIE DEKLARACJI POŁĄCZEŃ Z WYŚWIETLACZEM - CZYŻBYŚ MIAŁ DOKŁADNIE POŁĄCZENIE STANDARDOWE ??
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6


    ' "Waiting for RC5..."

    Do
    'now check if a key on the remote is pressed
    'Note that at startup all pins are set for INPUT
    'so we dont set the direction here
    'If the pins is used for other input just unremark the next line
    'Config Pind.2 = Input
    Getrc5(address , Command)

    'we check for the TV address and that is 0
    If Address = 0 Then
    'clear the toggle bit
    'the toggle bit toggles on each new received command
    Command = Command And &B01111111
    ' tu fragment Twojego programu
    Cls
    Lcd address
    Lowerline
    Lcd Command

    End If
    Loop
    End

    ------------

    KORZYSTAJ CZĘŚCIEJ Z HELPA !

    POZDRAWIAM
  • #4 979791
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Jeśli chodzi o wyświetlacz, to po prostu tą linijnie wyciąłem. Bo to akurat do tematu nie należy.

    Jeśli chodzi o End to mój błąd po Loop jest End czyli na końcu programu. Po prostu nie do kopiowałem tu.

    Jeśli chodzi o kompilator to ten program kompiluje w baskomie.

    Jeśli chodzi o STOP to program: zatrzymuje się w tym miejscu lecz jak nastąpi przerwanie sprzętowe to skoczy do Zczytywanie:, jeżeli nie to proszę o wytłumaczenie dlaczego.

    A i jeszcze jedno co ta linijka oznacza „Command = Command And &B01111111” bo nigdzie w helpie nie mogłem tego znaleźć, jakby komuś udał się znaleźć to proszę niech mi skopiuje albo wytłumaczy.


    Pozdrawiam
  • #5 979828
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Mikolaj_pl napisał:
    Jeśli chodzi o wyświetlacz, to po prostu tą linijnie wyciąłem. Bo to akurat do tematu nie należy.

    Jeśli chodzi o End to mój błąd po Loop jest End czyli na końcu programu. Po prostu nie do kopiowałem tu.

    Jeśli chodzi o kompilator to ten program kompiluje w baskomie.

    Jeśli chodzi o STOP to program: zatrzymuje się w tym miejscu lecz jak nastąpi przerwanie sprzętowe to skoczy do Zczytywanie:, jeżeli nie to proszę o wytłumaczenie dlaczego.

    A i jeszcze jedno co ta linijka oznacza „Command = Command And &B01111111” bo nigdzie w helpie nie mogłem tego znaleźć, jakby komuś udał się znaleźć to proszę niech mi skopiuje albo wytłumaczy.


    Pozdrawiam


    Programu w mikrokontrolerach zasadniczo sie nie zatrzymuje - po prostu puszcza sie w petle bez konca.

    „Command = Command And &B01111111” maskuje najstarszy bit ( ustawia go na 0 ). Nie wiem po co - mozesz ta linijke usunac.
    A dziala ci cokolwiek z nowym programem ??
  • REKLAMA
  • #6 979834
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Tak to ma wygladac ?

    $regfile = "8535def.dat"
    $crystal = 8000000

    $sim

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 'konfiguracja portow

    'Config Kbd = Portb , Delay = 100 ' konfiguracja portu

    Enable Interrupts 'gobalne włączenie przerwań


    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim E As Byte
    Dim F As Byte
    Dim G As Word
    Dim Odd As Word
    Dim Doo As Word
    Dim Kombinacja As Word
    Dim Liczba As Word
    Dim Czas As Word

    '******************************'
    'tu sie zaczyna prgramik do rc5'
    '******************************'




    Config Rc5 = Pind.2
    Config Pind.2 = Input


    Do

    Getrc5(a , B)


    If A = 0 Then

    B = B And &B01111111

    Cls
    Lcd A
    Lowerline
    Lcd B

    End If


    Loop



    End

    Pozdrwiam
  • #7 979847
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Glowna petla ( wywal 3 linijki ):
    
    Do 
    
    Getrc5(a , B) 
    
    
    'If A = 0 Then 
    
    'B = B And &B01111111 
    
    Cls 
    Lcd A 
    Lowerline 
    Lcd B 
    
    'End If 
    
    
    Loop 
    

    i powinno dzialac bez warunkowo .... a moze sie myle - ale raczej powinno dzialac
  • #8 979896
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Oj ale głupoty na wyświetlaczu pokazuje, nie po wciśnięciu klawisza na pilocie tylko po włączeniu zasilacza. Na naciśniecie klawisza w pilocie nie reaguje.
    Pozdrawiam
  • #9 979906
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Mikolaj_pl napisał:
    Oj ale głupoty na wyświetlaczu pokazuje, nie po wciśnięciu klawisza na pilocie tylko po włączeniu zasilacza. Na naciśniecie klawisza w pilocie nie reaguje.
    Pozdrawiam


    a sprobuj na wyswietlaczu napisac cokolwiek - np jakis tekst - czy masz na pewno dobrze podlaczony i skonfigurowany LCD??
  • #10 979912
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Pin RW na wyswietlaczu masz polaczony z masa ??
  • REKLAMA
  • #11 979950
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Szanowny Panie al555 ten programik co tu na forum umieściłem to miało być tylko przerobienie pewnego dużego napisanego przeze mnie programu. A dokładniej wyrzucenie klawiaturki i przejście na pilot.

    Czyli zastąpienie tego:
    Do
    A = Getkbd()
    Loop Until A < 16

    Programem zczytujączym kod RC5

    Cały program wcześniej działał z tymi co już napisałem ustawieniami wyświetlacza LCD i wyświetlał wszystko to co chciałem :).
    Gdzieś z tą pętlą jest błąd.

    Pozdrawiam
  • REKLAMA
  • #12 979973
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    W Helpie pisze ze GetRC5 uzywa licznika Timer0. Czy ty w swoim programie nie uzywasz go jawnie lub nie jawnie ( np.transmisja szeregowa)

    Sprobuj

    CONFIG RC5 = pin ,TIMER=2

    to powinno pomoc - jesli nie to sprawdz polaczenia odbiornika

    Pozdrowienia
  • #13 980317
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Cały ten port czyli D jest jeszcze nie zagospodarowany.

    Połączenia też są ok..

    A z tym TIMER to strzelasz ?, dlatego się pytam bo za każdym razem co mi napiszesz lecę do kolesia do 2 akademika i dopiero tam programuje. Wiec jak możesz to napisz mi kilka opcji abym tylko raz czy dwa się jeszcze do niego przeleciał.

    Pozdrawiam
  • #14 980520
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    FRAGMENT opisu do "CONFIG RC5" Z HELPU BASCOMa

    ===============================
    Action
    Overrides the RC5 pin assignment from the Option Compiler Settings.


    Syntax
    CONFIG RC5 = pin [,TIMER=2]


    Remarks

    Pin The port pin to which the RC5 receiver is connected.
    TIMER Must be 2. The micro must have a timer2 when you want to use this option. This additional parameter will cause that TIMER2 will be used instead of the default TIMER0.
    When you use different pins in different projects, you can use this statement to override the Options Compiler setting for the RC5 pin. This way you will remember which pin you used because it is in your code and you do not have to change the settings from the options. In BASCOM-AVR the settings are also stored in the project.CFG file.


    See also
    GETRC5


    Example
    CONFIG RC5 = PIND.5 'PORTD.5 is the RC5 input line
  • #15 981032
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Jak ty będziesz do mnie pisał po angielsku a ja do ciebie po polsku to się chyba człowieku nie dogadamy. Widzę że niektórzy lubią bezmyślnie coś wkleić a nie się poważnie zastanowić nad problemem. Jeśli w tym kierunku będą szły twoje następne posty. To znajdź sobie inny dział i coś tam sobie wklejaj. W ogóle nie rozumiem do czego ty zmierzasz, wcale mi sprawy nie objaśniasz a klepiesz te posty jeden za drugim. Nawet jeśli już chcesz coś wkleić z helpa to przecież możesz z polskiego i nie kopiując całego opisu tylko pewną część, jasno i zwięźle tłumacząc o co chodzi.
    Wcale nie chce cię obrażać ale taka pomoc mi nie jest potrzebna. Pewnie w tym momencie pomyślałeś że wcale nie musisz mi pomagać i wiesz ja się z tobą zgadzam.
    Lecz jeśli dalej zamierzasz mi pomóc to nie rób wklejanki helpa BASCOMA z tego forum.

    Pozdrawiam

    P.S. Nie mam problemów z angielskim !.
  • #16 981171
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Mikolaj_pl napisał:
    Jak ty będziesz do mnie pisał po angielsku a ja do ciebie po polsku to się chyba człowieku nie dogadamy. Widzę że niektórzy lubią bezmyślnie coś wkleić a nie się poważnie zastanowić nad problemem. Jeśli w tym kierunku będą szły twoje następne posty. To znajdź sobie inny dział i coś tam sobie wklejaj. W ogóle nie rozumiem do czego ty zmierzasz, wcale mi sprawy nie objaśniasz a klepiesz te posty jeden za drugim. Nawet jeśli już chcesz coś wkleić z helpa to przecież możesz z polskiego i nie kopiując całego opisu tylko pewną część, jasno i zwięźle tłumacząc o co chodzi.
    Wcale nie chce cię obrażać ale taka pomoc mi nie jest potrzebna. Pewnie w tym momencie pomyślałeś że wcale nie musisz mi pomagać i wiesz ja się z tobą zgadzam.
    Lecz jeśli dalej zamierzasz mi pomóc to nie rób wklejanki helpa BASCOMA z tego forum.

    Pozdrawiam

    P.S. Nie mam problemów z angielskim !.



    Źle odebrałeś moje intencje, chociaż rzeczywiście może niepotrzebnie wklejałem tyle angielskiego chociaż z Twoich informacji wynika momentami jakbyś nie korzystał w ogóle z HELPa.

    Nie nawiązuj już do tego , tylko wklej obszerniejszy fragment ( jeśli to możliwe ze względu na wielkość kodu ) bo trudno się domyśleć co napisałeś w programie.
    Napisz czy używasz gdzieś instrukcji print ( inicjuje automatycznie port szeregowy wraz chyba z Timerem 0 ) ewentualnie wprost czy uruchamiasz Timer0.
    Ponieważ komenda GetRC5 używa domyślnie licznika Timer0 wraz z przerwaniem !! ( nie możesz używać w swoim programie przerwania od licznika Timer0)
    - moze wystąpić konflikt wtedy możesz zmienić używany przez GetRC5 licznik z Timer0 na Timer2 za pomocą składni

    CONFIG RC5 = pin ,TIMER=2

    gdzie pin to numer wyprowadzenia mikrokontrolera do którego podpięty jest odbiornik RC5

    Nie napisałeś czy zmieniłeś Licznik używany przez komende GetRC5 na Timer2 - i jakie efekty.

    Jeśli dostajesz za dużo informacji to zbierz je razem i zrób jedną poprawkę ...

    Trudno zgadnąć co masz w układzie i w programie, stąd tyle podpowiedzi.

    Pozdrawiam i mam nadzieję że to uruchomisz.
  • #17 981999
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Witam

    Dzięki za odpowiedz, pewnie dlatego moje wypowiedzi wyglądają jak bym nie czytał helpa bo jestem „samoukiem programistą” i nikt mi nie tłumaczył co oznaczają poszczególne komendy. A jak widać nie trudno o opaczne ich zrozumienie.
    A wracając do tematu.
    Zawsze jak coś programuje to na początku staram się uruchamiać pewne bloki programu a potem te wszystkie bloki jak mam oczywiście pewność że działają to powiązuje w jedną całość. Dlatego i blok sczytywania kodu RC5 z pilota najpierw staram się oddzielnie uruchomić. Dlatego na razie cały program wygląda tak:

    $regfile = "8535def.dat"
    $crystal = 8000000

    '$sim ' <---- GDY BEDZIEMY CHCIELI WGRAC PROGRAM DO PROCA TO WYKRESLIC !!!!!!!!!

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 'konfiguracja portow

    'Config Kbd = Portb , Delay = 100 ' konfiguracja portu

    Enable Interrupts 'gobalne włączenie przerwań


    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim E As Byte
    Dim F As Byte
    Dim G As Word
    Dim Odd As Word
    Dim Doo As Word
    Dim Kombinacja As Word
    Dim Liczba As Word
    Dim Czas As Word




    Config Rc5 = Pind.2 , Timer = 2
    Config Pind.2 = Input


    Do

    Getrc5(a , B)


    If A = 0 Then

    B = B And &B01111111

    Cls
    Lcd A
    Lowerline
    Lcd B

    End If


    Loop



    End


    To kompiluje i wgrywam do proca.
    Po dokonaniu ostatniej zmiany czyli: „Config Rc5 = Pind.2 , Timer = 2” program dalej nie działa tylko pokazały się na wyświetlaczu w całej pierwszej linii wypełnione kwadraciki.

    Pozdrawiam
  • #18 982208
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Witam.

    
    If A = 0 Then 
    ...
    End If
    


    A dlaczego uparłeś się :wink: na zerowy adres :?:
    A co jeśli piloty(które testujesz) generują adres <>"0" :?: ,w takim przypadku na LCD nic się nie wyświetli( i to właśnie wynika z Twojego opisu).Proponuję usunąć powyższy warunek i powinno zadziałać.
    Wypróbuj to:

    ...
    Cls
    Lcd "Czekam na RC5"
    Do
    Getrc5(a , B)
    REM If A = 0 Then
    B = B And &B01111111
    Cls
    Lcd A
    Lowerline
    Lcd B
    REM End If
    Loop

    End


    Pzdr.
    Piotrek Sz.
  • #19 982351
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Teraz przez chwile wyświetla Czekam na RC5 a potem czyści wyświetlacz i w pierwszej linii wyświetla 255 a w drugiej 127. Gdy naciskam przycisk pilota to nic się nie zmienia.
    Na oko widać że te wartości są z cały czas odświetlane, ponieważ mrugają napisy.
    Ciekawi mnie teraz czy ja mam pilot na RC5. Pilot jest PHILIPSA, a na tym forum mówiono mi że PHILIPS w tym kodzie pracują.

    Pozdrawiam
  • #20 982547
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Hmm...
    Wpiąłem w układ TFMS-a bez żadnych dodatkowych elementów i ... działa :)
    Z pilotem , który napewno nie pracuje w kodzie RC5, odczyt jak u Ciebie :(
    Wnioski pozostawiam Tobie.
    A teraz ostatnia deska ratunku:
    
    Cursor Off
    Cls
    Do
    Home
    Lcd "Czekam na ?"
    If Pind.2 = 0 Then
       Getrc5(a , B)
       If A < 255 Then
       B = B And 127
          Cls : Lcd "A=" ; A ; " " ; "B=" ; B
       Else
          Cls : Lcd "0 na pind.2"
       End If
       Wait 3
    End If
    Loop
    End
    

    Wykrywa wszystkie piloty jakie posiadam(7).
    Dla pilota rc5 pokazuje adres i kod komendy ,a dla innych pilotów , że wykrył niski stan("0") na pind.2"


    Pzdr.
    Piotrek Sz.
  • #21 983073
    Mikolaj_pl
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 18
    Masz racje po prostu pilot nie działa w RC5.

    Dzięki za pomoc.

    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z odbiorem kodu RC5 za pomocą mikrokontrolera AT90S8535 i odbiornika podczerwieni TFMS5360. Użytkownik stosuje BASCOM-AVR i próbuje wyświetlać odebrane kody na LCD. Wskazano, że użycie przerwań i instrukcji STOP w pętli jest nieprawidłowe, a procedura obsługi przerwania powinna być poprawnie zakończona instrukcją END. Zalecano rezygnację z obsługi przerwań i pozostawienie w pętli tylko funkcji GetRC5 oraz wyświetlania wyników. Zwrócono uwagę, że GetRC5 domyślnie korzysta z Timer0, co może powodować konflikt, jeśli Timer0 jest używany w programie; zasugerowano zmianę na Timer2 poprzez konfigurację CONFIG RC5 = pin, TIMER=2. Problemem okazał się brak zgodności pilota z protokołem RC5 – pilot Philipsa używany przez autora nie generował kodów RC5, co potwierdzono testami z innymi pilotami. Wskazano również na konieczność poprawnego podłączenia i konfiguracji wyświetlacza LCD oraz eliminację warunków filtrujących adresy w kodzie, które mogły blokować wyświetlanie. Ostatecznie problem wynikał z niekompatybilności pilota z protokołem RC5, a nie z błędów w kodzie lub sprzęcie.
Wygenerowane przez model językowy.
REKLAMA