Problem z termometrem


Witam
Chciałem zrobić sobie termometr na 3 wyświetlaczach led, ds18b20 i atmega8 ale nie działa mi ten program ciągle migają wyświetlacze i pojawiają się na nim różne cyfry

' Fuse bity ustawione fabrycznie
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'sterowanie segmentów LED
Config Portd = Output                                       'sterowanie segmentów LED
Config 1wire = Portc.5
Anoda1 Alias Portc.1                                        ' Lewy wyświetlacz
Anoda2 Alias Portc.2
Anoda3 Alias Portc.3
 
 
Dim Nr_wysw As Byte
Dim Liczba As Long
 
Dim Temp_liczba_1 As Word
Dim Temp_liczba_2 As Word
Dim Temp_liczba_3 As Word
 
Dim T As Integer ' temperatura
Dim I1 As Integer ' bierze udzial w konwersji temperatury
Dim Dsid1(8) As Byte ' adres czujnika temperatury
 
Config Timer0 = Timer , Prescale = 8
 
Enable Timer0
Enable Interrupts
On Timer0 Timint
Start Timer0
'Liczba = 888
Do
Dsid1(1) = 1wsearchfirst() ' odnalezienie czujnika temperatury
 
1wreset
1wwrite &H55
1wverify Dsid1(1) 'czujnik temp. - odbieranie temperatury itp.
1wwrite &HBE
I1 = 1wread(2)
 
1wreset
1wwrite &HCC
1wwrite &H44
 
I1 = I1 * 10
I1 = I1 / 16
T = I1 / 10
Liczba = T
Waitms 10
Loop
Timint:
Stop Timer0
Timer0 = 0
Temp_liczba_3 = Liczba
Temp_liczba_3 = Temp_liczba_3 Mod 10
Temp_liczba_2 = Liczba / 10
Temp_liczba_2 = Temp_liczba_2 Mod 10
Temp_liczba_1 = Liczba / 100
Start Timer0
Gosub Mult_wysw
Return
 
Mult_wysw:
Reset Anoda1
Reset Anoda2
Reset Anoda3
 
Select Case Nr_wysw
Case 0:
If Liczba >= 100 Then
Portd = Lookup(temp_liczba_1 , Kody7seg)
Else
Portd = &B0
End If
Set Anoda1
 
Case 1:
If Liczba >= 10 Then
Portd = Lookup(temp_liczba_2 , Kody7seg)
Else
Portd = &B0
End If
Set Anoda2
 
Case 2:
Portd = Lookup(temp_liczba_3 , Kody7seg)
Set Anoda3
End Select
 
Incr Nr_wysw
If Nr_wysw = 3 Then
Nr_wysw = 0
End If
Timer1 = 100000
Return
 
Kody7seg:
Data 247 , 160 , 111 , 238 , 188 , 222 , 223 , 224 , 255 , 254




Portret użytkownika mirley

Re: termometr

Po pierwsze uwaga kosmetyczna, bez wcięć program nie da się analizować. 5 minut szukałem pętli głównej.

Co do przerwania timera. Powinno ono ustawiać jedynie zmienne flagi, które obsłuży pętla główna (nie powinno być skoków do żadnej procedury). Zatrzymywanie timera w jego przerwaniu jest bezsensem. Tylko powoduje brak kontroli nad czasem przerwania. Wydłuża się czas o operacje które wykonujesz jak timer nie działa. Ustawienie wartości do timera powinno następować zaraz po wywołaniu przerwania.

Instrukcje do szukania czujników powinny być na pewno poza pętlą główną. Teraz działa ci to za szybko i ds nie ma szans działać. Musisz czekać w pętli co najmniej 1s a lepiej z 2s

Popatrz do moich programów termometrów. Mam kilka na stronie

-

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.