Atmega16 a DS18B20 neměří
Moderátor: Moderátoři
Atmega16 a DS18B20 neměří
Dobrý den,
jsem samouk a učím se programovat v cčku. Momentálně pracuji na teploměru s čidlem dallas 18B20. Bohužel mám napsaný program a v pořádku od simulovaný v ISIS proteus, bohužel však, když vše poskládám na nepájivém poli, tak teploměr ukazuje stále 0.0 což znamená, že je něco špatně.
Zkoušel jsem měnit spoustu věcí jako je časování sběrnice podle různých návodů a kód samotný jsem zkoušel taky asi 3x podle různých zdrojů když mi ten můj nefungoval. Výsledek byl vždy stejný, čidla jsem odzkoušel 4 různá.
Čidlo je zapojeno do normálního režimu s normálním napájením. Drátová propojení na nepájivém poli jsem propípal.
Jsem celkem zoufalý a proto bych Vás chtěl poprosit o nějakou radu, či revizi mého kódu v jazyce C. Předem děkuji.
Přikládám zde potřebné soubory
http://ulozto.cz/xoXzcPuS/ovladani-dallas-rar
jsem samouk a učím se programovat v cčku. Momentálně pracuji na teploměru s čidlem dallas 18B20. Bohužel mám napsaný program a v pořádku od simulovaný v ISIS proteus, bohužel však, když vše poskládám na nepájivém poli, tak teploměr ukazuje stále 0.0 což znamená, že je něco špatně.
Zkoušel jsem měnit spoustu věcí jako je časování sběrnice podle různých návodů a kód samotný jsem zkoušel taky asi 3x podle různých zdrojů když mi ten můj nefungoval. Výsledek byl vždy stejný, čidla jsem odzkoušel 4 různá.
Čidlo je zapojeno do normálního režimu s normálním napájením. Drátová propojení na nepájivém poli jsem propípal.
Jsem celkem zoufalý a proto bych Vás chtěl poprosit o nějakou radu, či revizi mého kódu v jazyce C. Předem děkuji.
Přikládám zde potřebné soubory
http://ulozto.cz/xoXzcPuS/ovladani-dallas-rar
- Přílohy
-
- ovladani_dallas.rar
- (1.97 KiB) Staženo 84 x
Při pohledu na ten program v "C" mě jímá děs a hrůza.
To je tak nepřehledné.
Jen pro porovnání jak to řeším já.
'-------------------------------------------------------------------
'konfigurace sběrnice 1wire
Config 1wire = Porta.7 'zde je připojeno čidlo
'Dim T1 As Single
'Dim T2 As Single
Defsng T
Defbyte B
Dim Tmp As String * 6
Dim Znak As String * 1
'-------------------------------------------------------------------
Sub Teplomer_ds18b20
1wreset
1wwrite &HCC 'skip ROM
1wwrite &H44 'convert T
Waitms 750
1wreset
1wwrite &HCC 'skip ROM
1wwrite &HBE 'read
B1 = 1wread() 'odečet teploměru (LSB)
B2 = 1wread() 'odečet teploměru (MSB)
1wreset
If B2 >= 248 Then 'v případě záporných teplot
B1 = 255 - B1 'Od 255 odečteme B1
B2 = 255 - B2 'Od 255 odečteme B2
Znak = "-" 'zobrazíme znak "mínus"
Else
Znak = " " ' nebo "+"
End If
T1 = B1 / 16 'Přesunutí vpravo o 4 bajty
T2 = B2 * 16 'přesunutí vlevo o 4 bajty
T1 = T1 + T2
Tmp = Fusing(t1 , "#.#") 'v "Tmp" je teplota jako "string"
End Sub
To je tak nepřehledné.
Jen pro porovnání jak to řeším já.
'-------------------------------------------------------------------
'konfigurace sběrnice 1wire
Config 1wire = Porta.7 'zde je připojeno čidlo
'Dim T1 As Single
'Dim T2 As Single
Defsng T
Defbyte B
Dim Tmp As String * 6
Dim Znak As String * 1
'-------------------------------------------------------------------
Sub Teplomer_ds18b20
1wreset
1wwrite &HCC 'skip ROM
1wwrite &H44 'convert T
Waitms 750
1wreset
1wwrite &HCC 'skip ROM
1wwrite &HBE 'read
B1 = 1wread() 'odečet teploměru (LSB)
B2 = 1wread() 'odečet teploměru (MSB)
1wreset
If B2 >= 248 Then 'v případě záporných teplot
B1 = 255 - B1 'Od 255 odečteme B1
B2 = 255 - B2 'Od 255 odečteme B2
Znak = "-" 'zobrazíme znak "mínus"
Else
Znak = " " ' nebo "+"
End If
T1 = B1 / 16 'Přesunutí vpravo o 4 bajty
T2 = B2 * 16 'přesunutí vlevo o 4 bajty
T1 = T1 + T2
Tmp = Fusing(t1 , "#.#") 'v "Tmp" je teplota jako "string"
End Sub
Než hledat chybu v nefunkčním kodu mi příjde jednoduší vyjít z již ověřeného funkčního kodu.
Zkus tam narvat tento kod z: http://sheepdogguides.com/arduino/ar3ne1tt.htm
Je to minimalistická varianta, která neřeší více čidel na jednom drátu ani procházení dle ROM.
Pro ověření funkce HW to stačí a pak se můžeš inspirovat a zakomponovat části do svého kodu. Mě to trochu blbne s přerušením, které způsobí rozhození v časování komunikace.
Zkus tam narvat tento kod z: http://sheepdogguides.com/arduino/ar3ne1tt.htm
Je to minimalistická varianta, která neřeší více čidel na jednom drátu ani procházení dle ROM.
Pro ověření funkce HW to stačí a pak se můžeš inspirovat a zakomponovat části do svého kodu. Mě to trochu blbne s přerušením, které způsobí rozhození v časování komunikace.
mtajovsky: V době kdy jsem si s tím DS18B20 hrál (2009) mi to přišlo jednodušší.
DECLARE SUB TEST[( [BYREF|BYVAL|BYLABEL|BYREG|BYSTACK] var as type)]
http://avrhelp.mcselec.com/
DECLARE SUB TEST[( [BYREF|BYVAL|BYLABEL|BYREG|BYSTACK] var as type)]
http://avrhelp.mcselec.com/