BASCOM

Przerwanie Timer0



Jeden z przykładów ukazujących w jaki sposób i dokładnie można zaplanować start i stop czasu w Timer0.
W tym zadaniu trzeba przeprowadzić dokłana analizę myślową, bo zrozumienie tego nie jest takie proste jak mogło by się wydawać.

'Przerwanie13.bas

 'Program poglądowy, liczenie czasu przez Timer0.

 'Można załączyć i wyłączyć Port, ale nie tylko oczywiście.

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 '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 Timer0 = Timer , Prescale = 1                       'Timer1 jako licznik.

 

 Config Pind.1 = Output                                     'Port wykonawczy.

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

 

 Dim Przerw0 As Byte                                        'Deklaracja zmiennej przerań Timwer0.

 Dim Zm As Bit                                              'Deklaracja zmiennej, zawiera bit startu czasu.

 Dim Zm1 As Bit                                             'Deklaracja zmiennej, zawiera bit startu czasu.

 Dim Zm2 As Bit                                             'Deklaracja zmiennej, zawiera bit startu czasu.

 Dim Zm3 As Bit                                             'Deklaracja zmiennej, zawiera bit startu czasu.

 

 On Timer0 Licz                                             'Podprogram.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              '

 

   Zm = 0                                                   '

   Zm1 = 0                                                  '

   Zm2 = 0                                                  '

   Zm3 = 0

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

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

 

     If Zm = 1 Then                                         'Po upływie 16uS...

  Toggle Portd.1                                            'Przełącz Port w dół.

   Zm = 0                                                   '

   Zm1 = 0                                                  '

   Zm2 = 0                                                  '

   Zm3 = 0

 

Else

   If Zm1 = 1 Then                                          'Po upływie 32uS...

  Toggle Portd.1                                            'Przełącz Port w górę.

  Zm = 0                                                    '

   Zm1 = 0                                                  '

   Zm2 = 0                                                  '

   Zm3 = 0                                                  '

 

 Else

   If Zm2 = 1 Then                                          'Po upływie 304uS...

  Toggle Portd.1                                            'Przełącz Port w dół.

   Zm = 0                                                   '

   Zm1 = 0                                                  '

   Zm2 = 0                                                  '

   Zm3 = 0                                                  '

 

 Else

    If Zm3 = 1 Then                                         'Po upływie 128uS...

  Toggle Portd.1                                            'Przełącz Port w górę.

    Zm = 0                                                  '

   Zm1 = 0                                                  '

   Zm2 = 0                                                  '

   Zm3 = 0                                                  '

   Przerw0 = 0                                              '

 

   End If                                                   '

    End If                                                  '

     End If                                                 '

       End If                                               '

 

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

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

Licz:                                                       'Podprogram.

 

  Incr Przerw0                                              'Po każdym przerwaniu powiększaj zawartość zmiennej.

 

  If Przerw0 = 1 Then                                       'Po upływie 1 przerwań, czyli po 16uS...

   Zm = 1                                                   'załaduj 1 do Zm.

 Else                                                       'W przeciwnym razie...

  If Przerw0 = 3 Then                                       'Po upływie 3 przerwań, czyli po 32uS...

   Zm1 = 1                                                  'załaduj 1 do Zm1.

 Else                                                       '

  If Przerw0 = 22 Then                                      'Po upływie 22 przerwań, czyli po 304uS...

   Zm2 = 1                                                  'załaduj 1 do Zm2.

 Else                                                       'W przeciwnym razie...

  If Przerw0 = 30 Then                                      'Po upływie 30 przerwań, czyli po 128uS...

   Zm3 = 1                                                  'załaduj 1 do Zm3.

 

   End If                                                   'Koniec warunków.

    End If

     End If                                                 '

      End If                                                '

Return                                                      'Wróć do programu.

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

 

'Objaśnienie:

'Zajmujemy się Timer0.

'Jedno przerwanie trwa 16uS (mikrosekund).

'Jest:  Set Portd.1, czyli zaczynamy od poziomu wysokiego w Portd.1.

'Dalsze wyjaśnienia pod rysunkiem.

'Koniec.