'Generator

Bascom


Cyfrowy generator został skonstruowany według poniższego schematu. Na bieżąco odzczytywana jest jego częstotliwość miernikiem częstotliwości z procesorem Attiny2313 i poniższym programem w Bascom.


'Generator.bas

'Program do odczytu częstotliwości genewratora m.cz. (50Hz - 21KHz).

'Procesor: ATTiny2313.

'Opracował Henryk Wydmuch.

'Timer0 w roli czasomierza bramkującego, bramkuje co 1sek.

'Timer1 jako 16bitowy licznik bramkowany przez Timer0.

'Wejście: Portd.5.

'Dioda migająca dołączona do Portb.2 z rez. szereg. 500om, (równolegle do LCD).

'Dioda sygnalizująca przekroczenie zakresu w Portd.0.

'Pamięć zajęta w 79%.

'Patrz zeszyt 250906

 

 $regfile "2313def.dat"

 $crystal = 8000000

 Config Lcd = 16 * 2                                        'Informacja jaki będzie Lcd

 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6 , E = Portb.3 , Rs = Portb.4

 'Informacja na jakich Pinach będzie Lcd.

 

 Config Timer0 = Timer , Prescale = 1                       'Timer0 jako Timer z podziałem przez osiem.

 Config Timer1 = Counter , Edge = Falling                   'Timer1 jako licznik działający od zbocza opadającego.

 Config Pind.5 = Input                                      'Konfiguruj Portd.5 jako wejście.

   Set Portd.5                                              'Dołącz rezystor podciągający.

 Config Pind.0 = Output                                     'Konfigurujemy Portd.0 dla LED.

   Portd.0 = 1                                              'Ustaw 1 w Portd.0.

 

 On Timer0 Odmierz_1s                                       'Podprogramdla Timera0 o nazwie Odmierz_1s.

 On Timer1 Zlicz_przep_tim1                                 'Podprogram dla Timera1.

 

 Dim Liczba_przerwan_tim0 As Word                           'Rezerwujemy dwa bajty w pamięci dla zmiennej Liczba_przerwan_tim0. Tu załadujemy liczbę przerwań Timera0.

 Dim Lczba_przep_tim1 As Byte                               'Rezewujemy jeden bajt dla zmiennej Liczba_przep_tim1. Tu załadujemy liczbę przerwań Timera1.

 Dim Flaga_aktual_lcd As Bit                                'Rezerwujemy jeden bit na aktualizację wyświetlacza Lcd.

 Dim Wynik_pomiaru As Long                                  'Rezerwujemy cztery bajty dla zmiennej Wynik_pomiaru. Tu znajdzie się wynik pomiaru.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokowujemy przerwanie Timera0.

 Enable Timer1                                              'Odblokowujemy przerwanie Timera1.

 

 Stop Timer0                                                'Zatrzymujemy Timer0.

 Stop Timer1                                                'Zatrzymujemy Timer1.

 

 Timer1 = 0                                                 'Zerujemy Timer1.

 Wynik_pomiaru = 0                                          'Zerujemy zmienną Wynik_pomiaru.

 Liczba_przerwan_tim0 = 0                                   'Zerujemy zmienną zawierającą liczbę przerwań Timera0.

 Lczba_przep_tim1 = 0                                       'Zerujemy zmienną zawierającą liczbę przerwań Timera1.

 Start Timer1

 Start Timer0

 

 Do                                                         'Start pętli głównej.

  If Flaga_aktual_lcd = 1 Then                              'Jeśli flaga aktualizacji Lcd włączona (po każdej sekundzie), to...

  Flaga_aktual_lcd = 0                                      'Zeruj flagę.

  Cls                                                       'Czyść LCD.

  If Wynik_pomiaru = 0 Then                                 'Jeśli nie doprowadzono sygnału do wejścia...

  Lcd Wynik_pomiaru ; " Hz"                                 'To napisz to w LCD.

  Locate 2 , 1                                              'Druga linia Lcd, na początku...

  Lcd " Brak sygnalu"                                       'Napisz komunikat.

  Else                                                      'W przeciwnym razie...

  If Wynik_pomiaru < 1000000 Then                           'Jeśli wynik pomiaru będzie poniżej 1MHz...

  Lcd Wynik_pomiaru ; " Hz"                                 'Podaj wynik.

  Locate 2 , 1                                              'Druga linia Lcd, na początku.

  Lcd " GENERATOR m.cz."                                    'Napisz komunikat.

  Else                                                      'W przeciwnym razie...

  If Wynik_pomiaru > 999999 Then                            'Jeśli wynik będzie 1MHz lub wyżej...

  Lcd Wynik_pomiaru ; " x 0.00001"                          'Podaj wynik.

  Locate 2 , 1                                              'Druga linia Lcd, na początku.

  Lcd " GENERATOR m.cz."                                    'Napisz komunikat.

  Cursor Off                                                'Wyłącz kursor.

  Start Timer1

  Start Timer0

   End If                                                   'Koniec warunków.

   End If

   End If

   End If

 Loop                                                       'Powtórz pętlę.

 End                                                        'Koniec pętli.

 

 Odmierz_1s:                                                'Podprogram dla Timera0.

  Timer0 = 6                                                'Do Timera0 dodaj sześć i zapamiętaj jako Timer0 (zliczy 250).

  Incr Liczba_przerwan_tim0                                 'Liczbę przerwań Timera0 powiększ o jeden.

  If Liczba_przerwan_tim0 = 3208 Then                       'Jeśli liczba przerwań Timera0 jest równa 4000 (bo 4000*250us=1sek), to...

  Liczba_przerwan_tim0 = 0                                  'Wyzeruj zmienną.

  Wynik_pomiaru = 65536 * Lczba_przep_tim1                  'Zmienną Liczba_przep_tim1 pomnóż przez 65536, a wynik wstaw do zmiennej Wynik_pomiaru.

  Wynik_pomiaru = Wynik_pomiaru + Timer1                    'Wynik powyższego działania dodaj do aktualnej zawartości Timera1 i ten wynik wpisz do zmiennej Wynik_pomiaru.

  Flaga_aktual_lcd = 1                                      'Załącz flagę aktualizacji Lcd.

  Lczba_przep_tim1 = 0                                      'Zeruj flagę przepełnień Timera1.

  Timer1 = 0                                                'Zeruj Timer1.

   End If                                                   'Koniec uwarunkowania.

 Return                                                     'Wróć do programu.

 

 Zlicz_przep_tim1:

  Enable Interrupts                                         'Podprogram Timera1.

  Incr Lczba_przep_tim1                                     'Zawartość zmiennej Liczba_przep_tim1 powiększ o jeden.

  If Lczba_przep_tim1 = 53 Then                             'Po 58 przepełnieniach Timer-a 1...

  Cls                                                       'Czyść LCD.

  Lcd "Przepelnienie"                                       'Wpisz komunikat.

  Locate 2 , 1                                              'Druga linia Lcd, na początku.

  Lcd "   licznika"                                         'W drugiej linii wyświetl:

  Portd.0 = 0                                               'Ustaw 0 w Portd.0.

  Waitms 800                                                'Czekaj 1 sek.

   End If                                                   'Koniec warunku gdy będzie 58 przepełnień.

  Set Portd.0                                               'Ustaw 1 w Portd.0.

 Return                                                     'Wróć do programu.