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

[Bascom] Atmega8 - odczyt RC5 z INT1 a tcon.0

MES Mariusz 02 Paź 2010 21:11 4009 7
  • #1 8576547
    MES Mariusz
    Poziom 36  
    Witam.

    Potrzebuję odczytać kod RC5 z wyprowadzenia INT1 (PD3) Atmega8.

    Tymczasem w znanym kursie Bascom jest napisane:

    Cytat:
    Bardzo ważna uwaga: polecenie GETRC5 jest "fabrycznie" przypisane do wejścia INT0 procesora i NIE MOŻE współpracować z jakimkolwiek innym wejściem, nawet jeżeli jest to wejście przerwania sprzętowego. Dekoder podczerwieni TFMS lub SFH MUSI być dołączony do nóżki procesora będącej wejściem przerwania INT0,
    czyli w przypadku układu 2051 do pinu 6.


    Powyższy tekst prawdopodobnie mija się jednak z prawdą (albo zdeaktualizował się wraz z kolejną wersją Bascom-a, albo też taka jest różnica między 8051 i AVR).

    Tak mi się wydaje, ponieważ w helpie Zbigniewa Gibka 1.11.7.4 jest napisane:

    [Bascom] Atmega8 - odczyt RC5 z INT1 a tcon.0

    Z powyższego wynika, że timera0 nie należy używać, gdyż wykorzystywany jest on w getrc5. Pewnie dlatego autor kursu zasugerował się tym timerem0 i napisał zacytowane już wcześniej: Bardzo ważna uwaga: polecenie GETRC5 jest "fabrycznie" przypisane do wejścia INT0 procesora i NIE MOŻE współpracować z jakimkolwiek innym wejściem, nawet jeżeli jest to wejście przerwania sprzętowego. Dekoder podczerwieni TFMS lub SFH MUSI być dołączony do nóżki procesora będącej wejściem przerwania INT0.

    Jednak w bascomie występuje możliwość konfiguracji wejścia RC5. W helpie czytamy:

    [Bascom] Atmega8 - odczyt RC5 z INT1 a tcon.0

    Czyli, jak sądzę, można odbiornik RC5 podłączyć do INT1 i skonfigurować: config rc5 = pind.3 i wszystko powinno działać. Przy czym należy pamiętać o tym by ostrożnie używać timera0 (bądź go nie używać).

    Oczywiście można będzie tak zrobić, jeśli wejście INT0 oraz TIMER0 nie są ze sobą w jakiś znaczący sposób powiązane, i to powiązanie nie ma wpływu dla zadziałania getrc5 (nie jestem pewien jak jest w rzeczywistości).

    Ale nawet gdyby był z tym kłopot, to przecież w konfiguracji można ustawić inny timer: config rc5 = pind.3, timer = 1. Wówczas kod rc5 napływający na INT1 będzie sczytywany przy użyciu TIMER1.

    Nurtuje mnie jeszcze kwestia tcon.0 w kodzie z kursu:

    Cytat:
    Dim Kod As Bit
    Dim Command As Byte , Subaddress As Byte
    Config Lcd = 16 * 1 ' lub Config Lcd = 16 * 1a
    Reset Tcon.0
    On Int0 Receiverc5
    Enable Int0
    Enable Interrupts
    Cls
    Lcd "Waiting for RC5"
    Cursor Off

    Do
    If Kod = 1 Then
    Disable Int0
    Cls
    Lcd "Com: " ; Command ; ",Adr: " ; Subaddress
    Kod = 0
    Enable Int0
    End If
    Loop

    Receiverc5:
    Getrc5(Subaddress , Command)
    Kod = 1
    Return


    Tzn. nie jestem pewien, czy Reset Tcon.0 prawidłowo zadziała przy Atmega8 (w 89c2051 rzeczywiście działało, bez tego układ nie reaguje na pilota).
  • #2 8577466
    ZbeeGin
    Poziom 39  
    BASCOM 8051 i BASCOM AVR odmennie traktują RC5 dlatego nie ma się co sugerować przykładami nie odnoszącymi się do właściwego kompilatora.

    W AVR, TIMER0 a INT0 są zupełnie niezależne. Nie ma tu opcji zewnętrznego bramkowania licznika jak w rodzinie 8051. W AVR w ogóle nie ma takiego rejestru jak TCON!
  • #3 8577561
    MES Mariusz
    Poziom 36  
    Na elektrodzie: https://www.elektroda.pl/rtvforum/topic19926-0.html znalazłem jeszcze taki post:

    Cytat:
    W programie brakowalo : Reset Gimsk.6 ,bo zapomnialem dodac ze chodzi tu o 8515.


    Czyli, jeśli dobrze rozumiem, zamiast reset tcon.0 (2051) w AVR (8515) powinno być reset Gimsk.6. Ciekawe jak będzie w Atmega8. Chyba czas zerknąć na jakiegoś gotowca na Atmega8 wykorzystującego Rc5.
  • #4 8577927
    ZbeeGin
    Poziom 39  
    Może jednak najpierw założenia? Czy chcesz:
    - aby procesor się zatrzymywał i czekał na kod z RC5, a potem aplikował jakieś działanie?
    - aby procesor robił swoje działania, a gdy pojawi się sygnał z RC5 odebrał kod i zmodyfikował swoje dotychczasowe działania na podstawie odebranego kodu?
  • #5 8578105
    MES Mariusz
    Poziom 36  
    ZbeeGin napisał:
    Może jednak najpierw założenia? Czy chcesz:
    - aby procesor się zatrzymywał i czekał na kod z RC5, a potem aplikował jakieś działanie?
    - aby procesor robił swoje działania, a gdy pojawi się sygnał z RC5 odebrał kod i zmodyfikował swoje dotychczasowe działania na podstawie odebranego kodu?

    Oczywiście druga opcja, czyli odczyt RC5 w przerwaniu, gdy na wyjściu INT1 pojawi się stan niski (podobnie jak to było we wklejonym wyżej przykładzie dla 2051).
  • #6 8580304
    ZbeeGin
    Poziom 39  
    W takim razie sprawa jest dość prosta. Na początku przerwania musisz wyłączyć przerwania z INT1, skasować flagę w INTF1 w GIFR (zapisać 1) by nie otrzymać fałszywego przerwania po wyjściu (w kodzie będzie wiele zboczy), odebrać kod przez GETRC5(), następnie włączyć znów przerwania z INT1.
  • #7 8580694
    MES Mariusz
    Poziom 36  
    ZbeeGin napisał:
    W takim razie sprawa jest dość prosta. Na początku przerwania musisz wyłączyć przerwania z INT1, skasować flagę w INTF1 w GIFR (zapisać 1) by nie otrzymać fałszywego przerwania po wyjściu (w kodzie będzie wiele zboczy), odebrać kod przez GETRC5(), następnie włączyć znów przerwania z INT1.


    Hmm. Zobaczmy jeszcze raz działający przykład dla 2051:

    Cytat:
    Dim Kod As Bit
    Dim Command As Byte , Subaddress As Byte
    Config Lcd = 16 * 1 ' lub Config Lcd = 16 * 1a
    Reset Tcon.0
    On Int0 Receiverc5
    Enable Int0
    Enable Interrupts
    Cls
    Lcd "Waiting for RC5"
    Cursor Off

    Do
    If Kod = 1 Then
    Disable Int0
    Cls
    Lcd "Com: " ; Command ; ",Adr: " ; Subaddress
    Kod = 0
    Enable Int0
    End If
    Loop

    Receiverc5:
    Getrc5(Subaddress , Command)
    Kod = 1
    Return


    Powyżej jest na Int0, ale nie ważne.

    Kiedy na Int0 zostanie wykryty poziom niski rozpocznie się obsługa przerwania (recaiverc5). Przerwania nie są nigdzie wyłączane, zamiast tego od razu wykonywana jest komenda getc5. Ciekawe, bo kod przesyłany w podczerwieni teoretycznie z każdą zmianą stanu z 1 na 0 będzie wywoływał przerwanie, chyba, że przerwania zostają wyłączone automatycznie w momencie wykonywania podprogramu recaiverc5 lub komendy getrc5.

    Zastanawia mnie co tak na prawdę robi Reset Tcon.0, bo w tekście http://www.elportal.pl/pdf/k10/54_05.pdf nie ma o tym ani słowa.
  • Pomocny post
    #8 8580812
    ZbeeGin
    Poziom 39  
    Co się tak uparłeś Mariusz na ten kod dla 8051 jak chcesz użyć ATmega8? Pisałem przecież: B-51 a B-AVR traktują RC5 inaczej. Dlatego im prędzej zapomnisz o tym kodzie dla 8051 tym bliżej będziesz rozwiązania Swojego problemu dla ATmega8.

    TCON.0 to tryb pracy INT0. Książka Tomasza Stareckiego w dłoń i strona 63 oraz 168.
REKLAMA