Forum: Compiler & IDEs Hilfe bei Konzeptaufbau


von strategielos (Gast)


Lesenswert?

Hallo Leute,
ich benötige Hilfe beim erstellen eines besseren Konzepts für eine 
einfache Steuerung.
Zur Steuerung, ich muß ein Mischventil je nach Temperatur weiter öffnen 
oder schließen. Leider hat dieses Ventil keine Rückmeldung wo es sich 
befindet.
Daher muß ich beim einschalten der Steuerung zuerst das Ventil für eine 
gewisse Zeit schließen damit es sicher zu ist(Ventil besitzt Endschalter 
die aber nicht nach außen geführt sind).
Der Programmteil denn ich so sch...e finde sieht so aus.
1
if (PINA & (1<<IN_ANFORDERUNG))
2
    {
3
      testheizen=0;
4
      if (testheizenaus<10)
5
      {
6
        testheizenaus++;
7
      }
8
      else
9
      {
10
        anforderung = FALSE;
11
      }
12
    }
13
    else
14
    {
15
      testheizenaus=0;
16
      if (testheizen<10)
17
      {
18
        testheizen++;
19
      }
20
      else
21
      {
22
        anforderung = TRUE;
23
      }
24
    }
25
      if (!anforderung||reset_Mischer)
26
    {  
27
      
28
      if (!einmal)
29
      {
30
        if  (!reset_Mischer )
31
        {
32
          resetzeit = INIT_ZEIT;
33
          PORTA |= (1<<OUT_MISCHER_AUF);// sicherstellen das nicht geöffnet wird!
34
          PORTA &= ~(1<<OUT_MISCHER_ZU);
35
          reset_Mischer =TRUE;
36
        }
37
        if( (resetzeit==0)&&(reset_Mischer) )
38
        {
39
          PORTA |= (1<<OUT_MISCHER_ZU);
40
          state=0;
41
          reset_Mischer = FALSE;  
42
          einmal = TRUE;      
43
        }
44
      }        
45
      PORTA |= (1<< OUT_PUMPE);
46
      heizen = FALSE;
47
    }
48
    else
49
    {
50
      einmal = FALSE;
51
      heizen = TRUE;            
52
    }
53
              
54
      
55
    
56
    
57
    if (heizen)  // Anforderung Raumtermostate
58
    {
59
      switch(state)
60
      {
61
        case 0:
62
        {
63
          if ( !(umwaelzen) )  // es wird nich nicht umgewälzt
64
          {
65
            umwaelzen = TRUE;
66
            umwelzzeit = MENU_VARIABLE[VorUmwaelzzeit];
67
            PORTA &= ~(1<<OUT_PUMPE);
68
            printf_P(buffer,"Umwälzen für%2i Sekunden\n\r",umwelzzeit);
69
            uart_puts(buffer);
70
              
71
          }
72
          if ( (umwelzzeit==0)&&(umwaelzen) )
73
          {
74
            umwaelzen = FALSE;
75
            PORTA |= (1<<OUT_PUMPE);
76
            state = 1;
77
          }              
78
          break;      
79
        }
80
        case 1:
81
        {
82
          //PORTA &= ~(1<<OUT_PUMPE);
83
          if(Temp_array[VORLAUF]< (MENU_VARIABLE[SollTempVorlauf]-MENU_VARIABLE[Hysterese]))
84
          {  
85
            if ( !(move_mischer) )
86
            {
87
              move_mischer = TRUE;
88
              regelzeit = MENU_VARIABLE[Regelzeit_Auf];
89
              PORTA |= (1<<OUT_MISCHER_ZU);// sicherstellen das nicht geschloßen wird!
90
              PORTA &= ~(1<<OUT_MISCHER_AUF);
91
            }
92
            if( (regelzeit==0)&&(move_mischer) )
93
            {
94
              move_mischer = FALSE;
95
              PORTA |= (1<<OUT_MISCHER_AUF);
96
              state = 2;        
97
            }
98
          }
99
          else if (Temp_array[VORLAUF]> (MENU_VARIABLE[SollTempVorlauf]+MENU_VARIABLE[Hysterese]))
100
          {
101
            if ( !(move_mischer) )
102
            {
103
              move_mischer = TRUE;
104
              regelzeit = MENU_VARIABLE[Regelzeit_Zu];
105
              PORTA |= (1<<OUT_MISCHER_AUF);// sicherstellen das nicht geöffnet wird!
106
              PORTA &= ~(1<<OUT_MISCHER_ZU);
107
            }
108
            if ( (regelzeit==0)&&(move_mischer) )
109
            {
110
              move_mischer = FALSE;
111
              PORTA |= (1<<OUT_MISCHER_ZU);
112
              state = 2;
113
            }    
114
          }
115
          else
116
          {
117
            state=2;
118
          }          
119
          break;
120
        }
121
        case 2:
122
        {
123
          //PORTA &= ~(1<<OUT_PUMPE);
124
          if(! (delayreaktion) )
125
          {
126
            delayreaktion = TRUE;
127
            regelzeit = MENU_VARIABLE[Regelintervall];
128
          }
129
          if( (regelzeit ==0)&&(delayreaktion) )
130
          {
131
            delayreaktion =FALSE;
132
            state =1;          
133
          }
134
          break;
135
        }
136
      }
137
      if (!(umwaelzen))
138
      {
139
        if (Temp_array[PUFFER]>(MENU_VARIABLE[PufferMinTemp]))  // Kontrolle Temperatur Puffer!
140
        {
141
          PORTA &= ~(1<<OUT_PUMPE);
142
          puffertemp_to_lo = FALSE;
143
        }      
144
        else if(Temp_array[PUFFER]<((MENU_VARIABLE[PufferMinTemp])-2))
145
        {
146
        
147
          PORTA |= (1<<OUT_PUMPE);
148
          puffertemp_to_lo = TRUE;
149
        }  
150
      }          
151
    }
152
    else  // Keine Heizungs anforderung!
153
    {
154
      state=0;
155
      PORTA |= (1<< OUT_PUMPE);    
156
    }
157
ISR (TIMER0_OVF_vect)      // every 1ms
158
{
159
  TCNT0 = (unsigned char)(signed short)-(F_CPU / 1024 * 10e-4 + 0.5);  // preload for 1mer
160
  encoder();
161
  prellhelp--;
162
  if (prellhelp == 0)
163
  {
164
    prellhelp=10;
165
    entprell();  
166
  }    
167
  runtimer--;
168
  if (runtimer == 0)
169
  {
170
    runtimer = runperiod;
171
    PORTD ^= 1<<7;
172
  
173
  }
174
  sec--;
175
  if (sec == 0)
176
  {
177
    toggle++;
178
    sec = SEC;
179
    if (umwelzzeit!=0)umwelzzeit--;
180
    if (regelzeit!=0)regelzeit--;
181
    if (resetzeit!=0)resetzeit--;  
182
  }
irgend wie werde ich den Spagetti Code nicht los!
Bitte gebt mir einen Rat wie ihr das lösen würdet.
Vielen Dank

Konzeptlos

von PittyJ (Gast)


Lesenswert?

Zumindest würde ich dem State ordentliche Namen geben. Nach ein paar 
Wochen weiss man nicht mehr, was State 2 bedeutet.

Also so etwas wie

enum
{
  Auf,
  Zu,
  Kalibrieren
} State;


..

State = Auf;
..

case Auf:

Weiterhin könnte man mal schauen, ob man nicht Teile in Funktionen 
auslagert.

von strategielos (Gast)


Lesenswert?

PittyJ schrieb:
> Weiterhin könnte man mal schauen, ob man nicht Teile in Funktionen
> auslagert.

Ja genau das wollte ich habe aber keinen Plan was ich in Funktionen 
bringe.

Danke für deine >Hilfe

Konzeptlos

von PittyJ (Gast)


Lesenswert?

Damals im Studium hiess es: alles was länger als ein Bildschirm ist, 
bekommt eine extra Procedure. Das ist vielleicht etwas hart.

Aber du hast doch selber schon 5 Leerzeilen zwischen 2 Abschnitte 
gesetzt.
Jetzt mach einfach aus den beiden Abschnitten eine Funktion.

Zweimal ist ein ähnlicher Block beginnend mit
  if ( !(move_mischer) )
Auch eine Function mit Parameter auf/zu.

usw.

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.