Hallo, ich hoffe ihr könnt mir weiterhelfen. Ich habe eine kleine Steuerung mit zwei Platinen wie im Anhang zu sehen. Diese sind über ein 1/2m langes nach Pe geschirmtes Flachbandkabel verbunden. Jetzt kommt es vor das von Zeit zu Zeit einige Pins dauerhaft aktiv bleiben oder nicht mehr einschalten. Das kann man an den LEDs gut erkennen. Aber am Display passiert noch was wenn man die Tasten drückt. Der Watchdog spricht allerdings auch nicht an. Oft sind dann auch eingestellte Werte wie Zeit und Temperatur verstellt. Ich weiß nicht ob es nicht vielleicht dennoch ein Software Fehler sein kann. Wenn man die Steuerung ein und aus schaltet dann geht wieder alles ganz normal. Diese Phänomene treten für mein Erkennen sehr sporadisch auf so alle 12-16h. Hat jemand schon mal etwas ähnliches beobachtet? Ich muss leider sagen das ich es zum ersten mal erlebe das ein µC seinen Dienst an den Ports verweigert, Variablen Inhalte ändert und nicht wenigstens die Höflichkeit besitzt und sich auf zuhängen. :) Ich hoffe die Infos reichen für eine erste Diagnose. Viel dank schon mal im Voraus. MFG Orko
Orko schrieb: > Ich muss leider sagen > das ich es zum ersten mal erlebe das ein µC seinen Dienst an den Ports > verweigert, Variablen Inhalte ändert und nicht wenigstens die > Höflichkeit besitzt und sich auf zuhängen. :) Ein µC 'hängt' sich nicht auf. Er führt immer eine Instruktion nach der anderen aus. Wenn deine Ports nicht mehr verändert werden, dann liegt das daran, das er nicht mehr zu der Stelle im Programm kommt, wo die Ports verändert werden. An andere Teile kommt er, vieleicht weil das über Interrupts geschieht oder innerhalb der Endlosschleife die der µC durchläuft. Wenn er nur alle 10 - 15h dahin kommt, liegt das daran, das die Ursache, daß er in diese Schleife geht nur alle 10 -15h vorkommt. Das mag ein nicht abgeschalteter Interrupt sein, der durch ein offen liegenden Eingang durch EMV ausgelöst wird, oder daß einige In Ports alle 10 -15h eine Konstallation annehmen, die das Programm dann in diese Schleife gehen lässt. Im Allgemeinen sitzt der Fehler also wie immer vor der Tastatur, damit meine ich daß das Programm und/oder das Hardwaredesign dafür verantwortlich sind.
Ja gut davon bin ich auch ausgegangen das der Fehler bei mir liegt des wegen ja auch dieser Post und keine Mail an Atmel. ;) Ich bin sowieso der letzte der jetzt Atmel die Schuld geben wollte. Aber ohne dir jetzt direkt widersprechen zu wollen muss ich sagen das er theoretisch schon an diesen stellen vorbei kommt den die anderen Befehle die dort stehen bearbeitet er. Aber ich werde das nochmal genau prüfen. Interrupts verwende ich gar nicht zu mindestens keine von außerhalb und die anderen laufen ständig. Könnte eine Instabile Versorgungsspannung auch ein Grund sein? Ich habe wenn ich über das Relais 1,6kW schalte Schwankungen von 0,4V mit einer Freq. von 75-80MHz über 100ns. Wie gesagt oft passiert nicht.
Geänderte Variablen deuten auf ein RAM-Problem hin. Entweder der Stack läuft in Daten hinein oder ein Pointer zeigt in den Wald. Wie ist denn nach dem Compilieren die %-Anzeige der RAM und Flash-Benutzung? Peter
Hallo Peter, hier die Daten: Program Memory Usage : 24222 bytes 73,9 % Full Data Memory Usage : 197 bytes 9,6 % Full EEPROM Memory Usage : 27 bytes 2,6 % Full Ab wann läuft den der Stack in die Daten? Mit dem Pointer bin ich erst mal überfragt ich denke mal die einzige Möglichkeit dies zu überprüfen ist die Software durch zugehen.? Na gut ich werde erst mal die Software auf ein Minimum reduzieren (Displaysteuerung) und dann einfach immer meine Last ein- und ausschalten, und schauen ob es sich reproduzieren lässt. Dann kann ich schon mal die Hardware ausschließen.
Orko schrieb: > Oft sind dann auch eingestellte Werte wie Zeit und Temperatur verstellt. Anscheinend ein amoklaufender Pointer. Zeig doch mal den Code. Es kann sein, dass dein Code wegen eines EMV-Problems irgendeine Ende-Kennung irgendeines seriellen Protokolls nicht sieht und dann irgendwo im Speicher rumschreibt... BTW: warum hast du so viele Junctions im Schaltplan? Hast du mal andere Pläne angesehen? Sehen die auch so verpunktet aus?
Hallo Lothar, ja die Juntions..., hab ich schon andere Pläne gesehen? Ja aber um wirklich ehrlich zu sein habe ich die Junctions mehr als eine Art Visualisierung der Verbunden Kreuzenden Leiter gesehen....... !? :) Der Code ist natürlich recht umfangreich mit 24222 bytes aber ich zeige gerne die Main und die folgenden falls benötigt dann vielleicht lieber als Anhang. Hoffentlich bekomme ich jetzt kein ärger weil das ding so lang ist. O_O
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 | }
|
Orko schrieb: > Hallo Lothar, > > ja die Juntions..., hab ich schon andere Pläne gesehen? Ja aber um > wirklich ehrlich zu sein habe ich die Junctions mehr als eine Art > Visualisierung der Verbunden Kreuzenden Leiter gesehen....... !? :) Ohne darauf herumreiten zu wollen: Genau darum geht es. Aber das Anschliessen einer Leitung an einen Pin eines IC (oder Kondensators oder ...) ist keine kreuzende Leitung. Kreuzende Leitungen sind: 2 Linien die sich kreuzen. Und um unterscheiden zu können, ob sich die da nur zufällig kreuzen und eigentlich geht die eine Leitung unter der anderen durch ohne etwas mit ihr zu tun zu haben ODER da ist eine echte Kreuzung, die beiden Leitungen sind an diesem Punkt tatsächlich miteinander verbunden, setzt man eben in letzterem Fall einen Punkt auf die Kreuzung. In einer Junction treffen mehr als 2 Leitungen aufeinander!
Orko schrieb: > Hoffentlich bekomme ich jetzt kein ärger weil das ding so lang ist. O_O Ja, der Code hätte sich schon ein paar Auslagerungen von Funktionalitäten in eigene Funktionen verdient. Ausserdem kommen da für meinen Geschmack zuviele Konstanten im Code vor, die es sich verdient hätten, per #define einen sprechenden Namen zu bekommen. Aber abgesehen davon ist da erst mal so nichts groß auffällig. Bei Symptomen wie deinen (Variablen ändern 'magisch' ihren Wert) ist die erste Anlaufstelle erst mal alles was mit Arrays zu tun hat. Alle Arrayzugriffe werden untersucht, ob es passieren kann, dass da ein Index benutzt wird, der ausserhalb der zulässigen Grenzen sich bewegt. Was in ein ähnliches Horn bläst: Alle String-Operationen untersuchen, ob die Strings den zur Verfügung stehenden Platz überlaufen.
Gut dann habe ich es ja fast richtig verwendet. :) Ja an den Bauteilen da hab ich vielleicht irgendwann mal angefangen weil ich dachte es sieht gut aus oder so.? Na ja egal, aber irgendeinen unangenehmen Nebeneffekt hat das nicht oder? Um das jetzt noch schnell zu klären damit ich dieses Thema auch für mich abschließen kann.
Orko schrieb: > Hat jemand schon mal etwas ähnliches beobachtet? Zur genüge, aber das nützt dir nichts. Wenn sich Werte verändern dann gibt es da eine Reihenfolge der wahrscheinlichsten Ursachen. 98% der Programmierer 0,00001% Hersteller (von was auch immer, die Typen haben 100e von Millionen Exemplaren in freier Wildbahn) Rest auf 100 EMV und Hardware und "sonstiges". Also erstmal in der Software fahnden. Z.b. die Speicherbereiche über Prüfsummen checken oder die state machine mit nem Statuszähler verfolgen. Wenn der Fehler immer nach der gleichen Zeit Auftritt dann sind Störungen so gut wie ausgeschlossen (außer Sie treten immer zur gleichen Uhrzeit auf).
Karl Heinz Buchegger schrieb: > Bei Symptomen wie deinen (Variablen ändern 'magisch' ihren Wert) ist die > erste Anlaufstelle erst mal alles was mit Arrays zu tun hat. Ich würde erstmal die Grafik rausnehmen und Ausgaben über die UART oder ein Text-LCD machen. Grafik-Libs sind nämlich voll von Pointerzugriffen. Und auch sehr groß, so daß da leicht mal Fehler passieren können. Peter
Orko schrieb: > Könnte eine Instabile Versorgungsspannung auch ein Grund sein? Ich habe > wenn ich über das Relais 1,6kW schalte Schwankungen von 0,4V mit einer > Freq. von 75-80MHz über 100ns. Wie gesagt oft passiert nicht. Dann Klemm das doch einfach mal ab und schalte es extern weit weg, über ne andere Versorgung von Hand oder was auch immer. Danach hat sich die Frage erledigt. Hängende Ports können übrigens auch durch latch up verursacht werden.
hmm... gut ich werde erst mal alles unnötig raus nehmen und die Ausgabe über UART machen. Was meint ihr zur Versorgungsspannung? Orko schrieb: > Könnte eine Instabile Versorgungsspannung auch ein Grund sein? Ich habe > wenn ich über das Relais 1,6kW schalte Schwankungen von 0,4V mit einer > Freq. von 75-80MHz über 100ns. Wie gesagt oft passiert nichts.
Oh da war ich wohl zu langsam.... Der Rächer der Transistormorde schrieb: > Hängende Ports können übrigens auch durch latch up verursacht werden. Kannst du das kurz erklären? Sonst gehe ich es googeln.
Wenn du den Artikel über Latch up gelesen hast bist du zwar schlauer in Sachen Halbleiterdotierungstheorie weißt aber noch lange nicht ob das bei dir zutrifft. Besser ist Versorgung über Batterie (Alternativ Windrad, Biogas oder sonstwie auf jeden Fall autark) und den Leistungsteil weg. Deine Software sieht weder Latch up noch das Windrad, weiß aber sehr wohl wann Sie sich selbst die Daten unterm Ar.... wegzieht.
Okay erst mal vielen Dank für eure Antworten und Vorschläge. Ich werde jetzt erst mal alles Schritt für Schritt durch gehen, also Externe Versorgung Software reduzieren und die Last abtrennen. Mfg Orko
Orko schrieb: > Okay erst mal vielen Dank für eure Antworten und Vorschläge. > Ich werde jetzt erst mal alles Schritt für Schritt durch gehen, also > Externe Versorgung Software reduzieren und die Last abtrennen. Viel Erfolg, aber mach es systematisch. Eine Funktion nach der anderen. Das dauert in deinem Fall mit Pech ein paar Tage, aber dann kennst du auch die Ursache.
Mal abgesehen von der Software ist das Layout bei dem Betrieb mit Netzspannung absolut ungeeignet und gefährlich!!! Ich würde mir mal den folgenden Artikel durchlesen, bzgl. Luft- und Kriechstrecken: Leiterbahnabstände
Aaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhh. Netzspannung. Sogar Profis wie ich vermeiden Netzspannungen auf Leiterplatten. Nimm ein externes Netzteil und einen Hohlstecker.
bla schrieb: > Mal abgesehen von der Software ist das Layout bei dem Betrieb mit > Netzspannung absolut ungeeignet und gefährlich!!! > > Ich würde mir mal den folgenden Artikel durchlesen, bzgl. Luft- und > Kriechstrecken: > Leiterbahnabstände Ich bin auch gerade schockiert, dass das noch niemand zuvor gemerkt hat. Das sieht wirklich nicht gut aus. супертролль schrieb: > Aaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhh. Netzspannung. Sogar Profis wie ich > vermeiden Netzspannungen auf Leiterplatten. Das hingegen ist aber paranoider Unsinn.
Hallo, erst mal danke für die Hinweise. Ich hab das Layout geändert, entsprechend der vorgegebenen Leiterbahnabstände. Bei der einen Stelle konnte ich den Abstand nicht einhalten aber habe dann eine Fräsung vorgesehen. Geht das auch? Trotz dessen das diese Punkte wichtig sind. Kann das was mit meinem Problem zu tun haben? Habe jetzt über die Tage ein paar Tests gemacht, also die Software reduzieren. Allerdings habe ich es in einer anderen Umgebung getestet. Vorher war ich in einer Werkstatt. Die Tests habe ich dann zu hause gemacht. Die Last habe ich dieses mal direkt mit der Platine geschaltet und nicht noch über ein Schütz. Habe dann Systemtisch immer mehr von der ursprünglichen Software verwendet also Timer, Temperaturmessung, Taster auslesen, Regelung und Displaysteuerung. Mit der Erkenntnis das die Software(ursprünglichen Software 100%) ohne Fehler 4 Tage lang durchlief.???? Dann habe ich das ganze heute wieder in der Werkstatt getestet und nach 3h war wieder der Fehler da. Also entweder liegt es an der Umgebung oder am Schütz was ich schalte. Werde jetzt mal das Schütz raus nehmen und nochmal testen. Vielleicht hat Hubert ja recht mit dem Schütz als Induktive Last. Hubert G. schrieb: > Ich würde mal Snubber an den Relaiskontakten vorsehen. Mfg Orko
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.