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, RC5, Int1] - czy program powinien działać?

05 Gru 2010 09:55 1732 4
  • Poziom 36  
    Konkretne pytanko. W książce Marcina Wiązani podano przykład kodu na odbieranie RC5 w przerwaniu dla Atmega8. Bazuje on na przerwaniu Int0.

    Ja w swoim hardware mam odbiornik podłączony do Int1, przy czym timer1 mam zajęty przez inną funkcję softu.

    Oto listing z książki:

    Code:
    'Program odbierający sygnały nadawane w standardzie RC5
    
    'w przerwaniu Int0
    'Na LCD będą wyświetlane informacje o adresie oraz numerze komendy

    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
           'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
           'o częstotliwości oscylatora
           'taktującego mikrokontroler
    Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
           'LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfiguracja linii
           'mikrokontrolera do których
           'dołączono wyświetlacz
           'LCD
    Config Int0 = Low Level                                     'konfigurowanie przerwania Int0,
           'które będzie wywoływane niskim
           'poziomem na wejściu INT0
    Config Rc5 = Pind.2                                         'konfiguracja linii, do której
           'dołączono odbiornik
           'podczerwieni
    On Int0 Pobr_rc5                                            'po wystąpieniu przerwania Int0
           'nastąpi skok do podprogramu
           'Pobr_rc5
    Dim Address As Byte , Command As Byte
           'definicje zmiennych dla
           'instrukcji Getrc5
    Dim Odebr_kod As Bit                                        'flaga wskazująca na odebranie
           'kodu danych w kodzie RC5
    Enable Interrupts                                           'odblokowanie przerwań
           'globalnych
    Enable Int0                                                 'odblokowanie przerwania Int0

    Set Odebr_kod                                               'ustawienie flagi Odebr_kod

    Do                                                          'początek nieskończonej pętli
     If Odebr_kod = 1 Then                                      'jeśli odebrano kod RC5, to
      Cls                                                       'czyszczenie LCD
      Lcd "Adres: " ; Address                                   'wyświetlenie w pierwszej linii
           'LCD otrzymanego adresu po
           'napisie Adres:
      Lowerline                                                 'kursor do drugiej linii LCD
      Lcd "Komenda:" ; Command                                  'wyświetlenie w drugiej linii
           'LCD otrzymanego numeru komendy
           'po napisie Komenda:
      Reset Odebr_kod                                           'wyzerowanie flagi Odebr_kod
      Enable Int0                                               'odblokowanie przerwania Int0
     End If
    Loop
    End                                                         'koniec programu

    Pobr_rc5:                                                   'podprogram przerwania Int0
     Disable Int0                                               'zablokowanie przerwania Int0
     Enable Interrupts                                          'odblokowanie przerwań
           'globalnych
     Getrc5(address , Command)                                  'pobranie adresu oraz komendy
           'nadanej z pilota podczerwieni
     Command = Command And &B01111111                           'wyzerowanie najbardziej
           'znaczącego bitu otrzymanej
           'komendy
     Set Odebr_kod                                              'ustawienie flagi odebrania kodu
           'RC5
    Return                                                      'powrót z przerwania


    Czy jeśli wprowadzę zmiany:

    Code:

    Config Int1 = Low Level
    Config Rc5 = Pind.3
    On Int1 Pobr_rc5
    Enable Int1

    ...

    Pobr_rc5:                                             
     Disable Int1                                           
     Enable Interrupts
     Getrc5(address , Command)
     Command = Command And &B01111111


    komendy RC5 będą prawidłowo sczytywane z wejścia Int1? W programie wykorzystywany jest również timer1 (inna funkcja softu).
  • Poziom 29  
    xury napisał:
    Nie możesz tylko używać Timera2 do innych celów, bo właśnie jest on używany przez RC5
    Funkcja GETRC5 domyślnie wykorzystuje Timer0 a nie Timer2. Oczywiście można to zmienić w konfiguracji, jednak autor tego nie czyni.
  • Poziom 36  
    landy13 napisał:
    xury napisał:
    Nie możesz tylko używać Timera2 do innych celów, bo właśnie jest on używany przez RC5
    Funkcja GETRC5 domyślnie wykorzystuje Timer0 a nie Timer2. Oczywiście można to zmienić w konfiguracji, jednak autor tego nie czyni.

    Zatem pozostają mi dwie opcje, albo przestać używać timera0 do odliczania 1s odcinków czasu i zaprzęgnąć do tego timer2 (co może nie być wcale takie proste biorąc pod uwagę specyfikę tego timera:

    https://www.elektroda.pl/rtvforum/topic975093.html napisał:
    ATMega 8 posiada:

    8bit Timer/Counter0
    16bit Timer/Counter1
    8bit Timer/Counter2 with PWM and Asynchronous operation
    Dodam jeszcze tylko, że Timer2 jest dość specjalizowany, bo przygotowany pod kwarc 32768Hz (PB6 i PB7 dla ATMega8)

    Timer0 i Timer1 mają tenn sam preskaler

    Single Channel Counter
    • Clear Timer on Compare Match (Auto Reload)
    • Glitch-free, phase Correct Pulse Width Modulator (PWM)
    • Frequency Generator
    • 10-bit Clock Prescaler
    • Overflow and Compare Match Interrupt Sources (TOV2 and OCF2)
    • Allows Clocking from External 32 kHz Watch Crystal Independent of the I/O Clock


    albo też zastosować się do:

    landy13 napisał:
    Oczywiście można to zmienić w konfiguracji, jednak autor tego nie czyni.


    Czyli spróbować zmienić to w konfiguracji, o ile rzeczywiście się da. No nic sięgam do manuala.


    --- edit ---

    Wygląda na to, że się da.

    Zatem zmiany zapowiadają się mniej więcej tak:


    Code:
    Config Int1 = Low Level
    
    Config Rc5 = Pind.3, Timer = 2
    On Int1 Pobr_rc5
    Enable Int1

    ...

    Pobr_rc5:                                             
     Disable Int1                                           
     Enable Interrupts
     Getrc5(address , Command)
     Command = Command And &B01111111