Witam! mam problem z uruchominiem poprawnym temometru z ds1820 na Atmega8. program dziala na 2313, a na atmedze wyswietla non stop 12 stopni... :-/ nie wiem dlaczego... natomiast drugi program nie chce ruszyc wogole , wyswietla mi blad (rejestr Err = 1). Jesli moglby ktos rzucic okiem co jest , co moze byc nie tak bede wdzieczny.
moze sie ktos podzielic jakimis programikami pod ATmega8 ? ktore dzialaja ? widze ze juz ktos na grupie probowal przejsc z 2313 na atmege i tez mu nie dzialalo.. ale nie widze rozwiazania problemu. pozdrawiam Arkos
program 1. czyta temperature z 1 czujnika:
'termometr pod ATMega8!!!!!!!
'podlaczenie segmentow LED: 'a=portd.0, b=portd.1, c=portd.2, d=portd.3, e=portd.4, f=portd.5, g=portd.6 'anody: 'dziesietne czesci stopni = portc.0, jednostki = portc.3, dziesiatki = portc.5 $crystal = 12000000 Config Portd = 255 'caly portd pracuje jako wyjscie Portd = 255 'spoczynkowy stan "1" Config Portb = &B11100010 'wejscia Portb = 255 Config Portc = &B111111101 '255 Portc = 255 Dim Blad As Bit Dim Temp As Byte Dim Ramtemp As Integer Dim Eetemp As Eram Integer At 1 Dim Flaga As Bit Dim Y As Integer Dim Y1 As Integer Dim T As Integer , T1 As Integer Dim Licz As Byte Dim Tmp As Byte Dim Bd(9) As Byte Dim Maxlicz As Integer Dim Histereza As Integer S1 Alias Pinb.2 'przyciski S2 Alias Pinb.3 S3 Alias Pinb.4
Declare Sub Disp Declare Sub Dekoder Declare Sub Temperature Declare Sub Read1820 Declare Sub Ustaw Config 1wire = Portc.1 'konfiguracja 1WIRE , tu podlaczam ds1820 Blad = 1 Readeeprom Ramtemp , Eetemp
Do 'petla glowna programu Temperature 'podprogram odczytu temp.
If S3 = 0 Then Gosub Ustaw 'jesli nacisniety s3 to skocz do podprogramu oblsugi nastaw temp zadanej
If T > Ramtemp Then : Reset Portb.1 'wlacza klime jesli temp zmierzona jest wieksza niz nastawiona End If
Histereza = Ramtemp Histereza = Histereza - 10
If T < Histereza Then 'klima wylacza sie gdy temp zmierzona jest mniejsza od (nastawionej - 1 stopien). Set Portb.1 End If
Loop 'koniec petli glownej
Sub Temperature 'pomiar temperatury
1wwrite &HCC 'pominiêcie identyfikacji uk³adu DS1820
1wwrite &H44 'start konwersji A/D 'Waitms 200 Disp 'podprogram wyswietlania wyniku Read1820 'podprogram odczytu temperatury
Blad = Err 'jesli nie ma czujnika, lub inny problem, specjalny rejesytr Err ma wartosc "1" End Sub
Sub Read1820 'podprogram odczytu temperatury
1wreset 'inicjalizacja magistrali 1WIRE
1wwrite &HCC '¿±danie dostêpu do pamiêci RAM
1wwrite &HBE Bd(1) = 1wread(9) 'odczyt zawarto¶ci pamiêci i umieszczenie danych w tablicy
1wreset 'reset magistrali Tmp = Bd(1) And 1 'konwersja danych z precyzj± 0,1 C If Tmp = 1 Then Decr Bd(1) T = Makeint(bd(1) , Bd(2)) T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100 T1 = T1 / Bd(8) : T = T + T1 : T = T / 10 End Sub
Sub Disp 'podprogram obslugi wyswietlaczy
If Flaga = 1 Then 'jesli nastapoil skok do podprogramu nastawy temp. Y1 = Ramtemp 'zmienna ramtemp przechowuje aktualna wartsoc nastawionej temp ktora chcemy utrzymac Maxlicz = 15 'wynik zostanie wyswietlony 15 razy Else Y1 = T 'jesli nie ma skoku wyswietli temp zmierzona. Maxlicz = 200 'wynik wyswietla 200 razy End If For Licz = 1 To Maxlicz
Y = Y1 Mod 10 'Obliczanie dziesietnych czesci , jednostki If Y1 < 0 Then Y = Y * -1 End If Dekoder Portd = Y Portc.3 = 0 Waitus 300 Portc.3 = 1
Y = Y1 / 10 'Obliczanie jednostek , dziesiatki If Y1 < 0 Then Y = Y * -1 End If Y = Y Mod 10 Dekoder Portd = Y Portc.0 = 0 Waitus 300 Portc.0 = 1
Y = Y1 / 100 'Obliczanie dziesiatek If Y1 < 0 Then Y = Y * -1 End If Y = Y Mod 10 If Y < 0 Then If Y = 1 Then Y = 12 Else Y = 11 End If End If Dekoder Portd = Y If Portd <> 64 Then 'wygasza zbedne zero Portc.3 = 0 Waitus 300 Portc.3 = 1 Else If Temp = 1 Then Portc.3 = 0 Waitus 300 Portc.3 = 1 End If End If
Next Licz End Sub
Sub Dekoder 'podprogram dekodera BCD/7segment
'If Blad = 1 Then 'zmienna blad ma taki stan jak rejestr Err 'Y = 11 'jest tez blokowana w trybie nastawiania zadanej temp. 'End If
Select Case Y Case 0 : Y = 64 'Konwersja cyfry 0 Case 1 : Y = 121 'Konwersja cyfry 1 Case 2 : Y = 36 'Konwersja cyfry 2 Case 3 : Y = 48 Case 4 : Y = 25 Case 5 : Y = 18 Case 6 : Y = 2 Case 7 : Y = 120 Case 8 : Y = 0 Case 9 : Y = 16 'konwersja cyfry 9 Case 11 : Y = 63 'konwersja znaku "-" /minus/ Case 12 : Y = 57 'konwersja znaku "-1" /minus jeden, na jednym LED/ End Select
End Sub
Sub Ustaw 'pozwala na ustawienie i zapisanie w eeprom procesora temp ktora ma byc utrzymywana. Do Waitms 30 'wykrywa nacisniecie przycisku s3, i powoduje za led migaja :) Set Flaga ' zmienna pomocnicza Reset Blad 'jesli ds nie dziala, pozwala jednak wejsc w tryb nastawu temp If S1 = 0 Then 'zwiekszanie nastawu temp. If Ramtemp < 90 Then 'zakres do 90 stopni od zera tak sobie wymyslilem Incr Ramtemp Else Ramtemp = 90 'nie da sie ustawic wiecej niz 90 C End If End If
Gosub Disp 'wyswietlenie aktualnej wartosci nastawu
If S2 = 0 Then ' zmniejszanie If Ramtemp > 10 Then Decr Ramtemp Else Ramtemp = 10 End If End If
Gosub Disp 'wyswietlenie nastawu Loop Until S3 = 0 'wyjscie z podporgramu po nacisnieciu s3 Blad = Err 'odblokowuje zmienna blad. Reset Flaga 'zeruje zmeinna pomocnicza, przechodzi do wyswietlania temp. zmierzonej Writeeeprom Ramtemp , Eetemp 'zapis nastawionej temp do pamieci eeprom avr'a End Sub
program 2 czyta z dwoch czujnikow ds.. mozna w nim tez ustawic temp przyciskami:
$crystal = 12000000 Config Portb = &B11100010 'wyjscie / wejscie Portb = 255 '&B1100010 'stan wyjsc Config Portd = 255 Portd = 255 ' &B1111110 Config Portc = 255 Portc = 255 Declare Sub Ustaw Declare Sub Ustaw2 Declare Sub Convallt ' Convert T on ALL sensors Declare Sub Porownaj Declare Sub Porownaj2 Declare Function Decigrades(byval Sc(9) As Byte) As Integer Dim Licz As Byte Declare Sub Disp Declare Sub Dekoder S1 Alias Pinb.2 'przyciski S2 Alias Pinb.3 S3 Alias Pinb.4
Config 1wire = Pinb.0 '6 '0,1,2 NOP 3,4,5,6,7 works good ON MY Equipment
Dim Dg As Integer 'DECIgrades, I call it, cause I have no space for commas on the display.... Dim Temp1 As Integer Dim Temp2 As Integer Dim Temp3 As Integer Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC Dim Dsid2(8) As Byte Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20 Dim Y As Byte Dim Y1 As Integer Dim Maxlicz As Byte Dim Ramtemp As Integer Dim Rramtemp As Integer Dim Eetemp As Eram Integer At 1 Dim Eetempp As Eram Integer At 10 Dim Flaga As Bit Dim Flaga2 As Bit Dim Flagapowrot As Bit Dim Blad As Bit 'Getting the two sensors IDs. Readeeprom Ramtemp , Eetemp Readeeprom Rramtemp , Eetempp Dsid1(1) = 1wsearchfirst() Do Dsid2(1) = 1wsearchnext() Loop Until Err = 1 'Main loop Do Convallt ' podprogram......"Convert ALL T on the 1w-bus" Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200 'if you use
2-wire, could be reduced to 200us
1wverify Dsid1(1) 'Issues the "Match ROM " If Err = 1 Then Temp1 = 0 Reset Portb.1 Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE Sc(1) = 1wread(9) 'read bytes into array If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) Temp1 = Dg 'temperatura zasilania , pierwszy czujnik!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! End If End If
1wverify Dsid2(1) If Err = 1 Then Reset Portb.1 ' na wszelkii wypadek wylacza pompe Elseif Err = 0 Then
1wwrite &HBE Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) Temp2 = Dg 'temperatura powrotu, drugi czujnik ds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! End If End If Porownaj 'podprogram Disp Porownaj2
If S3 = 0 Then Gosub Ustaw If S1 = 0 Then Gosub Ustaw2
While S2 = 0 Flagapowrot = 1 Disp Wend
Loop End 'end program
Sub Porownaj2 If Temp1 < Rramtemp Then Reset Portc.4 Else Set Portc.4 End If End Sub
Sub Porownaj 'If Err = 1 Then 'Temp1 = 0 'Temp2 = 0 'Else If Temp1 > Ramtemp Then Temp3 = Temp1 - Temp2 If Temp3 > 3 Then Reset Portb.1 'wlaczone End If If Temp3 < 2 Then 'histereza 1 stp. Set Portb.1 'wylacz End If Else Set Portb.1 'wylacz End If End Sub
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T End Sub
'Makes a integer value of the first two bytes in scratchpad''''''''''''' 'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate Function Decigrades(byval Sc(9) As Byte) Decigrades = 0 Decigrades = Makeint(sc(1) , Sc(2)) Decigrades = Decigrades * 10 Decigrades = Decigrades / 19 End Function ' If you have DS1820 or DS18 S 20 , you can use this algo instead: ' Observe that DsId1(1) contains the info value of which sensor is used.
Sub Disp 'podprogram obslugi wyswietlaczy
If Flaga = 1 Then 'jesli nastapoil skok do podprogramu nastawy temp. Y1 = Ramtemp 'zmienna ramtemp przechowuje aktualna wartsoc nastawionej temp ktora chcemy utrzymac Maxlicz = 15 'wynik zostanie wyswietlony 15 razy Else If Flaga2 = 1 Then Y1 = Rramtemp Maxlicz = 20 Else If Flagapowrot = 1 Then Y1 = Temp2 Else Y1 = Temp1 'jesli nie ma skoku wyswietli temp zmierzona przez ds1, zasilanie!!!!!!!. Maxlicz = 200 'wynik wyswietla 200 razy End If End If End If For Licz = 1 To Maxlicz
Y = Y1 Mod 10 'Obliczanie jednostek If Y1 < 0 Then Y = Y * -1 End If Dekoder Portd = Y Portc.0 = 0 Waitms 1 Portc.0 = 1
Y = Y1 / 1 'Obliczanie dziesi±tek If Y1 < 0 Then Y = Y * -1 End If Y = Y Mod 10 Dekoder Portd = Y Portc.3 = 0 Waitms 1 Portc.3 = 1
''Y = Temp1 / 1000 'Obliczanie tysiêcy ''If Temp1 < 0 Then ''Y = Y * -1 ''End If ''Y = Y Mod 10 ''If Temp1 < 0 Then ''Y = 11 ''End If ''Dekoder ''Portb = Y ''Temp1 = Y ''If Portb <> 64 Then ''Portd.3 = 0 ''Waitms 2 ''Portd.3 = 1 ''End If
Y = Y1 / 10 'Obliczanie setek If Y1 < 0 Then Y = Y * -1 End If Y = Y Mod 10 Dekoder Portd = Y If Portd <> 64 Then Portc.5 = 0 Waitms 1 Portc.5 = 1 'Else 'If Temp1 = 1 Then 'Portd.2 = 0 'Waitms 2 'Portd.2 = 1 'End If End If
Next Licz End Sub
Sub Dekoder 'podprogram dekodera BCD/7segment
If Err = 1 Then Y = 11 End If
Select Case Y Case 0 : Y = 64 Case 1 : Y = 121 Case 2 : Y = 36 Case 3 : Y = 48 Case 4 : Y = 25 Case 5 : Y = 18 Case 6 : Y = 2 Case 7 : Y = 120 Case 8 : Y = 0 Case 9 : Y = 16 Case 11 : Y = 63 'Case 12 : Y = 57 End Select End Sub
Sub Ustaw 'pozwala na ustawienie i zapisanie w eeprom procesora temp ktora ma byc utrzymywana. Do Waitms 200 'wykrywa nacisniecie przycisku s3, i powoduje za led migaja :) Set Flaga ' zmienna pomocnicza Reset Blad 'jesli ds nie dziala, pozwala jednak wejsc w tryb nastawu temp If S1 = 0 Then 'zwiekszanie nastawu temp. If Ramtemp < 99 Then 'zakres do 90 stopni od zera tak sobie wymyslilem Incr Ramtemp Else Ramtemp = 99 'nie da sie ustawic wiecej niz 90 C End If End If Gosub Disp 'wyswietlenie aktualnej wartosci nastawu If S2 = 0 Then ' zmniejszanie If Ramtemp > 5 Then Decr Ramtemp Else Ramtemp = 5 End If End If Gosub Disp 'wyswietlenie nastawu Loop Until S3 = 0 'wyjscie z podporgramu po nacisnieciu s3 Blad = Err 'odblokowuje zmienna blad. Reset Flaga 'zeruje zmeinna pomocnicza, przechodzi do wyswietlania temp. zmierzonej Writeeeprom Ramtemp , Eetemp 'zapis nastawionej temp do pamieci eeprom avr'a End Sub
Sub Ustaw2 'pozwala na ustawienie i zapisanie w eeprom procesora temp ktora ma byc utrzymywana. Do Waitms 200 'wykrywa nacisniecie przycisku s3, i powoduje za led migaja :) Set Flaga2 ' zmienna pomocnicza Reset Blad 'jesli ds nie dziala, pozwala jednak wejsc w tryb nastawu temp If S3 = 0 Then 'zwiekszanie nastawu temp. If Rramtemp < 99 Then 'zakres do 90 stopni od zera tak sobie wymyslilem Incr Rramtemp Else Rramtemp = 99 'nie da sie ustawic wiecej niz 90 C End If End If Gosub Disp 'wyswietlenie aktualnej wartosci nastawu If S2 = 0 Then ' zmniejszanie If Rramtemp > 10 Then Decr Rramtemp Else Rramtemp = 10 End If End If Gosub Disp 'wyswietlenie nastawu Loop Until S1 = 0 'wyjscie z podporgramu po nacisnieciu s3 Blad = Err 'odblokowuje zmienna blad. Reset Flaga2 'zeruje zmeinna pomocnicza, przechodzi do wyswietlania temp. zmierzonej Writeeeprom Rramtemp , Eetempp 'zapis nastawionej temp do pamieci eeprom avr'a End Sub