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:
Czy jeśli wprowadzę zmiany:
komendy RC5 będą prawidłowo sczytywane z wejścia Int1? W programie wykorzystywany jest również timer1 (inna funkcja softu).
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:
'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 przerwaniaCzy jeśli wprowadzę zmiany:
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).
