Forum: Mikrocontroller und Digitale Elektronik µC hängt sich nach einer weile auf


von Orko (Gast)


Angehängte Dateien:

Lesenswert?

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

von Udo S. (urschmitt)


Lesenswert?

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.

von Orko (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Orko (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Orko (Gast)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Orko (Gast)


Lesenswert?

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.

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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).

von Peter D. (peda)


Lesenswert?

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

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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.

von Orko (Gast)


Lesenswert?

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.

von Orko (Gast)


Lesenswert?

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.

von Der Rächer der Transistormorde (Gast)


Lesenswert?


von Der Rächer der Transistormorde (Gast)


Lesenswert?

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.

von Orko (Gast)


Lesenswert?

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

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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.

von bla (Gast)


Lesenswert?

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

von супертролль (Gast)


Lesenswert?

Aaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhh. Netzspannung. Sogar Profis wie ich 
vermeiden Netzspannungen auf Leiterplatten. Nimm ein externes Netzteil 
und einen Hohlstecker.

von Hubert G. (hubertg)


Lesenswert?

Ich würde mal Snubber an den Relaiskontakten vorsehen.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Orko (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.