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.
|
|||
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.
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.
Moja strona w powijakach
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
na T1 i tego chyba wgrywałem. Sorki za problem i jeszcze raz dzięki za pomoc.