BASCOM

Przerwanie w celu rejestrowania przepełnień



'PrzerwanieZliczZewn.bas

 'Program do zliczania impulsów zewnętrznych

 'Przerwania Timera1 ładujące zmienną Przep1 (przepełnienia).

 'Timer1 jako Counter1 liczący impulsy z zewnątrz dochodzące do Portd.5.

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 'Schemat: PrzerwanieZliczZewn.png.

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

 Config Timer0 = Timer , Prescale = 256

 

 Dim Licz As Byte                                           'Deklaracje zmiennych.

 Dim Przep1 As Byte                                         '

 Dim Red As Long                                            '

 Dim Fred As Word                                           '

 

 Config Pind.0 = Output                                     'Led miga.

 Config Pind.1 = Output                                     'Port wykonawczy, zaświeci Led.

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

 Config Pind.5 = Input                                      'Wejście impulsów liczonych

  Set Portd.2                                               'Ustaw poziom wysoki.

  Set Portd.1                                               'Ustaw poziom wysoki na wejściu Portd.1.

  Set Portd.0                                               'Ustaw poziom wysoki.

 

  On Timer1 Dap                                             'Zmienna dla timer1, powiekszająca sie po przepełnieniach.

  On Timer0 Sekunda                                         'Podprogram migania Led.

 

 Enable Timer0                                              '

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer1                                              '

 

 Stop Timer1                                                '

 Cls                                                        'Wyczyść Lcd.

 

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

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

 Bitwait Pind.2 , Reset                                     'Czekaj, aż wejdzie poziom niski.

  Reset Portd.1                                             'Zaświeć Led.

 Home                                                       'Trzymaj komunikaty w jednym miejscu.

 Lcd "Czekaj!..."                                           'komunikat

 Start Timer1                                               '

 If Pind.2 = 1 Then                                         'Gdy skończył się poziom niski.

 Stop Timer1                                                '

 Cls                                                        'Skasuj Czekaj!.

 Waitms 100                                                 'Czas na zapełnienie Lcd.

 Fred = Counter1                                            'Zawartość Counter1 ładuj do zmiennej.

 Lcd "Timer1=" ; Fred ;                                     'komunikat

 Red = Red + Fred                                           'Zmienna Red = zawartość dwuch zmiennych.

 Lowerline                                                  'W drugiej lini.

 Lcd "P1=" ; Przep1 ; " " ; "Raz=" ; Red ;                  'komunikat

 End If                                                     'Koniec If Pind.2 = 1

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

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

Sekunda:                                                    'Podprogram Timer0.

  Incr Licz                                                 'Po każdym przepełnieniu powiększaj zawartość zmiennej.

  If Licz = 100 Then                                        'Przy 100 przepełnieniach...

  Licz = 0                                                  '

  Toggle Portd.0                                            'Zmień stan portu.

  End If                                                    'Koniec If Licz = 100.

  Return                                                    'Wróć do programu.

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

Dap:                                                        'Podprogram Timer1.

   Incr Przep1                                              'Po każdym przepełnieniu powiększaj zawartość zmiennej.

   Red = Przep1 * 65536                                     '

Return                                                      'Wróć do programu.

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

 

'Objaśnienie:

'W Atmega8 przerwanie zewnętrzne INT0, INT1 doprowadza się do Portd.2 i 3.

'Tutaj nie dało się skorzystać z tych przerwań , ponieważ w czasie przerwania należy wykonać kolejne,

'czyli ładowanie zmiennej Przep1 od przepełnień Timer1. Nie dało się tego zrobić.

'Aby rozwiązać problem zastosowano Bitwait Pind.2. Portd.2 czeka na poziom niski i startuje Timer1.

'Po poziomie niskim w Portd.2 mamy komunikat Czekaj! do czasu zakończenia poziomu niskiego.

'Po zakończeniu poziomu na Lcd zobaczymy:

'Timer1=XXXXX, czyli zawartość Countera1 liczącego ipulsy wejściowe.

'P1=X, czyli liczbę przepełnien Timer1.

'Raz=XXXXXX, czyli ostateczną liczbę impulsów wejściowych. P1*65536+Timer1.

'Gdy widzimy komunikat Czekaj!, oznacza to, że trwa zliczanie impulsów.

'Koniec.