termomet-redulator ds18d20

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
korfanty33
Użytkownik
Posty: 167
Rejestracja: 27 lis 2011, 15:10
Lokalizacja: Polska

termomet-redulator ds18d20

Post autor: korfanty33 » 12 paź 2013, 15:48

Jakoś nie mogę poradzić sobie z przeróbkom tego termoregulatora
http://mirley.firlej.org/minitermometr_uniwersalny


linia 36 zapisuje do pamięci ale jak pierwszy raz zapisać wartość przy programowaniu , czy mikrokontroler przyjmie zero a potem zapisze właściwą wartość ?

Kod: Zaznacz cały

1 '****************************
2 'Konfiguracja
3 '****************************
4 $regfile = "attiny2313.dat"
5 $crystal = 8000000
6
7 Config Portb = &B11111111 : Portb = &B11111111
8 Config Portd = &B11111011 : Portd = &B11111111 'częś c portu jako OUT
9 ' orginał Config Porta = &B00000000 : Porta = &B11111111 'cały port a j
ako wejścia,
10 Config Porta = &B11111011 : Porta = &B11111111
11
12 Config Timer0 = Timer , Prescale = 256
13 Enable Timer0 : On Timer0 Przerwanie0
14
15
16 Enable Interrupts 'dla schematy orginalnego mirley
17 '****************************
18 'Zmienne
19 '****************************
20 Dim Dziel(2) As Byte
21 Dim Wysw As Word , Ww As Byte , W(3) As Byte
22 Dim Wysw_pomoc As Word
23 Dim T As Integer , Tu As Integer
24 Dim H As Integer , L As Integer
25 Dim Mux As Byte , I As Byte
26 Dim Ust As Bit
27 Dim Autoret As Byte
28
29 Dim F1s As Bit , F4ms As Bit , F100ms As Bit
30 Dim Minus As Bit
31 Dim Kanal As Byte
32 '****************************
33 'Wartosci Poczatkowe
34 '****************************
35 Kanal = 1 'Tu = ?
36 Readeeprom Tu , 1 'Tu = 550 nastawa Temp On/OFF
37 'Readeeprom Th , 10 ' Th = 10 histereza -bład36
38
39
40 '****************************
41 'Petla glowna
42 '****************************
43 Do
44
45 If F4ms = 1 Then
46 Reset F4ms
47 If Ust = 0 Then Wysw = T Else Wysw = Tu
48 Gosub Wyswietl_zmierz ''skocz do etykiety
49 End If
50
51 If F100ms = 1 Then
52 Reset F100ms 'jeżeli za pomocą przycisku S1 podamy stan (GND)n
a pin portuD każde przyciśnięcie
53 If Pind.2 = 0 Then 'pin6 -s1 'spowoduje że wartość temperatury ustawi
anej wzrośnie
54 Incr Tu 'Decr Tu
55
56 Autoret = 20
57 End If
58 If Pina.0 = 0 Then 'pin5 -s2
59 Decr Tu 'pomiar Tu chyba
60 Autoret = 20
61 End If
62
63 If Autoret > 0 Then


64 Ust = 1
65 Decr Autoret
66 Else
67 Ust = 0
68 End If
69
70 H = Tu + 10 'histereza powyżej temperatury ustawionej
71 L = Tu - 10 'L = Tu-Th
72
73 If T > H Then Set Portd.3 ' stanH out , na {portD.3(H)->GND}
74 If T < L Then Reset Portd.3 'portD.3 tp pin7 zmienić na out
75 End If 'do optotriak'a
76
77 Loop
78 End 'może skasować
79 '************************
80 'Zapis wartości do eeprom przełaczanej temperatury i hister :
81 '*************************
82 Zapis:
83 Disable Interrupts 'blokuje globalny system przerwań
84 Writeeeprom Tu , 1 'zapisuje w pamięci eeprom temperaturę ustawianą
w komórce o adresie 1
85 Portd = &B11111111
86 Waitms 200
87 Enable Interrupts
88 Return
89 'Zapis histerezy
90 'Disable Interrupts
91 'Writeeeprom Th , 10 'zapisuje w pamięci eeprom temperaturę ustawianą w
komórce o adresie 10
92 'Portd = &B11111111
93 ' Waitms 200
94 'Enable Interrupts
95
96 'Return
97 '****************************
98 'Przerwanie timer0
99 '****************************
100 Przerwanie0:
101 Timer0 = 131
102 Set F4ms
103 Incr Dziel(1)
104 If Dziel(1) = 25 Then
105 Dziel(1) = 0
106 Set F100ms
107 Incr Dziel(2)
108 If Dziel(2) = 10 Then
109 Dziel(2) = 0
110 Set F1s
111 End If
112 End If
113 Return
114 '****************************
115 'pomiar temp
116 '****************************
117 Temp: 'etykieta skok z Select Case
118 If F1s = 1 Then
119 Reset F1s
120 1wreset Pind , Kanal
121 1wwrite &HCC , 1 , Pind , Kanal
122 1wwrite &HBE , 1 , Pind , Kanal
123 T = 1wread(2 , Pind , Kanal):
124 Minus = T.15
125 T = Abs(t)
126 T = T * 10
127 T = T / 16

128 1wreset Pind , Kanal
129 1wwrite &HCC , 1 , Pind , Kanal
130 1wwrite &H44 , 1 , Pind , Kanal
131 End If
132 Return
133
134
135
136 '****************************
137 'wyswietlanie i wywolywanie pomiaru
138 '****************************
139 Wyswietl_zmierz:
140 Incr Mux
141 If Mux = 5 Then Mux = 0
142
143 'Portd.3 = Not Minus
144
145 For I = 1 To 3
146 Wysw_pomoc = Wysw Mod 10
147 Ww = Wysw_pomoc
148 W(i) = Lookup(ww , Tabela)
149 Wysw = Wysw / 10
150 Next I
151 If W(3) = 40 Then W(3) = 255 'wygaszenie zera wiodacego
152
153 Select Case Mux
154 Case 0:
155 Portb = W(3)
156 Reset Portd.6
157
158 Case 1:
159 Set Portd.6 'pin11- T1
160 Portb = W(2) And &B11011111
161 Reset Portd.5
162
163 Case 2:
164 Set Portd.5 'pin9 T2
165 Portb = W(1)
166 Reset Portd.4
167
168 Case 3:
169 Set Portd.4 'pin8 T3
170 Portb = 255
171 Gosub Temp
172
173 'Case 4: 'opoznienie na odczyt temp, je li nie ma to m
iga wyswietlacz
174
175 End Select
176
177 Return
178
179 '**************************************************************************
*****
180 'Tabele do wyswietlania na wyswietlaczu
181 '**************************************************************************
*****
182 Tabela:
183 Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
184 'znak: 0 1 2 3 4 5 6 7 8 9
185
- 3 -
w plik.rpt
przerobiłem program ale mam błąd
ROMIMAGE : 65E hex -> Will fit into ROM
ROMIMAGE : 1630 dec
FLASH USED : 79 %
BAUD : 9600 Baud
XTAL : 8000000 Hz
BAUD error : 0.16%
[/list]
Załączniki
termometre.PNG

Awatar użytkownika
tom5555
Użytkownik
Posty: 625
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 12 paź 2013, 16:42

"BAUD error" informuje tylko czy będzie możliwa komunikacja przez RS232 z procesorem.
Co do pytania o odczyt wartości z EEPROM, to procesor za pierwszym razem przyjmie to co jest zapisane w pamięci. Zawsze możesz utworzyć plik .eep i tam zapisać to co ma znajdować się w pamięci.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 paź 2013, 16:51

Jeżeli w BASCOM masz ustawione, że EEPROM ma być kasowany podczas programowania, to pamięć jest kasowana, czyli wypełniana wartościami FF.
Druga sprawa nie powinno się używać komórki EEPROM o adresie 0, po podczas startu może się tam znaleźć wartość przypadkowa.
Jeżeli chcesz po zaprogramowaniu w EEPROM mieć jakaś wartość domyślną można zrobić to tak umieszczając na końcu programu wpis.

Kod: Zaznacz cały

$eeprom
Init:
DATA 0%, twoja wartość Tu%, twoja wartość Th%
Tu - będzie miało adres 2, Th - jeżeli zapiszesz integer 4, w EEPROM
np:
DATA 0%, 100%, 40%
% - oznacza typ danych integer, zajmują dwa bajty w pamięci.

korfanty33
Użytkownik
Posty: 167
Rejestracja: 27 lis 2011, 15:10
Lokalizacja: Polska

Post autor: korfanty33 » 12 paź 2013, 21:11

kayron pisze: Tu - będzie miało adres 2, Th - jeżeli zapiszesz integer 4, w EEPROM
np:
DATA 0%, 100%, 40%
% - oznacza typ danych integer, zajmują dwa bajty w pamięci.
zrobiłem tak

Kod: Zaznacz cały

Kanal = 1 			'Tu = ?
Readeeprom Tu , 2 	'Tu =  nastawa Temp On/OFF
'Readeeprom Th , 4	' Th = 
plus zapis liczby

Kod: Zaznacz cały

$eeprom 
Init: 
DATA 0%, 10%,  10% 
może jak czas pozwoli w tym tygodniu uruchomię 2313
a większych błędów nie ma ?

pytanie dla mnie ważne bo się zgubiłem na którym pinie jest odczyt temperatury
czy portd.1 ?

Kod: Zaznacz cały

Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15			'zmienna16bit U2 15 najstarszy
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
na początku było powiedziane że odczyt jest z - portd.1
Ostatnio zmieniony 13 paź 2013, 20:15 przez korfanty33, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2013, 6:59

korfanty33 pisze:
pytanie dla mnie ważne bo się zgubiłem na którym pinie jest odczyt temperatury
czy portd.1 ?

Kod: Zaznacz cały

Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15			'zmienna16bit U2 15 najstarszy
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
na początku było powiedziane że odczyt jest z pinu3-portd.1
To ci wynika ze schematu i opisu instrukcji 1WWRITE zmienna, il_bajtów, port, pin więc jeżeli zmienna kanał = 1 to masz pind.1
Przy czym autor projektu zrobił tu pewne zamieszanie, bo następny kanał miałby liczbę 0.
Co to oznacza w praktyce ?
Kanały trzeba numerować od 0, więc na schemacie jest błąd, DS nr 1, jest na pinie portD.0 czyli kanale 0 (na schemacie opisane mylnie jako DS2), A DS nr 2, jest w miejscu DSa1, na schemacie. Mówiąc krócej trzeba sobie zamienić je miejscami, jeżeli chcesz korzystać z dwóch, i się nie mylić który jest który.
Wtedy numeracja będzie logiczna tj. DS1 kanał 0, DS2 kanał 1.

korfanty33
Użytkownik
Posty: 167
Rejestracja: 27 lis 2011, 15:10
Lokalizacja: Polska

Post autor: korfanty33 » 13 paź 2013, 19:36

kayron pisze:
To ci wynika ze schematu i opisu instrukcji 1WWRITE zmienna, il_bajtów, port, pin więc jeżeli zmienna kanał = 1 to masz pind.1

Co to oznacza w praktyce ?

Mówiąc krócej trzeba sobie zamienić je miejscami, jeżeli chcesz korzystać z dwóch, i się nie mylić który jest który.
Wtedy numeracja będzie logiczna tj. DS1 kanał 0, DS2 kanał 1.
dzięki za odp
ja po prostu przerabiam owy projekt na termo-regulator (jest opisany) ale potem są robione pewne modyfikacje z których chcem skorzystać .

Moja wiedza to tylko T.Pascal bardzo pobieżnie i to dość dawno temu chyba 20lat
Jak na razie to parę funkcji rozpracowałem ale z tym kanal miałem problem , co do schematu to jest zrobiony na dwa ds ,

A ja użyję jednego ,

(bo mam problem ze zmianą sterowania Tu i Th , którą należy dopracować ) po zmianie oprogramowania będzie transoptor w miejsce diody sygnalizującej minus .

jeszcze jedno pytanie jak na razie zablokować DS2- ustawiając jego port jako wyjście w jakiś stały stan , czy tak ................

portD.2 -> s2- jako IN
Config Portd = &B11111011 : Portd = &B11111111
pordD.0-ds2 do zablokowania
pordD.1-ds1 czy czyta ? z DS18D20

Ps
piątek i sobotę siedziałem czytałem wszystkie posty w tym temacie na stronie mirley ,
są tam pewne niedoróbki innych użytkowników które nawet ja zauważyłem
niema podciągnięcia resetu do +5V ( u mnie będzie ) inni pozmieniali trochę piny na Tinny2313 , pisząc program .
ale jestem dobrej myśli
(a do bascoma można dograć polskiego helpa ?) bo mój angielski jest zerowy

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2013, 21:07

HELP do bascoma po polsku jako PDF.
http://www.pe.ifd.uni.wroc.pl/BascomBasicAVR3.pdf
Ja też przeglądałem stronę autora i jest tam jak poprzerabiać ten program, trzeba tylko, przeczytać komentarze.
Co do zablokowania drugiego DSa, jak nie będziesz z niego korzystał, to go można całkowicie usunąć z programu.
Adresy zadeklaruj sobie jako stałe wtedy przeróbka programu jest prosta.
np.
const Tuadr = 2
operacje na EEPROM zapisujesz wtedy:
ReadEeprom Tu, Tuadr

Zmiana całego programu przy takim zapisie sprowadza się do zmiany deklaracji Consta danego adresu.
Ogólnie aby program łatwo się modyfikowało, trzeba, go odpowiednio pisać.
Napisz co dokładnie chcesz zmienić w tym programie, z uwzględnieniem funkcji poszczególnych pinów.
Ogólnie sądzę że da się z tego programu wycisnąć więcej, bo autor strasznie sobie pokomplikował życie z tym Timerem 0, przecież można go puścić w CTC, i sam robi wszystko co trzeba. procedura się ułatwia itd.
Z takiej szybkiej i pobieżnej analizy wynika że pomiar temperatury tez jest robiony, co najmniej kilkadziesiąt razy na sekundę ? PO co? wystarcza 2-3 pomiary na sek, temperatura tak szybko nie skacze, a w praktyce, czujnik też ma jakąś bezwładność i reaguje z pewnym opóźnieniem. Nie ma także kontroli błędów komunikacji w programie z DSem. Jak by ktoś chciał pożadny termoregulator z tego to jest jeszcze trochę pracy z tym programem.

korfanty33
Użytkownik
Posty: 167
Rejestracja: 27 lis 2011, 15:10
Lokalizacja: Polska

Post autor: korfanty33 » 13 paź 2013, 22:06

kayron pisze: Napisz co dokładnie chcesz zmienić w tym programie, z uwzględnieniem funkcji poszczególnych pinów..
pod koniec tygodnia może się odezwę jak posklejam w całość ( w zależności od ruch w pracy)

na razie chcę zrobić prostą wersje - (sam )
wiem że jest opisane przerabianie w postach

podoba mi się szukanie rozwiązań jak ktoś coś stworzył a ja przerabiam - wtedy się uczę .
bo samemu od początku to ciężko za dużo braków w wiedzy ,

Docelowo ma być w C już nawet mam książkę ale jeszcze jej nie otworzyłem z braku czasu. Ze względu na dostępne oprogramowanie , bo bscom jest .....

ale jak się ma dużo lat to i czasu mniej i inne obciążenia


Z takiej szybkiej i pobieżnej analizy wynika że pomiar temperatury tez jest robiony, co najmniej kilkadziesiąt razy na sekundę ? PO co? wystarcza 2-3 pomiary na sek, temperatura tak szybko nie skacze, a w praktyce, czujnik też ma jakąś bezwładność i reaguje z pewnym opóźnieniem.
co do temperatury -wiem że jest za szybko
w pracy ma piec wgłębny 150kW (do tzw. uziemienia temperatury) -zachowania stałych zakłóceń zewnętrznej temperatury
na stycznikach i 3 regulatorach przemysłowych

ODPOWIEDZ