<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=12&amp;t=5334&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-12-30T00:19:13+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=12&amp;t=5334&amp;mode</id>
<entry>
<author><name><![CDATA[Buczek]]></name></author>
<updated>2013-12-30T00:19:13+01:00</updated>
<published>2013-12-30T00:19:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5334&amp;p=62842#p62842</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5334&amp;p=62842#p62842"/>
<title type="html"><![CDATA[Błąd w timerach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5334&amp;p=62842#p62842"><![CDATA[
Witam Panowie,<br />mam problem najprawdopodobniej z timerami.<br />poniższy kod obsługuje LCD- tu wszystko OK.<br />Czujnik Ds18B20- wszystko OK<br />Dwa przyciski, jeden to Start/Stop, drugi Reset.<br />Urządzenie ma za zadanie:<br />1. mierzyć temperaturę<br />2. po naciśnięciu przycisku Start/Stop, wyświetlić Temperaturę ustaloną (ostatni pomiar), całkowity czas pomiaru, i stała czasową tał.<br /><br />Problem polega na tym, że timer0 odmierza sobie odstępy czasu  co 1 s. I jak zliczy sobie załóżmy 58 s to pojawia się nagle &quot;-1s&quot;, i od tej chwili chyba wykonanie kodu  się jakoś zapętla i przyciski nie reagują na wciśniecie. Temperatura jest nadal mierzona prawidłowo i czas jest dalej mierzony od  -1s. To nie zdarza się konkretnie w 58 sekundzie pomiaru ale całkowicie przypadkowo czasem już po 1 sek, czasem dopiero po 100s, jednak dzieje się to za każdym razem. <br />Proszę bardziej doświadczonych kolegów o analize kodu i pomoc w wyeliminowaniu błędu, bo nie wiem na czym on dokładnie polega.<br />Dodam tylko, że kod jest testowany na Atmedze 644p 16MHz, docelowo ma to pracować na Atmedze 8l-8 Mhz.<br /><br />[syntax=basic4gl]'$regfile = &quot;m8def.dat&quot;                                        'rejestry mikrokontrolera atmega8<br /> $regfile = &quot;m644pdef.dat&quot;<br />'$crystal = 8000000                                            'częstotliwość taktowania mikrokontrolera<br />$crystal = 16000000<br />Config Lcd = 16 * 2                                         'konfiguracja LCD<br />Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7       'konfiguracja pinów LCD<br />Cursor Off Noblink                                          'wyłączenie kursora LCD<br /><br />Deflcdchar 0 , 32 , 32 , 32 , 31 , 4 , 4 , 5 , 3            ' znak stałej czasowej tał (0)<br /><br />Config 1wire = Pind.4                                       ' konfiguracja magistrali 1-wire<br />Dim Lsb As Byte , Msb As Byte , T As Single , S As String * 6       ' Deklaracja zmiennych<br />Dim L As Single , K As String * 6<br /><br /><br /><br /><br />Config Pind.2 = Input                                       'Pind.2 jako wejście<br />Config Pind.3 = Input                                       'Pind.3 jako wejście<br /><br />Config Timer0 = Timer , Prescale = 64                       'deklaracja timera0 jako czasomierza z prescalerem 64<br />Config Timer1 = Timer , Prescale = 256                      'deklaracja timera1 jako czasomierza z prescalerem 256<br />Config Watchdog = 256                                       'konfiguracja Watchdog, czas oczekiwania 256 msek.<br />Reset Watchdog                                              ' zerowanie licznika Watchdoga<br />Start Watchdog                                              ' start Watchdog<br /><br />On Timer0 Przerwanie_co_2ms                                 'deklaracja jaka etykieta obsługuje przepełnienie od timer0<br />On Timer1 Przerwanie_co_1s                                  ' deklaracja jaka etykieta obsługuje przepełnienie od timer1<br /><br />Set Pind.2                                                  'ustawiwnie stanu wysokiego na PIND.2<br />Set Pind.3                                                  'ustawiwnie stanu wysokiego na PIND.3<br />Dim Licznik As Integer                                      'Deklaracja zmiennej Licznik<br />Dim Licznik2 As Integer                                     'Deklaracja zmiennej Licznik2<br />Dim Licznik3 As Integer                                     'Deklaracja zmiennej Licznik3<br />Dim Czas As Integer                                         'Deklaracja zmiennej Czas<br />Dim P_p As Word                                             'Deklaracja zmiennej P_p<br />Dim P_p2 As Word                                            'Deklaracja zmiennej P_p2<br /><br />Enable Interrupts                                           'odblokowanie globalnych przerwań<br />Enable Timer0                                               'odblokowanie przerwania od przepełnienia timer0<br />Enable Timer1                                               'odblokowanie przerwania od przepełnienia timer1<br />Reset Timer0<br />Reset Timer1<br />Timer0 = 6                                                  'wpisanie wartości początkowej 6 do timera,czyli timer będzie zliczał 250 (256-6) impulsów<br />Timer1 = 34286                                              'wpisanie wartości początkowej 34286 do timera1,czyli timer będzie zliczał  (65536-34286) impulsów czyli 31250 impulsów<br />Licznik = 0                                                 'wyzerowanie zmiennej Licznik<br />Licznik2 = 0                                                'wyzerowanie zmiennej Licznik2<br />Licznik3 = 0                                                'wyzerowanie zmiennej Licznik3<br />Czas = 0                                                    'wyzerowanie zmiennej Czas<br /><br />Cls                                                         'wyczyszczenie LCD<br /><br />Do                                                          'pętla główna pprogramu<br />                                                            'pętla: Jeżeli licznik3=1 to<br />If Licznik3 = 1 Then                                        ' w gornej lini LCD<br />   Reset Watchdog                                           ' zerowanie licznika Watchdoga<br />   Upperline                                                ' wyświetl temperaturę ustaloną<br />   Lcd &quot;  Tust.  &quot; ; S ;                                    ' w dolnej lini<br />   Lowerline                                                ' całkowity czas pomiaru oraz wartość stałej czasowej<br />   Lcd &quot;Czas &quot; ; Czas ; &quot;s &quot; ; Chr(0) ; &quot; &quot; ; K<br />      Else                                                  ' jeżeli licznik3 nie rowna się 1 to<br />         Reset Watchdog<br />         Upperline                                          ' w górnej lini LCD<br />         Lcd &quot;Temp. &quot; ;                                     ' wyświetl napis Temp.<br />         Lowerline                                          'w dolnej lini LCD<br />         Lcd &quot;Czas      &quot; ; Czas ; &quot;s&quot;                      ' wyświetl aktualnie odmierzony czas<br />End If                                                      ' koniec petli If<br /><br />If Licznik3 &gt; 2 Then<br />Licznik3 = 0                                                'zerowanie licznika 3 jeżeli jego wartość jest większa od 2<br />End If<br />'//////////////////Pomiar temperatury////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />1wreset                                                     'wysyłanie sygnał resetu i inicjalizacji magistrali,<br />1wwrite &amp;HCC                                                'wysyłanie rozkazu Convert T, który powoduje dokonanie pomiaru<br />1wwrite &amp;H44<br />   If Licznik2 &gt; 0 Then                                     'pętla wykonywana co 1 sekundę potrzebna na wykonaie konwersji pomiaru przez DS18B20<br />   Reset Watchdog                                           ' zerowanie licznika Watchdoga<br />   1wreset                                                  'reset magistrali 1-wire<br />   1wwrite &amp;HCC                                             'pominięcie identyfikacji czujnika<br />   1wwrite &amp;HBE                                             'wysłanie rozkazu Read scratchpad, który powoduje, odczyt danych  z magistrali 1-wire<br />   Lsb = 1wread()                                           'odczyt niższego bajtu danych<br />   Msb = 1wread()                                           'odczyt wyższyego bajtu danych<br />   T = Msb * 256                                            'obliczenia zmiennej T<br />   T = T + Lsb<br />   T = T / 16                                               'obliczenia zmiennej L<br />   L = 63 / 100<br />   L = T * L                                                'dokonujemy konwersji danych na format tupu Single<br />                                                      ' koniec pętli If<br />      If Msb.7 = 1 Then<br />      T = T - 4096                                          'sprawdzamy bit znaku (1-liczba ujemna, 0-liczba nieujemna) i w przypadku liczb ujemnych dokonujemy korekty wartości<br />      End If<br /><br />   S = Fusing(t , &quot;#.##&quot;)                                   'formatujemy dane aby były wyświetlane ze znakiem także dla wartości ujemnych<br />   S = Format(s , &quot;+00000&quot;)<br />   K = Fusing(l , &quot;#.##&quot;)                                   'formatujemy dane aby były wyświetlane ze znakiem także dla wartości ujemnych<br />   K = Format(k , &quot;00000&quot;)<br /><br />   Upperline                                                'wyświetlnie temperatury w górnej lini LCD<br />   Lcd &quot;Temp.     &quot; ; S<br />   Licznik2 = 0<br />   End If<br /><br />'////////////////////////////////////////// Obsługa klawiszy///////////////////////////////////////////////////////////////////////////////////////////<br /><br />If P_p = 0 And Pind.2 = 0 Then                              'obsługa przycisku Start/Stop<br />   P_p = 1<br />   Stop Timer0                                              'zatrzymanie timera0<br />   Stop Timer1                                              'zatrzymanie timera1<br />   Incr Licznik3                                            'zwiększenie wartości Licznika3 o 1<br />   Else<br />      If P_p = 1 And Pind.2 = 1 Then<br />         For P_p = 1 To 255                                 'eliminacja drgań styków<br />         Incr P_p<br />         Next P_p<br />          If P_p = 257 Then<br />          P_p = 0<br />          End If<br />      End If<br />End If<br /><br />If P_p2 = 0 And Pind.3 = 0 Then                             'obsuga klawisza Reset<br />   P_p2 = 1<br />   Czas = 0                                                 'wyzerowanie zmiennej Czas<br />   Incr Licznik3                                            'zwiększenie wartości Licznika3 o 1<br />   Cls                                                      ' wyczyszczenie ekranu<br />   Else<br />      If P_p2 = 1 And Pind.3 = 1 Then<br />         For P_p2 = 1 To 255                                'eliminacja drgań styków<br />         Incr P_p2<br />         Next P_p2<br />          If P_p2 = 257 Then<br />          P_p2 = 0<br />          End If<br />      End If<br />End If<br /><br />  If Czas = 0 And P_p = 1 Then                              ' pętla if<br />     Cls                                                    ' czyszczenie ekranu<br />    Start Timer0                                            ' start  TIMER0<br />    Start Timer1                                            ' start  TIMER1<br /><br />  End If                                                    'koniec pętli If<br />   Reset Watchdog                                           ' zerowanie licznika Watchdoga<br />Loop                                                        'koniec pętli Do<br /><br />End                                                         'koniec programu<br /><br />'/////////////////////////////////////////////////////////Koniec programu//////////////////////////////////////////////////////////////////////////////<br /><br /><br />Przerwanie_co_2ms:                                          'podprogram przerwania od przepełnienia timer0 wywoływanego co 2 ms<br /><br />Timer0 = Timer0 + 6                                         'ustawienie początkowej wartości timera0 poprzez dodanie do niego wartości 6 (odliczone zostanie dokładnie kolejne 250 impulsów)<br />Incr Licznik                                                'zwiększenie licznika<br />If Licznik = 500 Then                                       'jeśli zmienna Licznik równa się 500 (czyli odliczone zostało 500*2ms=1sek), to<br />   Incr Czas                                                ' zwiększ zmienną Czas oraz<br />   Licznik = 0                                              'wyzeruj zmienną licznik<br /> End If                                                     'koniec pętli IF<br />Return                                                      ' powrót do programu<br /><br /><br /><br /><br />                                                             'podprogram przerwania od przepełnienia timer1 wywoływanego co 1 s<br />Przerwanie_co_1s:<br />Timer1 = Timer1 + 34286                                     'ustawienie początkowej wartości timera1<br /><br /> Incr Licznik2                                              ' zwiekszenie wartości licznika2 o 1<br /><br />Return                                                      ' powrót do programu[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=546">Buczek</a> — 30 gru 2013, o 00:19</p><hr />
]]></content>
</entry>
</feed>