Atmega16 a DS18B20 neměří

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
iops
Příspěvky: 1
Registrován: 12 kvě 2013, 02:00

Atmega16 a DS18B20 neměří

#1 Příspěvek od iops »

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
Přílohy
ovladani_dallas.rar
(1.97 KiB) Staženo 84 x

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#2 Příspěvek od frpr666 »

pošli informace:
- označení uC Atmel
- schéma tvého zapojení
- konfigurační bajty uC
- v jakém sw to kompiluješ
- jakým programátorem to nahráváš

pozn. 1
V každé solidní knížce o programování je, že v .h souboru by neměly být definice funkcí. Definice se dávají do .c souboru !

Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#3 Příspěvek od nekmil »

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

Uživatelský avatar
rob_brno
Příspěvky: 209
Registrován: 12 říj 2012, 02:00

#4 Příspěvek od rob_brno »

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.

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#5 Příspěvek od frpr666 »

@nekmil
mě jímá děs a hrůza na výpis:
Sub Teplomer_ds18b20
End Sub

Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#6 Příspěvek od nekmil »

frpr666: :) Název jako název. Furt lepší než ty 3 miliardy závorek na tak jednoduchý program. :)

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#7 Příspěvek od lesana87 »

nekmil píše: T1 = B1 / 16 'Přesunutí vpravo o 4 bajty
T2 = B2 * 16 'přesunutí vlevo o 4 bajty
Mě zase jímá hrůza, když tu někdo "vyučuje" programování a plete s bity a bajty.

Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#8 Příspěvek od nekmil »

lesana87: :) nikoho "nevyučuju" ale uznávám, že tam je chyba, zřejmě chybný pozůstatek z pokusů. Bity a bajty si fakt nepletu.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#9 Příspěvek od mtajovsky »

nekmil << a to nemá ten Basic, či co to je, možnost používat subrutiny s parametry? Že se tam řeší všechno přes globály.

Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#10 Příspěvek od nekmil »

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/

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“