atmega 8 timer T1


Witam napisałem sobie programik który w zależności od odczytu z dwóch końcówek przetwornika A/C zmienia z określoną częstotliwością stan linii PORTC.4. Timer T1 jest 16 bitowy dzięki czemu mogę wpisywać do niego wartości do 65534.

$sim
$regfile = "m8def.dat"                                      'informuje kompilator o pliku
'dyrektyw mikrokontrolera
 
$crystal = 8000000                                          'informuje kompilator o częstotliwości oscylatora
                                                             'taktującego mikrokontroler
Config Portc.5 = Output                                     'konfiguracja pinu sterującego kierunkiem
Config Portc.4 = Output                                     'konfiguracja pinu odpowiedzialnego za częstotliwość
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
                                                             'konfiguracja linii mikrokontrolera, do których dołączono
                                                             'wyświetlacz LCD
Config Timer1 = Timer , Prescale = 256
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja przewornika ADC 
                                                             'napięciem odniesienia jest napięcie zasilające część analogową
 
Start Adc
Dim N0 As Word                                              'zmienna do której jest zapisywana wartość z wejścia ADC0 
Dim N1 As Word                                              'zmienna do której jest zapisywana wartość z wejścia ADC1
Dim A As Word                                               'zmienna do której jest zapisywana wartość początkowa timera
Dim B As Word                                               'zmienna pomocnicza
Dim C As Word                                               'zmienna która oblicza różnice między wartościami z ADC
 
On Timer1 Czenstot
Enable Interrupts                                           'odblokowanie globalnego sysytmy przerwań
Enable Timer1                                               'odblokowanie przerwania od timer1
Load Timer1 , A                                             'wczytanie do licznika wartości początkowej A
 
Do
 
   N0 = Getadc(0)                                           'odczytanie wartości z wejścia ADC0 mikrokontrolera
   N1 = Getadc(1)                                           'odczytanie wartości z wejścia ADC1 mikrokontrolera
 
   If N0 > N1 Then                                          'warunek zmiany kierunku 
      Set Portc.5                                           'warunek spełniony to przekaznik sie załączy
      C = N0 - N1                                           'obliczenie zmiennej C (różnica odczytywanych wartości z ADC)
   Else
      Reset Portc.5                                         'zerowanie kierunku
      C = N1 - N0                                           'obliczenie zmiennej C (różnica odczytywanych wartości z ADC)
   End If
 
   Select Case C                                            'dla różnicy od 0 do 30 częstotliwość załącznia 0 Hz
      Case 0 To 30
         A = 0
      Case 30 To 300                                        'dla różnicy od 30 do 300 częstotliwość załącznia 8MHz/256/65530=0,47 Hz ok raz na 2s
         A = 65530
      Case 300 To 1024                                      'dla różnicy od 300 do 1024 częstotliwość załącznia 31 kHz
         A = 1
   End Select
 
   Cls
   Lcd "1-" ; N0 ; "*2-" ; N1                               'wyświetlenie wartości z przetwornika
   Lowerline
   Lcd A ; "--" ; B                                         'wyswietlenie zmiannej A oraz B
   Waitms 200
Loop
 
Czenstot:
                                                             'podprogram obsługi przerwamia
Load Timer1 , A
Toggle Portc.4                                              'zmiana na stan przeciwny pinu c4
B = 20
Return

Problem jest następujący, dlaczego w symulatorze stan linii PORTC.4 się nie zmienia oraz na wyświetlaczu nie jest wyświetlana wartość zmiennej B? Żaden błąd nie wyskakuje pozostałe zmienne wyświetlane są prawidłowo oraz stan linii PORTC.5 również zmienia się prawidłowo. Co jest nie tak w tym programie że T1 nie działa.




Portret użytkownika mirley

Re: Timer

Po pierwsze spróbuj dodać polecenie start timer1, a zamiast load timer1 daj poprostu Timer1 = xxxx gdzie xxxx jest wartością 65536 - A.

Testuj na procku a nie w symulatorze jeśli to możliwe

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: atmega 8 timer T1

Też miałem zasugerować to co Mirek. Przede wszystkim użyj polecenia:

TimerX=wartość

Ja zawsze używam tegoż polecenia i działa.

Portret użytkownika michal512

Re: timer T1

Dzięki za podpowiedzi, problem rozwiązany. Nie wiem dlaczego ale wgrałem chyba nieco inny program pierwszym razem. Po prostu przerabiałem go z jego wcześniejszej wersji gdzie wykorzystywałem T0. Ostatecznie wyszło kilka wersji i w jednej zapomniałem zamienić w

Config Timer0 = Timer , Prescale = 256

na T1 i tego chyba wgrywałem. Sorki za problem i jeszcze raz dzięki za pomoc.