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

[ATMEGA8][BASCOM] Obsługa RC5

18 Sty 2012 00:23 5767 12
  • Poziom 8  
    Witam! Przeczytałem sporo na ten temat i w wypowiedziach kolegów wszystko jest proste - a nie zawsze jest dla początkującego. Napisałem: odbiór RC5 w pętli głównej a drugi programik: odbiór w przerwaniu INT0. Pierwszy działa znakomicie a drugi niestety daje wynik 255. Oto kod 1:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    'kody rc5 w pętli głównej

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

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portc.0 'konfiguracja linii

    Config Rc5 = Pind.2

    Enable Interrupts

    Dim Adres As Byte , Kod As Byte

    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "kod RC5"


    Do
    Getrc5(adres , Kod)

    If Adres < 255 Then

    Kod = Kod And &B01111111
    Locate 2 , 1
    Lcd Kod

    End If

    Loop

    End
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    ten drugi - nie działający poprawnie:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    'kody rc5 w przerwaniu int0

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

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portc.0 'konfiguracja linii


    Config Rc5 = Pind.2

    Enable Interrupts

    Dim Adres As Byte , Kod As Byte
    Config Int0 = Low Level
    Dim Flaga As Bit
    Enable Interrupts
    Enable Int0
    On Int0 Rc5

    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "kod RC5"


    Do

    If Flaga = 1 Then
    Locate 2 , 1
    Lcd Kod
    Enable Int0
    Reset Flaga
    End If

    Loop

    End


    Rc5:

    Disable Int0
    Enable Interrupts

    Getrc5(adres , Kod)
    If Adres = 0 Then
    Kod = Kod And &B01111111
    End If
    Set Flaga
    return
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    W którejś wypowiedzi była sugestia, że może to być wina wersji BASCOMA.
    Ja używam 2.0.7.1
    Pomóżcie Koledzy w zrozumieniu tematu i rozwiązaniu problemu.
    To pierwszy post - za braki wybaczcie...
  • Poziom 8  
    Witam ponownie! Temat drążyłem do spodu (sporo godzin na czytaniu wątków na elektrodzie) i faktycznie tak jest, że odbiór RC5 (listing 2) nie działa skompilowany w ver. Bascoma 2.0.7.1 a działa poprawnie w ver. 1.11.9.5.
    "Słynne" odbiory 255,127 nie mają już miejsca. Starsze lepsze? A może coś dodatkowo trzeba zrobić w ver. 2.0.7.1?! Pozdrawiam wszystkich upartych.
    Wątku nie zamykam. Może wypowie się ktoś znający temat.
  • Użytkownik usunął konto  
  • Poziom 24  
    Dziwne jest to że w starszej wersji ten kod działa, a raczej nie powinien :). W helpie pisze że funkcja GetRC5 wykorzystuje timer0 i przerwanie od tego timera. Umieszczenie tej funkcji w przerwaniu INT0 wydaje się być błędne. Przerwanie od timera się nie wykona, dopóki nie zakończy się obsługa przerwanie INT0.
  • Poziom 8  
    Dzięki koledzy za szybką reakcję. Twój, Saabotaz, programik już parę dni temu przećwiczyłem i jest ok a to co sugerujesz w odpowiedzi sprawdzę.
    W ver.1.11.9.5 to moje pracuje bardzo dobrze - i to jest ciekawostka! Pozdrawiam

    Dodano po 24 [minuty]:

    Saabotaz po Twoich zmianach zdycha. Już wywalenie "Enable Interrupts" w przerwaniu powoduje skutek negatywny. Zmiana na "falling" powoduje, że odbiera tylko raz. Powrót do listingu 2... i wszystko ok. Może te zmiany zadziałają w ver.2.0.7.1 - kto wie.
    Drążę temat z ciekawości (bo jest Twoje rozwiązanie albo znakomicie odbiór działa w pętli) i żeby zgłębić temat.
    AVR-em zajmuję się około tygodnia i jestem zupełny "świerzak"!
  • Poziom 24  
    Tak się zastanawiam, czy to nie powinno działać?:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Przepisałem procedurę w/g "mw" z forum EP i jest tak jak napisał. To działa. Przerwanie INT0 wykonuje się 2 razy a to z przyczyny którą zasygnalizował Mundi1970. Disable INT0 nie zatrzymuje przerwania tylko zatrzymuje procedurę obsługi i trzeba pomajstrować w rejestrach przerwań aby to wyeliminować.
    Ten kod poniżej (pomimo 2xINT0) działa pewnie i można to wykorzystać.
    I teraz na koniec potwierdzenie: NIE DZIAŁA w ver.2.0.7.1. Sprawdziłem, że nie ma problemu w ver.1.11.9.1 i w ver.1.11.9.5.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    'kody rc5 w przerwaniu int0

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

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portc.0 'konfiguracja linii


    Config Rc5 = Pind.2


    Enable Interrupts

    Dim Adres As Byte , Kod As Byte , Odebr_kod As Bit
    Config Int0 = Low Level

    Dim Flaga As Bit
    Enable Interrupts
    Enable Int0
    On Int0 Rc5

    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "kod RC5"

    Do

    If Odebr_kod = 1 Then
    If Adres = 0 Then
    Cls
    Lcd "Kod: " ; Kod
    End If
    Reset Odebr_kod
    Enable Int0
    End If
    Loop
    End


    Rc5:
    Disable Int0
    Enable Interrupts
    Getrc5(adres , Kod)
    Kod = Kod And &B01111111
    Set Odebr_kod
    Return
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jeszcze potrenuję sugestie Mundi1970.
    Pozdrawiam
  • Poziom 23  
    piomar2 napisał:
    I teraz na koniec potwierdzenie: NIE DZIAŁA w ver.2.0.7.1. Sprawdziłem, że nie ma problemu w ver.1.11.9.1 i w ver.1.11.9.5.


    Poczytaj w helpie najnowszej wersji o "config RC5" bo się odrobinę zmieniło. Doszedł jeden parametr, który trzeba określić żeby to działało tak jak w starszych wersjach.
    Niestety czasami tak bywa, że najciemniej pod latarnią.
  • Poziom 24  
    Rzeczywiście doda się Wait=2000 do konfiguracji i funkcja GetRC5 działa w przerwaniu. No ale to przerwanie trwa ponad 100ms :), to chyba lepiej ustawić flagę. Działający przykład, kompilowany na wersji 2.0.7.3:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Nareszcie EUREKA! Jak się czyta helpa ze starszych wersji to tak niestety jest.
    Dla początkującego trochę za dużo szczegółów...niestety. Tylko dziwne, że nigdzie na forum o tym szczególe nikt nie napisał (a może przeoczyłem....starość niestety). Tym bardziej wielkie dzięki dla Wojtka75.
    Dla Mundi1970 szacuneczek i też podziękowania za zainteresowanie tematem.
    Myślę, że wyczerpaliśmy wątek, a nawiasem mówiąc, to Mundi1970 ma dużo racji w tym, że Rc5 w Bascomie to nie idealne rozwiązanie. Co wersja to gorzej (ponad 130 ms!!!).
    Jeszcze raz dzięki wszystkim kolegom.
    Temat do zamknięcia.
  • Użytkownik usunął konto  
  • Poziom 8  
    Dzięki Saabotaz! Pomogliście bardzo. Teraz pilocik działa jak należy, w przerwaniu i bez, w każdej wersji baskoma i najważniejsze, że człowiek to zrozumiał.
    Jeszcze raz wielkie dzięki...