1 | /*
|
2 | * USC_Kompakt.c
|
3 | *
|
4 | * Created: 03.10.2011 19:11:22
|
5 | * Author: Orko
|
6 | */
|
7 |
|
8 | //***********************************************************************************************
|
9 | //**********************************INSERTIONS***************************************************
|
10 | //***********************************************************************************************
|
11 |
|
12 | #include <avr/eeprom.h>
|
13 | #include <avr/wdt.h>
|
14 | #include "Extern_source/dogm-graphic.h"
|
15 | #include "Extern_source/font.h"
|
16 | #include "USC_Kompakt.h"
|
17 | #include "impuls.h"
|
18 | #include "TSIC206.h"
|
19 | #include "MenuCreator.h"
|
20 | #include "PID.h"
|
21 | #include "GetKey.h"
|
22 |
|
23 | //***********************************************************************************************
|
24 | //***********************************GLOBALE EEPROM VARIABLEN************************************
|
25 | //***********************************************************************************************
|
26 |
|
27 | /*EEPROM Byte */
|
28 | uint8_t EEPROM_LEISTUNG EEMEM=100; //EEPROM Variable für Leistung mit Standartwert 100%
|
29 | uint8_t EEPROM_KONTRAST EEMEM=31; //EEPROM Variable für Kontrast mit Standartwert 50%
|
30 | uint8_t EEPROM_SPRACHE EEMEM=0; //EEPROM Variable für Sprache mit Standartwert Deutsch
|
31 | uint8_t EEPROM_FUEHLER EEMEM=0; //EEPROM Variable für Fühler mit Standartwert TISC206 //0=TISC206 1=PT100/Analog 2=DS1820 3=DS1822
|
32 | uint8_t EEPROM_HEIZ_ST EEMEM=0; //EEPROM Variable für Heizung aktiv Standartwert 0
|
33 | /*EEPROM Word */
|
34 | uint16_t EEPROM_ZEIT EEMEM=900; //EEPROM Variable für Zeit mit Standartwert 15:00min
|
35 | /*EEPROM Float */
|
36 | float EEPROM_SOLL_TEMPERATUR EEMEM=45.0; //EEPROM Variable für Soll-Temperatur mit Standartwert 45.0°C
|
37 | float EEPROM_OFFSET EEMEM=0.0; //EEPROM Variable für Fühleroffset mit Standartwert 0,0°C
|
38 | float EEPROM_P EEMEM=0.0; //EEPROM Variable für P-Anteil mit Standartwert 0
|
39 | float EEPROM_I EEMEM=0.5; //EEPROM Variable für I-Anteil mit Standartwert 0.5
|
40 | float EEPROM_D EEMEM=100.0; //EEPROM Variable für D-Anteil mit Standartwert 100
|
41 | //***********************************************************************************************
|
42 | //***********************************MAIN********************************************************
|
43 | //***********************************************************************************************
|
44 |
|
45 | int main(void){ //MAIN
|
46 | //Ports & Peripherie parametrieren
|
47 | SET_PIN_DIRECTIONS(); //Pins und Ports einstellen
|
48 | SET_CONFIGURATION(); //Hardware konfigurieren
|
49 |
|
50 | //LCD Initalisieren
|
51 | lcd_init(); //Display initalisieren
|
52 | lcd_set_font(FONT_PROP_8,NORMAL); //Globale Font und Style setzten
|
53 |
|
54 | //***********************************************************************************************
|
55 | //Daten aus dem EEPROM Laden
|
56 | //***********************************************************************************************
|
57 | //Leistung
|
58 | leistung =eeprom_read_byte(&EEPROM_LEISTUNG); //gespeicherte Leistungs-daten laden
|
59 | //Kontrast
|
60 | kontrast =eeprom_read_byte(&EEPROM_KONTRAST); //gespeicherte Kontrast-daten laden
|
61 | //Sprache
|
62 | sprache =eeprom_read_byte(&EEPROM_SPRACHE); //gespeicherte Sprach-daten laden
|
63 | //Fühler
|
64 | fuehler =eeprom_read_byte(&EEPROM_FUEHLER); //gespeicherte Fühler-daten laden
|
65 | //Zeit
|
66 | zeit =eeprom_read_word(&EEPROM_ZEIT); //gespeicherte Zeit-daten laden
|
67 | //Solltemperatur
|
68 | soll_temperatur =eeprom_read_float(&EEPROM_SOLL_TEMPERATUR); //gespeicherte Soll-Temperatur-daten laden
|
69 | //Offset
|
70 | offset =eeprom_read_float(&EEPROM_OFFSET); //gespeicherte Offset-daten laden
|
71 | //Regler P
|
72 | regler_p =eeprom_read_float(&EEPROM_P); //gespeicherte P-Anteil-daten laden
|
73 | //Regler I
|
74 | regler_i =eeprom_read_float(&EEPROM_I); //gespeicherte I-Anteil-daten laden
|
75 | //Regler D
|
76 | regler_d =eeprom_read_float(&EEPROM_D); //gespeicherte D-Anteil-daten laden
|
77 |
|
78 | //Startup
|
79 | BACKLIGHT_ON(); //Hintergrundbeleuchtung ein
|
80 | US_LEISTUNG(leistung); //Leistungseinstellungen auf den ausgang bringen
|
81 | LCD_SET_VOLUME_MODE(kontrast); //Kontrasteinstellungen ans Display senden
|
82 | ShowMain(pointer_main_menu); //Hauptmenü darstellen (Zeit darstellung da Pointer 0)
|
83 | w.enter_main=1; //Hauptmenü aktivieren
|
84 | VER_T_ON(); //Versorgung für den Temperatursensor aktivieren
|
85 |
|
86 | //****************|*************************************************|*************************************
|
87 | //****************|*****************$$$$$$$$$$$$$$$*****************|*************************************
|
88 | //*************|**|**|**************$Hauptprogramm$**************|**|**|**********************************
|
89 | //**************|*|*|***************$$$$$$$$$$$$$$$***************|*|*|***********************************
|
90 | //****************|*************************************************|*************************************
|
91 | wdt_enable(7);
|
92 | while(1){
|
93 | //***********************************Fortlaufender Aufruf********************************************************
|
94 | GET_IMPULS(); //impulse einlesen
|
95 | GET_KEY(240); //Tasten eingabe lesen Debounce angeben
|
96 | //***********************************Einstellung Menu************************************************************
|
97 | if(!u.heiz_pre && u.select_pre && !w.Flanke_se && !u.us_start && !a.enter_ad_setup){ //Zum weiter schalten der Menüs
|
98 | w.enter_setup=1; //Setupmenü freigeben
|
99 | w.enter_main=0; //Hauptmenü daktivieren
|
100 | ++pointer_setup_menu; //Zeiger auf nächste Menü erhöhen
|
101 | if(a.tempwahl!=1){
|
102 | if(soll_temperatur>85.0){ //Wenn zu groß dann begrenzen
|
103 | soll_temperatur=85.0; //Begrenzen auf 85.0°C
|
104 | }
|
105 | }
|
106 | else{
|
107 | if(soll_temperatur>185.0){ //Wenn zu groß dann begrenzen
|
108 | soll_temperatur=185.0; //Begrenzen auf 185.0°F
|
109 | }
|
110 | }
|
111 | if (pointer_setup_menu==6){ //Wenn letztes Menü (Degas) erreicht dann
|
112 | pointer_setup_menu=0; //Pointer wieder auf 0
|
113 | w.enter_setup=0; //Setupmenü deaktivieren
|
114 | w.enter_main=1; //Hauptmenü aktivieren
|
115 | u.degas_en = 0; //Degas beenden
|
116 | US_OFF(); //Falls US noch an von Degas jetzt off
|
117 | eeprom_write_word(&EEPROM_ZEIT, zeit); //Zeit in EEPROM speichern
|
118 | eeprom_write_float(&EEPROM_SOLL_TEMPERATUR, soll_temperatur); //Soll-Temperatur in EEPROM speichern
|
119 | eeprom_write_byte(&EEPROM_LEISTUNG, leistung); //US-Leistung in EEPROM speichern
|
120 | L_DEGAS_OFF(); //LED Zeit OFF
|
121 | US_LEISTUNG(leistung); //Leistungseinstellungen auf den ausgang bringen
|
122 | }
|
123 | }
|
124 | //***********************************Parameter stellen (Standart Parameter)***************************************
|
125 | if (w.enter_setup){ //Setupmenü betreten
|
126 | //***********************************Temperatur************************************************************
|
127 | if(pointer_setup_menu==1 && u.plus_pre && z.imp_ms_E){ //Zeiger auf Temperaturmenü(-1) warten auf Plustaste alle 100ms
|
128 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
129 | soll_temperatur = soll_temperatur + 0.1; //erhöhe um 0.1
|
130 | }
|
131 | else{
|
132 | soll_temperatur = soll_temperatur + (0.1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
133 | }
|
134 | if(a.tempwahl!=1){
|
135 | if(soll_temperatur>85.0){ //Wenn zu groß dann begrenzen
|
136 | soll_temperatur=85.0; //Begrenzen auf 85.0°C
|
137 | }
|
138 | }
|
139 | else{
|
140 | if(soll_temperatur>185.0){ //Wenn zu groß dann begrenzen
|
141 | soll_temperatur=185.0; //Begrenzen auf 185.0°F
|
142 | }
|
143 | }
|
144 | }
|
145 | if(pointer_setup_menu==1 && u.minus_pre && z.imp_ms_E){ //Zeiger auf Temperaturmenü(-1) warten auf Minustaste alle 100ms
|
146 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
147 | soll_temperatur = soll_temperatur - 0.1; //erniedrigen um 0.1
|
148 | }
|
149 | else{
|
150 | soll_temperatur = soll_temperatur - (0.1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
151 | }
|
152 | if(soll_temperatur<0.0) soll_temperatur=0.0; //Begrenzen auf 0.0°C
|
153 | }
|
154 | //***********************************Zeit************************************************************
|
155 | if(pointer_setup_menu==2 && u.plus_pre && z.imp_ms_E){ //Zeiger auf Zeitmenü(-1) warten auf Plustaste alle 100ms
|
156 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
157 | zeit = zeit + 1; //erhöhe um 1
|
158 | }
|
159 | else{
|
160 | zeit = zeit + (1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
161 | }
|
162 | if(zeit>5999) zeit=5999; //Begrenzen auf 5999s (99min und 59s)
|
163 | }
|
164 | if(pointer_setup_menu==2 && u.minus_pre && z.imp_ms_E){ //Zeiger auf Zeitmenü(-1) warten auf Minustaste alle 100ms
|
165 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
166 | zeit = zeit - 1; //erniedrigen um 1
|
167 | }
|
168 | else{
|
169 | zeit = zeit - (1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
170 | }
|
171 | if(zeit>6000) zeit=1; //Begrenzen auf 0 (6000 da zeit unsigned)
|
172 | }
|
173 | //***********************************US-Leistung******************************************************
|
174 | if(pointer_setup_menu==3 && u.plus_pre && z.imp_ms_E){ //Zeiger auf Leistungsmenü(-1) warten auf Plustaste alle 100ms
|
175 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
176 | leistung = leistung + 1; //erhöhe um 1
|
177 | }
|
178 | else{
|
179 | leistung = leistung + (1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
180 | }
|
181 | if(leistung>100) leistung=100; //Begrenzen auf 100
|
182 | }
|
183 | if(pointer_setup_menu==3 && u.minus_pre && z.imp_ms_E){ //Zeiger auf Leistungsmenü(-1) warten auf Minustaste alle 100ms
|
184 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
185 | leistung = leistung - 1; //erniedrigen um 1
|
186 | }
|
187 | else{
|
188 | leistung = leistung - (1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
189 | }
|
190 | if(leistung>250) leistung=1; //Begrenzen auf 0 (250 da leistung unsigned)
|
191 | }
|
192 | //***********************************Degas steuern****************************************************
|
193 | if(pointer_setup_menu==4 && !w.Flanke_s && u.start_pre){ //Zeiger auf Degasmenü(-1) warten auf Starttaste mit positiver Flanke
|
194 | u.degas_en=!u.degas_en; //Toggle Degas Enable
|
195 | }
|
196 | if(pointer_setup_menu!=4 || !u.degas_en || a.over_t_b || w.over_t_g || f.fehler_akt || u.Trocken_det){ //Degas aus wenn nicht mehr im Degasmenü, Degas aus oder diverse andere Fehler
|
197 | u.degas_en=0;
|
198 | US_OFF();
|
199 | }
|
200 | //***********************************Temp.-wahl****************************************************
|
201 | if(pointer_setup_menu==5 && !w.Flanke_p && u.plus_pre){ //Zeiger auf Temp-wahlmenü(-1) warten auf Plustaste mit positiver Flanke
|
202 | a.tempwahl=1; //Toggle Tempwahl
|
203 | }
|
204 | if(pointer_setup_menu==5 && !w.Flanke_m && u.minus_pre){ //Zeiger auf Temp-wahlmenü(-1) warten auf Minustaste mit positiver Flanke
|
205 | a.tempwahl=0; //Toggle Tempwahl
|
206 | }
|
207 | //***********************************Menü darstellen**************************************************
|
208 | if(z.imp_ms_Z){ //alle 200ms
|
209 | ShowSetup(pointer_setup_menu-1); //Menüs darstellen
|
210 | }
|
211 | }
|
212 |
|
213 |
|
214 |
|
215 | //***********************************Erweitertes Einstellungs Menu************************************************
|
216 | if(u.heiz_pre && u.select_pre && !w.Flanke_se && !u.us_start && !w.enter_setup){ //Zum weiter schalten der Menüs
|
217 | a.enter_ad_setup=1; //Setupmenü freigeben
|
218 | w.enter_main=0; //Hauptmenü daktivieren
|
219 | }
|
220 |
|
221 | if(a.enter_ad_setup && u.select_pre && !w.Flanke_se){
|
222 | ++pointer_erw_setup_memu; //Zeiger auf nächste Menü erhöhen
|
223 | if (pointer_erw_setup_memu==8){ //Wenn letztes Menü (D-anteil) erreicht dann
|
224 | pointer_erw_setup_memu=0; //Pointer wieder auf 0
|
225 | a.enter_ad_setup=0; //Setupmenü deaktivieren
|
226 | w.enter_main=1; //Hauptmenü aktivieren
|
227 | eeprom_write_byte(&EEPROM_KONTRAST, kontrast); //Soll-Temperatur in EEPROM speichern
|
228 | eeprom_write_byte(&EEPROM_SPRACHE, sprache); //US-Leistung in EEPROM speichern
|
229 | eeprom_write_byte(&EEPROM_FUEHLER, fuehler); //US-Leistung in EEPROM speichern
|
230 | eeprom_write_float(&EEPROM_OFFSET, offset); //US-Leistung in EEPROM speichern
|
231 | eeprom_write_float(&EEPROM_P, regler_p); //US-Leistung in EEPROM speichern
|
232 | eeprom_write_float(&EEPROM_I, regler_i); //US-Leistung in EEPROM speichern
|
233 | eeprom_write_float(&EEPROM_D, regler_d); //US-Leistung in EEPROM speichern
|
234 | }
|
235 | }
|
236 | //***********************************Parameter stellen (Erweiterte Parameter)***************************************
|
237 | if (a.enter_ad_setup){ //erweitertes Setupmenü betreten
|
238 | //***********************************Kontrast************************************************************
|
239 | if(pointer_erw_setup_memu==1 && u.plus_pre && z.imp_ms_E){ //Zeiger auf Kontrastmenü(-1) warten auf Plustaste alle 100ms
|
240 | kontrast = kontrast + 1; //erhöhe um 1
|
241 | if(kontrast>63){ //Wenn Kontrast zu hoch dann begrenzen
|
242 | kontrast = 63; //Kontrast 100%
|
243 | }
|
244 | LCD_SET_VOLUME_MODE(kontrast); //Kontrasteinstellungen ans Display senden
|
245 | }
|
246 | if(pointer_erw_setup_memu==1 && u.minus_pre && z.imp_ms_E){ //Zeiger auf Kontrastmenü(-1) warten auf Minustaste alle 100ms
|
247 | kontrast = kontrast - 1; //erniedrigen um 1
|
248 | if(kontrast>200){ //Begrenzen auf 0 (200 da kontrast unsigned)
|
249 | kontrast = 0;
|
250 | }
|
251 | LCD_SET_VOLUME_MODE(kontrast); //Kontrasteinstellungen ans Display senden
|
252 | }
|
253 | //***********************************Messfühler************************************************************
|
254 | if(pointer_erw_setup_memu==2 && u.plus_pre && !w.Flanke_p){ //Zeiger auf Messfü-menü(-1) warten auf Plustaste alle 100ms
|
255 | fuehler = fuehler + 1; //erhöhe um 1
|
256 | if(fuehler>3) fuehler=3; //Begrenzen auf 3
|
257 | }
|
258 | if(pointer_erw_setup_memu==2 && u.minus_pre && !w.Flanke_m){ //Zeiger auf Messfü-menü(-1) warten auf Minustaste alle 100ms
|
259 | fuehler = fuehler - 1; //erniedrigen um 1
|
260 | if(fuehler>250) fuehler=0; //Begrenzen auf 0 (250 da fuehler unsigned)
|
261 | }
|
262 | //***********************************Sprache******************************************************
|
263 | if(pointer_erw_setup_memu==3 && u.plus_pre && !w.Flanke_p){ //Zeiger auf Sprachmenü(-1) warten auf Plustaste alle 100ms
|
264 | sprache = sprache + 1; //erhöhe um 1
|
265 | if(sprache>3) sprache=3; //Begrenzen auf 3
|
266 | }
|
267 | if(pointer_erw_setup_memu==3 && u.minus_pre && !w.Flanke_m){ //Zeiger auf Sprachmenü(-1) warten auf Minustaste alle 100ms
|
268 | sprache = sprache - 1; //erniedrigen um 1
|
269 | if(sprache>250) sprache=0; //Begrenzen auf 0 (250 da sprache unsigned)
|
270 | }
|
271 | //***********************************Offset****************************************************
|
272 | if(pointer_erw_setup_memu==4 && u.plus_pre && z.imp_ms_E){ //Zeiger auf Offsetmenü(-1) warten auf Plustaste alle 100ms
|
273 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
274 | offset = offset + 0.1; //erhöhe um 1
|
275 | }
|
276 | else{
|
277 | offset = offset + (0.1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
278 | }
|
279 | if(offset>100.0) offset=100.0; //Begrenzen auf 100
|
280 | }
|
281 | if(pointer_erw_setup_memu==4 && u.minus_pre && z.imp_ms_E){ //Zeiger auf Offsetmenü(-1) warten auf Minustaste alle 100ms
|
282 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
283 | offset = offset - 0.1; //erniedrigen um 1
|
284 | }
|
285 | else{
|
286 | offset = offset - (0.1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
287 | }
|
288 | if(offset<-100.0) offset=-100.0; //Begrenzen auf -100.0
|
289 | }
|
290 | //***********************************P-Anteil****************************************************
|
291 | if(pointer_erw_setup_memu==5 && u.plus_pre && z.imp_ms_E){ //Zeiger auf P-Anteil-menü(-1) warten auf Plustaste alle 100ms
|
292 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
293 | regler_p = regler_p + 0.1; //erhöhe um 1
|
294 | }
|
295 | else{
|
296 | regler_p = regler_p + (0.1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
297 | }
|
298 | if(regler_p>100.0) regler_p=100.0; //Begrenzen auf 100
|
299 | }
|
300 | if(pointer_erw_setup_memu==5 && u.minus_pre && z.imp_ms_E){ //Zeiger auf P-Anteil-menü(-1) warten auf Minustaste alle 100ms
|
301 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
302 | regler_p = regler_p - 0.1; //erniedrigen um 1
|
303 | }
|
304 | else{
|
305 | regler_p = regler_p - (0.1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
306 | }
|
307 | if(regler_p<0.0) regler_p=0.0; //Begrenzen auf 0.0
|
308 | }
|
309 | //***********************************I-anteil****************************************************
|
310 | if(pointer_erw_setup_memu==6 && u.plus_pre && z.imp_ms_E){ //Zeiger auf I-Anteil-menü(-1) warten auf Plustaste alle 100ms
|
311 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
312 | regler_i = regler_i + 0.1; //erhöhe um 1
|
313 | }
|
314 | else{
|
315 | regler_i = regler_i + (0.1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
316 | }
|
317 | if(regler_i>100.0) regler_i=100.0; //Begrenzen auf 100
|
318 | }
|
319 | if(pointer_erw_setup_memu==6 && u.minus_pre && z.imp_ms_E){ //Zeiger auf I-Anteil-menü(-1) warten auf Minustaste alle 100ms
|
320 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
321 | regler_i = regler_i - 0.1; //erniedrigen um 1
|
322 | }
|
323 | else{
|
324 | regler_i = regler_i - (0.1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
325 | }
|
326 | if(regler_i<0.0) regler_i=0.0; //Begrenzen auf 0.0
|
327 | }
|
328 | //***********************************D-Anteil****************************************************
|
329 | if(pointer_erw_setup_memu==7 && u.plus_pre && z.imp_ms_E){ //Zeiger auf D-Anteil-menü(-1) warten auf Plustaste alle 100ms
|
330 | if(multi_p<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
331 | regler_d = regler_d + 0.1; //erhöhe um 1
|
332 | }
|
333 | else{
|
334 | regler_d = regler_d + (0.1*multi_p); //erhöhen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
335 | }
|
336 | if(regler_d>100.0) regler_d=100.0; //Begrenzen auf 100
|
337 | }
|
338 | if(pointer_erw_setup_memu==7 && u.minus_pre && z.imp_ms_E){ //Zeiger auf D-Anteil-menü(-1) warten auf Minustaste alle 100ms
|
339 | if(multi_m<2){ //ersten 2 warten für einfaches erhöhen ohne Multiplikator
|
340 | regler_d = regler_d - 0.1; //erniedrigen um 1
|
341 | }
|
342 | else{
|
343 | regler_d = regler_d - (0.1*multi_m); //erniedrigen mit Multiplikator (multiplikator erhöht sich jede sek um 1)
|
344 | }
|
345 | if(regler_d<0.0) regler_d=0.0; //Begrenzen auf 0.0
|
346 | }
|
347 | //***********************************Menü darstellen**************************************************
|
348 | if(z.imp_ms_Z){ //alle 200ms
|
349 | ShowErSetup(pointer_erw_setup_memu-1); //Menüs darstellen
|
350 | }
|
351 | }
|
352 |
|
353 | //***********************************Heizungssteuerung*************************************
|
354 | if (z.imp_s_E){ //Temmperatur einlesen jede sek
|
355 | if(PORT_VER_T &(1<<PIN_VER_T)){ //Wenn Versorgung des Temp.F. aktiv dann Temp. lesen ansonsten nach Fehler(deaktiviert) wieder aktivieren
|
356 | ist_temperatur=GetTemp(offset,fuehler); //Temperatur lesen mit eingestellten offset und Fühler
|
357 | }
|
358 | else{
|
359 | VER_T_ON(); //Versorgung für den Temperatursensor aktivieren
|
360 | }
|
361 | }
|
362 |
|
363 | if (!u.Trocken_det && !o.init_heat && z.imp_s_V){ //Wenn Trockenlauf OK und er noch nicht drin war
|
364 | if (eeprom_read_byte(&EEPROM_HEIZ_ST)==1){ //Wenn Heizung vorher ein dann wieder aktivieren
|
365 | a.heizen_on=1; //Heizungregelung aktivieren
|
366 | heat_delay=2; //Delay für erneutes Einschalten setzen
|
367 | L_HEIZ_ON(); //LED Heizen on
|
368 | }
|
369 | o.init_heat=1; //wieder eintritt verhindern
|
370 | }
|
371 |
|
372 | if(u.heiz_pre && !w.Flanke_h){ //Heizung Ein- und Ausschalten
|
373 | a.heizen_on=!a.heizen_on; //Heizungregelung toggle
|
374 | heat_delay=2; //Delay für erneutes Einschalten setzen
|
375 | if(a.heizen_on==1){
|
376 | L_HEIZ_ON(); //LED Heizen on
|
377 | eeprom_write_byte(&EEPROM_HEIZ_ST, 1); //Heizungsstatus in EEPROM speichern
|
378 | }else{
|
379 | L_HEIZ_OFF(); //LED Heizen off
|
380 | eeprom_write_byte(&EEPROM_HEIZ_ST, 0); //Heizungsstatus in EEPROM speichern
|
381 | }
|
382 | }
|
383 |
|
384 | if(a.heizen_on==1){ //Wenn Heizung aktiviert
|
385 | if(heat_delay==0){
|
386 | if(regler_p==0){ //Wenn P-Anteil auf 0 dann Zw.pkt.regler zum Steuern der Heizung
|
387 | Zw_punkt(regler_i); //Der I-Anteil gibt die Hysterese vor
|
388 | if(a.heiz_aktiv && z.imp_ms_V) PORT_L_HEIZ ^= ( 1 << PIN_L_HEIZ ); //Wenn geheizt wird dann Heiz-LED blinken lassen
|
389 | if(!a.heiz_aktiv) L_HEIZ_ON(); //Wenn Heizung aktiviert ist und nicht heizt dann LED on
|
390 | }
|
391 | else{
|
392 | PID(); //Wenn P>0 dann PID-Regler aktivieren
|
393 | }
|
394 | }
|
395 | }else{ //Wenn Heizen deaktiviert dann
|
396 | if(heat_delay==0){
|
397 | L_HEIZ_OFF(); //LED Heizen off
|
398 | HEIZUNG_OFF(); //Heizung aus
|
399 | a.heiz_aktiv=0; //Heizung Heizen Bit auf off
|
400 | }
|
401 | }
|
402 | if((z.imp_s_E)&&(heat_delay>0)) --heat_delay; //Delay runter zählen
|
403 |
|
404 | //***********************************Ultraschallsteuerung*************************************
|
405 | if(!u.Trocken_det && w.enter_main && u.start_pre && !w.Flanke_s ){ //Wenn im Main menu, start und Tr. ok dann US ON
|
406 | a.us_delay=1;
|
407 | }
|
408 |
|
409 | if(a.us_delay>0 && z.imp_ms_S){ //Verzögerung um Relais zu schonen
|
410 | ++a.us_delay; //erhöhen der Verzögerungsvar.
|
411 | }
|
412 |
|
413 | if(a.us_delay==3){ //Verzögerung um Relais zu schonen
|
414 | if(!u.us_start){ //Wenn US aus dann an
|
415 | u.us_start=1; //US ein
|
416 | US_ON(); //US Relais on
|
417 | pointer_main_menu=1; //Menü auf Zeit
|
418 | a.us_delay=0;
|
419 | }
|
420 | else{ //Wenn US an dann aus
|
421 | u.us_start=0; //US aus
|
422 | US_OFF(); //US Relais aus
|
423 | zeit=eeprom_read_word(&EEPROM_ZEIT); //neue Zeit setzen
|
424 | pointer_main_menu=0; //Menü wieder auf Temp.
|
425 | a.us_delay=0;
|
426 | }
|
427 | }
|
428 |
|
429 | if(u.us_start && z.imp_s_E)--zeit; //Zeit dekrementieren
|
430 |
|
431 | if(zeit==0){ //wenn Zeit abgelaufen
|
432 | US_OFF(); //US Relais aus
|
433 | pointer_main_menu=0; //Menü wieder auf temp.
|
434 | u.us_start=0; //US aus
|
435 | zeit=eeprom_read_word(&EEPROM_ZEIT); //neue Zeit setzen
|
436 | }
|
437 |
|
438 | if(u.us_start && u.select_pre && !w.Flanke_se){
|
439 | if(pointer_main_menu==1){ //toggel main menu(temp. und zeit)
|
440 | pointer_main_menu=0; //mit select-taste wenn US läuft
|
441 | }
|
442 | else{
|
443 | pointer_main_menu=1;
|
444 | }
|
445 | }
|
446 |
|
447 | //***********************************Degas steuerung****************************************
|
448 | if (u.degas_en && z.imp_s_Z) PORTB ^= ( 1 << PB0 ); //Degas wenn Degas Enable toggle US alle 2s
|
449 | if (u.degas_en && z.imp_ms_S) PORTC ^= ( 1 << PC3 ); //LED Blinken wenn Degas an (400ms)
|
450 |
|
451 | //***********************************Fehler bei Tempmessung***********************
|
452 | if (f.fehlercode>0){
|
453 | f.fehler_akt=1;
|
454 | }
|
455 |
|
456 | if (f.fehler_akt==1){
|
457 | //******************************************US zeugs
|
458 | US_OFF(); //US Relais aus
|
459 | u.us_start=0; //US aus
|
460 | zeit=eeprom_read_word(&EEPROM_ZEIT); //neue Zeit setzen
|
461 | //******************************************Heizungs zeugs
|
462 | a.heiz_aktiv=0; //Heizung heizt zurücksetzen
|
463 | a.heizen_on=0; //Heizungsreglung aktivern zurücksetzen
|
464 | L_HEIZ_OFF(); //LED Heizung aus
|
465 | HEIZUNG_OFF();
|
466 |
|
467 | pointer_main_menu=5;
|
468 | }
|
469 | //***********************************Trockenlauf***********************
|
470 | if(!(PORT_TROCK &(1<<PIN_TROCK))&& z.imp_ms_E && Tr_delay<20){ //Wenn Trockenlauf Fehler
|
471 | ++Tr_delay; //Zähler incr
|
472 | if (Tr_delay==20) //Wenn 2 sek Trockenlauffehler dann SHUTDOWN
|
473 | {
|
474 | pointer_main_menu=2; //Zeiger auf Trockenmenü
|
475 | L_TR_ON(); //Trockenlauf Led einschalten
|
476 | US_OFF(); //Schall aus
|
477 | u.us_start=0; //US set auf 0
|
478 | zeit=eeprom_read_word(&EEPROM_ZEIT); //Zeit zurücksetzen
|
479 | u.Trocken_det=1; //Trockenlauf speicher für Reset
|
480 | a.heiz_aktiv=0; //Heizung heizt zurücksetzen
|
481 | a.heizen_on=0; //Heizungsreglung aktivern zurücksetzen
|
482 | L_HEIZ_OFF(); //LED Heizung aus
|
483 | HEIZUNG_OFF(); //Heizung aus
|
484 | }
|
485 | }
|
486 |
|
487 | if(PORT_TROCK &(1<<PIN_TROCK) && u.Trocken_det && z.imp_ms_V) PORTC ^= ( 1 << PC7 ); //Trockenlauf LED mit 2,5Hz blinken lassen wenn Trockenlauf wiedergekommen
|
488 |
|
489 | //***********************************Übertemperatur steuerungen*****************************
|
490 | /*if (!(PORT_OVER_T &(1<<PIN_OVER_T))){ //Übertemperatur im Gehäuse erreicht
|
491 | w.over_t_g=1;
|
492 | }
|
493 | */
|
494 | if (w.over_t_g==1 && !o.init_over_t_g){
|
495 | //******************************************US zeugs
|
496 | US_OFF(); //US Relais aus
|
497 | u.us_start=0; //US aus
|
498 | zeit=eeprom_read_word(&EEPROM_ZEIT); //neue Zeit setzen
|
499 | //******************************************Heizungs zeugs
|
500 | a.heiz_aktiv=0; //Heizung heizt zurücksetzen
|
501 | a.heizen_on=0; //Heizungsreglung aktivern zurücksetzen
|
502 | L_HEIZ_OFF(); //LED Heizung aus
|
503 | HEIZUNG_OFF();
|
504 | o.init_over_t_g = 1;
|
505 | pointer_main_menu=3;
|
506 | }
|
507 |
|
508 | //***********************************
|
509 | if(a.tempwahl!=1){
|
510 | if (ist_temperatur>=90.0){
|
511 | a.over_t_b=1; //Übertemperatur im Becken erreicht
|
512 | }
|
513 | }
|
514 | else{
|
515 | if (ist_temperatur>=194.0){
|
516 | a.over_t_b=1; //Übertemperatur im Becken erreicht
|
517 | }
|
518 | }
|
519 |
|
520 | if (a.over_t_b==1 && !o.init_over_t_b){
|
521 | //******************************************US zeugs
|
522 | US_OFF(); //US Relais aus
|
523 | u.us_start=0; //US aus
|
524 | zeit=eeprom_read_word(&EEPROM_ZEIT); //neue Zeit setzen
|
525 | //******************************************Heizungs zeugs
|
526 | a.heiz_aktiv=0; //Heizung heizt zurücksetzen
|
527 | a.heizen_on=0; //Heizungsreglung aktivern zurücksetzen
|
528 | L_HEIZ_OFF(); //LED Heizung aus
|
529 | HEIZUNG_OFF(); //Heizung aus
|
530 | o.init_over_t_b = 1;
|
531 | pointer_main_menu=4;
|
532 | }
|
533 |
|
534 | //***********************************Abarbeiten des Hauptmenüs******************************
|
535 | if (w.enter_main && z.imp_ms_Z){ //Hauptmenü betreten
|
536 | ShowMain(pointer_main_menu); //Menüs darstellen
|
537 | }
|
538 |
|
539 | //***********************************Fehler wieder zurück stellen***************************
|
540 |
|
541 | if ((PORT_TROCK &(1<<PIN_TROCK)) && u.Trocken_det && u.start_pre){ //Wenn Trockenlauf OK mit Start zurücksetzen
|
542 | pointer_main_menu=0; //Pointer auf Temperaturdarstellung
|
543 | u.Trocken_det=0; //Trockenlauf zurücksetzten
|
544 | L_TR_OFF(); //LED Trocken aus
|
545 | Tr_delay = 0; //Zähler für Verzögerung zurücksetzen
|
546 | }
|
547 |
|
548 | if(a.tempwahl!=1){
|
549 | if (ist_temperatur<=75.0 && a.over_t_b==1){
|
550 | pointer_main_menu=0; //Pointer auf Temperaturdarstellung
|
551 | a.over_t_b=0; //Übertemp. Becken zurücksetzen
|
552 | o.init_over_t_b = 0;
|
553 | }
|
554 | }
|
555 | else{
|
556 | if (ist_temperatur<=167.0 && a.over_t_b==1){
|
557 | pointer_main_menu=0; //Pointer auf Temperaturdarstellung
|
558 | a.over_t_b=0; //Übertemp. Becken zurücksetzen
|
559 | o.init_over_t_b = 0;
|
560 | }
|
561 | }
|
562 |
|
563 | if (PORT_OVER_T &(1<<PIN_OVER_T) && w.over_t_g==1){
|
564 | pointer_main_menu=0; //Pointer auf Temperaturdarstellung
|
565 | w.over_t_g=0; //Übertemp. Gehäuse zurücksetzen
|
566 | o.init_over_t_g = 0;
|
567 | }
|
568 |
|
569 | if (f.fehlercode==0 && f.fehler_akt==1){
|
570 | pointer_main_menu=0; //Pointer auf Temperaturdarstellung
|
571 | f.fehler_akt=0; //Übertemp. Becken zurücksetzen
|
572 | }
|
573 | //***********************************Flankenerkennung***************************************
|
574 | w.Flanke_s = u.start_pre; //Flanke für Starttaste
|
575 | w.Flanke_se = u.select_pre; //Flanke für Selecttaste
|
576 | w.Flanke_m = u.minus_pre; //Flanke für Minustaste
|
577 | w.Flanke_p = u.plus_pre; //Flanke für Plustaste
|
578 | w.Flanke_h = u.heiz_pre; //Flanke für Heizungtaste
|
579 | wdt_reset(); //Watchdog zurücksetzen
|
580 | }
|
581 | return 0;
|
582 | }
|