Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

łuki_mar44 10 Jul 2010 22:29 3354 8
  • #1
    łuki_mar44
    Level 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.



    
    $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]
  • #2
    slawko_k
    Level 34  
    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.
  • #3
    łuki_mar44
    Level 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:)
  • #4
    slawko_k
    Level 34  
    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ć.
  • #5
    Logan
    Level 30  
    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....
  • #6
    łuki_mar44
    Level 18  
    Dzięki wielkie teraz działa jak zmieniłem na timer1.
    Lecz mam jeszcze jeden problem mianowicie jak mam taki programik przykładowy:


    
    $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
    
    If Odebr_kod = 1 Then
    Cls
    Lcd Address
    Lowerline
    Lcd Command
    Wait 1
    Reset Odebr_kod
    Enable Int0
    End If
    


    na

    
    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
  • #7
    slawko_k
    Level 34  
    
    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 :
    
    Do
    Getrc5(address , Command)
    If Address = 0 Then
       Command = Command And &B01111111
       if command= .... then ....
       if command=.... then ... 
       if command = ... then ...
    
    End If
    Loop
    
  • #8
    łuki_mar44
    Level 18  
    Wielkie dzięki za tą procedurkę jutro postaram się ką sprawdzić.

    pozdrawiam
  • #9
    łuki_mar44
    Level 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