BASCOM

Przerwanie OC1B



'Przerwanie5.bas

 'Program poglądowy, zliczanie impulsów zegarowych przez Timer1.

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

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 'Przerwanie5.png.

 'Program zajmuje 8% 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 Timer1 = Counter , Compare B = Set , Edge = Falling 'Timer1 jako licznik, od zbocza opadającego.

                                                             'Compare B - przerwanie od drugiego rejestru Timer1.

 Config Pind.1 = Output                                     'Port wykonawczy.

 Config Pinb.2 = Output                                     'Wyjście przerwania.

  Reset Portb.2                                             'Ustaw poziom niski na wyjściu Portb.2..

  Set Portd.1                                               'Ustaw poziom wysoki.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Oc1b                                                'Odblokowujemy przerwanie OC1B.

 Compare1b = 555                                            'Wpisujemy ręcznie do rejestru liczbę 555.

 

 Cls                                                        'Wyczyść Lcd.

 

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

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

   Home                                                     'Wyświetlaj wynik w jednym miejscu.

  Lcd Counter1                                              'Pokazuj zawartość impulsów w Counter1.

 

   If Compare1b = Counter1 Then                             'Jeśli zawartość rejestru zrówna się z impulsami wchodzącymi do Timer1 ...

   Reset Portd.1                                            'Ustaw poziom niski w Portd.1.

   End If                                                   'Wyczyść Lcd.

 

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

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

'Przerwanie OC1B Timer1.

'Na czym to polega:

'polega na wywołaniu przerwania w momencie, gdy ilość impulsów wchodzących do Timer1 (Portd.5) zrówna się

'z ilością wpisaną przez nas do rejestru Compare1b.

'Więc tutaj, gdy ilość impulsów wchodzących osiągnie 555, nastąpi zatrzymanie pętli Do i wykonanie przerwania.

'Rezultat przerwania pojawi się na Portb.2, bo to jest wyjście przerwania OC1B.

'

'Co pojawi się na tym wyjściu:

'pojawi się to, co co zostało zadeklarowane: Config Timer1 = Counter , Compare B = Set...

'A więc pojawi się Set, czyli poziom wysoki. Aby tak było, należy skonfigurować Portb.2 jako Reset.

'

'Równocześnie, na nasze polecenie zawarte w pętli Do, po przerwaniu zostanie przełączony na poziom niski

'Portd.1.

'Pętla pokazuje nam też ładowanie impulsów do Timer1.

'

'W Atmega8 jest jeszcze przerwanie OC1A, które też możemy ustawić.

'Koniec.