Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM]Zegar na atmega 8 i odbiór kodu RC5 w tle

łuki_mar44 10 Lip 2010 22:29 3051 8
  • #1 10 Lip 2010 22:29
    łuki_mar44
    Poziom 18  

    Witam!

    Od niedawna męczę się z odebraniem kodu Rc5 w tle działania innego programu.
    W moim wypadku jest to zegar z budzikiem na LCD który działa bez problemu lecz jak tylko dorzucę do programu procedurę odbierania Ir to wtedy przestaje mi liczyć czas mój zegar.

    Niżej zamieszczam przykładowy program z odliczaniem 1 sekundy przez Timer0 i dodanym do tego programem do odbioru Kodu Rc5 w przerwaniu Int0. Dodam, że obydwa programy pojedynczo działają bez problemu.



    Code:

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

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

    Config Timer0 = Timer , Prescale = 256
    Config Int0 = Low Level
    Config Portd.0 = Output

    On Int0 Pobr_rc5
    On Timer0 Odmierz_1s

    Dim Odebr_kod As Bit
    Dim Address As Byte , Command As Byte
    Dim S As Byte , Licz_8ms As Byte

    Set Odebr_kod
    Set Portd.0

    Enable Timer0
    Enable Int0
    Enable Interrupts

    Load Timer0 = 250
    Start Timer0
    Cls

    Do

    Cls
    Lcd S
    Waitms 150

    If Odebr_kod = 1 And Address = 0 And Command = 12 Then
    Portd.0 = 1
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If

    If Odebr_kod = 1 And Address = 0 And Command = 59 Then
    Portd.0 = 0
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If


    Loop
    End


    Pobr_rc5:

    Disable Int0
    Enable Interrupts

    Getrc5(address , Command)
    Command = Command And &B01111111

    Set Odebr_kod

    Return

    Odmierz_1s:
    Load Timer0 = 250
    Incr Licz_8ms

    If Licz_8ms = 125 Then
    Licz_8ms = 0
    Incr S
    End If

    Return


    Prosił bym o poradę co robię źle z góry dzięki.

    pozdrawiam

    Poprawiłem tytuł.
    [zumek]

    0 8
  • #2 10 Lip 2010 23:12
    slawko_k
    Poziom 33  

    komenda Getrc5(address , Command) blokuje inne przerwania na czas jej wykonania stąd przestaje ci na chwilkę działać przerwanie zliczające czas a wiec zegar będzie się późnił.

    Ostatnio robiłem właśnie zegar wiszący wysoko i ustawiany właśnie przez pilota rc5 ale od razu zrobiłem go na pcf8583. Może dasz radę dołożyć go do swojego projektu. wg mnie warto.

    Jeśli nie to może stwórz własną funkcję odbierająca kod rc5 lepszą niż getrc5

    Ale może ktoś inny podpowie ci jak prościej rozwiązać problem.

    0
  • #3 10 Lip 2010 23:19
    łuki_mar44
    Poziom 18  

    No właśnie jest ten problem, że wcale nie liczy nawet jak nie naciskam nic pilotem. Co do stworzenia własnej funkcji to ciężko będzie:)

    0
  • #4 10 Lip 2010 23:30
    slawko_k
    Poziom 33  

    aha to źle zrozumiałem. myślałem że jak pilot nadaje to zegar staje.

    no to w takim układzie podejrzewam że getrc5 używał właśnie do odbioru kodu timera0.
    Zmień w swoim programie odmierzanie czasu z timera 0 na timer1 i zacznie działać.

    0
  • #5 10 Lip 2010 23:51
    Logan
    Poziom 30  

    Code:
    Funkcja GETRC5()
    

    Opis:

    Funkcję tą opracowano na podstawie noty aplikacyjnej AVR410 firmy Atmel.

    W czasie działania funkcji używany jest licznik TIMER0 i związane z nim przerwanie. Licznik ten jest służy do generacji wymaganych opóźnień podczas próbkowania sygnału. TIMER0 może być dalej używany przez program, lecz należy się liczyć z wynikłymi opóźnieniami, gdy wykonywana będzie funkcja GETRC5(). Jest tylko jeden warunek: przerwania licznika TIMER0 nie mogą być używane.

    (c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005


    Ludzie czytajcie Helpa, to nie boli....

    0
  • #6 11 Lip 2010 01:24
    łuki_mar44
    Poziom 18  

    Dzięki wielkie teraz działa jak zmieniłem na timer1.
    Lecz mam jeszcze jeden problem mianowicie jak mam taki programik przykładowy:


    Code:

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

    Config Lcd = 16 * 2

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Cursor Off

    Config Clock = Soft
    Config Int0 = Low Level

    Config Date = Dmy , Separator = -

    Config Rc5 = Pind.2
    Config Int0 = Low Level

    On Int0 Pobr_rc5

    Dim Address As Byte , Command As Byte
    Dim Odebr_kod As Bit



    Reset Odebr_kod

    Declare Sub Wysw_czas


    Enable Int0
    Enable Interrupts

    Date$ = "08-22-04"
    Time$ = "23:59:00"
    Cls

    Do

    Call Wysw_czas

    If Odebr_kod = 1 Then
    Cls
    Lcd Address
    Lowerline
    Lcd Command
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If


    Loop
    End

    Sub Wysw_czas

    Cls
    Lcd ; "Czas: " ; Time$
    Lowerline
    Lcd ; "Data: " ; Date$
    Waitms 150

    End Sub

    Pobr_rc5:

    Disable Int0
    Enable Interrupts

    Getrc5(address , Command)
    Command = Command And &B01111111

    Set Odebr_kod

    Return


    i jak naciskam w takiej sytuacji jeden i ten sam klawisz lub dwa na zmianę to wyświetla mi się adres i komenda i wszystko pięknie.
    Lecz jeśli chciałbym sterować załączaniem i wyłączaniem np. oświetlenia to zmieniłem w warunku
    Code:

    If Odebr_kod = 1 Then
    Cls
    Lcd Address
    Lowerline
    Lcd Command
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If


    na

    Code:

    If Odebr_kod = 1 and Address = 0 and Command = 12 Then
    Cls
    Lcd Address
    Lowerline
    Lcd Command
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If



    żeby przypisać dany klawisz do funkcji i po kilku naciśnięciach już ten klawisz więcej nie reaguje tzn. w tym wypadku po 5 lub 6 nie wyświetla mi się nic na wyświetlaczu.
    CO można zrobić aby reakcja na dany klawisz była za każdym razem.

    pozdrawiam

    0
  • #7 11 Lip 2010 09:47
    slawko_k
    Poziom 33  

    Code:

    Getrc5(address , Command)
    Command = Command And &B01111111

    Set Odebr_kod


    odebr_kod zawsze w tym przypadku masz 1 niezależnie czy kod przyszedł czy nie

    widzę że odbiornik podłączyłeś do int0. nie ma sensu programować tego przerwania. przekombinowałeś i program działa ci źle. wywal całą obsługę przerwania int0. . Pomieszało ci się coś z bascomem 51 gdzie odbiornik musiał być tam podłączony. w AVr'a łączysz gdzie chcesz
    zrób jak w helpie w pętli odczyt kodu :
    Code:

    Do
    Getrc5(address , Command)
    If Address = 0 Then
       Command = Command And &B01111111
       if command= .... then ....
       if command=.... then ...
       if command = ... then ...

    End If
    Loop

    0
  • #8 11 Lip 2010 22:08
    łuki_mar44
    Poziom 18  

    Wielkie dzięki za tą procedurkę jutro postaram się ką sprawdzić.

    pozdrawiam

    0
  • #9 12 Lip 2010 16:07
    łuki_mar44
    Poziom 18  

    Wszytko śmiga jak należy, lecz zrezygnowałem z timera1 do liczenia czasu zrealizowałem to na programowym RTC z dołączonym kwarcem zegarkowym 32768 Hz. Z tego co zauważyłem jak na razie pstrykanie pilotem nie ma wpływu n pracę zegara.

    pozdrawiam

    i jeszcze raz dzięki wszystkim za porady

    0
  Szukaj w 5mln produktów