'Przerwanie

'Przerwanie.bas

 'Program poglądowy, po przerwaniu Int0 zliczanie impulsów zegarowych przez Timer0.

 'Można załączyć i wyłączyć Port.

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 'Przerwanie.png.

 'Program zajmuje 9% pamięci.

 

 $regfile = "m8def.dat"                                     'Info dla kompilatora.

$crystal = 16000000                                         'Informujemy kompilator o kwarcu 16MHz.

 

 Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

 

 Config Timer0 = Counter , Edge = Rising                    'Timer0 jako licznik, od zbocza narastającego.

 

 Config Pind.4 = Output                                     'Port wykonawczy.

 Config Pind.2 = Input                                      'Wejście poziomu niskiego do Int0.

  Set Portd.2                                               'Ustaw poziom wysoki na wyjściu Portd.2.

  Set Portd.4                                               'Ustaw poziom wysoki na wyjściu Portd.4.

 

 On Int0 Sekunda                                            'Podprogram Timer0 o nazwie Sekunda.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Int0                                                'Odblokowujemy przerwanie Int0.

 

 Cls                                                        'Wyczyść Lcd.

 

 '------------------------------------------------------------------------------------------------------

Do                                                          'Początek pętli głównej programu.

   Home                                                     'Wyświetlaj wynik w jednym miejscu.

  Lcd Timer0                                                'Pokazuj zawartość Timer0.

 

   If Timer0 = 1 Then                                       'Jeśli w Timer0 będzie 1 impuls zegarowy...

  Reset Portd.4                                             'Na wyjściu Portd.1 ustaw zero.

Else                                                        'W przeciwnym razie...

  If Timer0 = 2 Then                                        'Jeśli będą 2 impulsy...

  Set Portd.4                                               'Ustaw poziom wysoki.

  Timer0 = 0                                                'Wyzeruj Timer.

   Cls                                                      '

 End If                                                     'Wyczyść Lcd.

  End If                                                    '

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

'--------------------------------------------------------------------------------------------------------

Sekunda:                                                    'Podprogram.

  Incr Timer0                                               'Po każdym impulsie zegarowym powiększaj zawartość Timer0.

  Return                                                    'Wróć do programu.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Objaśnienie:

'W Atmega8 przerwanie zewnętrzne INT0 doprowadza się do Portd.2.

'Na czym to polega:

'po skonfigurowaniu programu jak wyżej (czyli: On Int0 Sekunda i Enable Int0) procesor zareaguje na poziom niski w Portd.2.

'Nie są zliczane impulsy na wejściu tego portu, jak by się mogło wydawać. Zostaje zatrzymana pętla Do i procesor wykonuje inne, zlecona zadanie.

'To zadanie, to zliczanie impulsów zegarowych.

'Przerwanie, a więc zliczanie impulsów zegarowych trwa tak długo, jak długo istnieje poziom niski w Portd.2.

'

'Do czego służy:

'w czasie przerwania procesor może wykonać jakieś czynnośi.

'Przy poziomie niskim w Pord.2 zlicza impulsy zegarowe procesora.

'Ilość tych impulsów zależna jest od czasu trwającego impulsu niskiego w Prtd.2.

'Ponieważ impulsy są bardzo szybkie (dziesiątki nS) Timer0 zostanie szybko załadowany..

'Możemy ustawić, co ma się dziać po osiągnięciu założonej liczby impulsów w Timer0.

'W pętli Do jest polecenie, aby po jednym impulsie pojawił się poziom niski w Portd.4, a po dwóch impulsach poziom wysoki.

'Po dwóch impulsach Timer0 zostanie wyzerowany.

'Uzyskaliśmy prosty włącznik - wyłącznik. Naciskamy P1 - załączone, ponownie naciskamy P1 - wyłączone.

'Aby móc uzyskać odpowiednio krótki impuls w Prtd.2 użyliśmy rozładowującego się kondensatora C1.

'W czasie tego krótkiego czasu do Timer0 trafi tylko 1 impuls.

'

'Do celów poglądowych użyty został Lcd, aby widzieć zapełniający się Timer0.

'

'Koniec.