Variable Zeitverzögerung

Gast #4623658
Lesenswert?

Hallo,
Ich bin neu in der Programierung von Mikrocontroller und hätte da mal 
ein paar fragen bei denen Ihr mir villeicht weiterhelfen könntet( im 
Anhang ist mein Programm):

Zur Funktionbeschreibung:
Hauptfunktion soll es sein das eine Variable Ein- und Ausschaltzeit (von 
399,9ms - 0 ms) auf ein LCD angezeigt werden soll und per Taster 
eingestellt werden kann. Dies wird in einem "Einstellmodus" gemacht. 
Durch einem  Tastendruck soll von "Einstellmodus" in ein "Warten auf 
Schaltbefehl-Modus" gewechselt werden. Wird in diesem Modus ein 
Schaltbefehl angelegt soll endweder mit der eingestellten Einschaltzeit 
eingeschaltet bzw. mit der eingestellten Ausschaltzeit ausgeschaltet 
werden.

Zur Programmbeschreibung:
Zuerst werden Bibliotheken eingeführt, I/O Pins Definiert, Variablen und 
LCD Initialisiert, ein Willkommenstext an das LCD übertragen und I/O 
Poins auf Ein/Ausgang gestellt. Dann kommt die Hauptprogammschleife  in 
der Status-Led eingeschaltet werden Werte der Ein und Ausschaltzeit ans 
LCD übertragen werden und die Tasten abgefragt werden. Je Einzustellende 
Zeit gibt es 3 Taster ( eine für +10ms, eine für +1 ms, eine für +0,1 
ms).
Danach wird der Umschalttaster abgefragt (Umschalten von "Einstellmodus" 
und "Warten auf Schaltbefehl-Modus".
Im "Warten auf Schaltbefehl-Modus" werden zuerst die Status LED's 
umgeschaltet und aus den einzelen Variabel ( eine für 100ms, eine für 
10ms, eine für 1ms und eine für 0,1ms) eine Varible für die 
Einschaltzeit bzw Ausschaltzeit generiert.
Darauf volgend wird eine schleife solange ausgeführt bis die 
Umschalttaste wieder auf "Einstellmodus" umschalten lässt. In dieser 
Schleife wird auf den Schaltbefehl gewartet und je nach Zustand 
Verzögert ein oder aus geschaltet.

Zu meinen Fragen:(Programm läuft soweit, also daten werden an LCD 
übertragen und Hardwaremäßig ist alles gut)

- Wie könnte ich am besten eine Variable zeitverzögerung Programmieren? 
(Zeile an welcher diese hin muss ist mit einer Komentarzeile makiert, 
zimlich am ende des Progammcods)
-hättet ihr Vorschläge oder anregungen wie man ein Solchen Code besser 
hätte schreiben können?

Vielen Dank schonmal und bin auf eure Antworten gespannt
Dirk
Angehängte Dateien:
Gast #4623675
Lesenswert?

So Entschuldigung hier jetzt der C-Quellcode zum zuvorbeschribenen 
Problem
1
// Bibliotheken einfüen//
2

3
#include <avr/io.h>
4
#include "lcd-routines.h"
5
#include <util/delay.h>
6
#include <stdint.h>
7

8
//PIN Definitionen//
9

10

11
#define AUSGANG_SCHALTER  PB2
12
#define AUSGANG_GRN      PB3
13
#define AUSGANG_ROT      PB4
14

15

16
#define TASTER_EIN1      PC0
17
#define TASTER_EIN2      PC1
18
#define TASTER_EIN3      PC2
19
#define TASTER_AUS1      PC3
20
#define TASTER_AUS2      PC4
21
#define TASTER_AUS3      PC5
22

23

24
#define EINGANG_SYN      PB0
25
#define EINGANG_UM      PB1
26

27

28
// Hauptprogramm //
29

30
int main(void)
31
  {
32

33
  // Initialisierung der Variablen //
34

35
  uint8_t Ein1;
36
  uint8_t Ein2;
37
  uint8_t Ein3;
38
  uint8_t Ein4;
39
  uint8_t Aus1;
40
  uint8_t Aus2;
41
  uint8_t Aus3;
42
  uint8_t Aus4;
43
  uint16_t ZeitEin;
44
  uint16_t ZeitAus;
45

46

47

48
  char Buffer1 [10];
49
  char Buffer2 [10];
50
  char Buffer3 [10];
51
  char Buffer4 [10];
52
  char Buffer5 [10];
53
  char Buffer6 [10];
54
  char Buffer7 [10];
55
  char Buffer8 [10];
56

57
   // Initialisierung des LCD //
58

59
   lcd_init();
60
 
61
  // Die Ausgabemarke in die 2te Zeile setzen//
62

63
   lcd_setcursor(5,1);
64

65
   // Willkommenstext ausgeben//
66

67
    lcd_string("Guten Tag");
68
  _delay_ms(5000);
69
  
70
  lcd_clear();
71
  
72
    // Die Ausgabemarke in die 2te Zeile setzen und Text Ausgeben //
73

74
  lcd_setcursor(0,1);
75
   lcd_string("Einschalt.:");
76
 
77
   // Die Ausgabemarke in die 2te Zeile setzen und Text ausgeben //
78

79
    lcd_setcursor(0,2);
80
    lcd_string("Ausschalt.:");
81

82
  // DDRx auf Ausgangs/Eingangs schalten//
83

84
  DDRC = 0b00000000;
85
  DDRB = 0b00011100; 
86

87
  //Variablen auf 0 setzen //
88

89
  Ein1=0;
90
  Ein2=0;
91
  Ein3=0;
92
  Ein4=0;
93
  Aus1=0;
94
  Aus2=0;
95
  Aus3=0;
96
  Aus4=0;
97

98
// Hauptprogrammschleife //
99

100
  while(1)
101

102
  {
103

104

105

106
      //Status LED einschalten (Grün) //
107

108
      PORTB |= (1<<AUSGANG_GRN);
109
      PORTB &= ~(1<<AUSGANG_ROT);
110
      
111
        
112
      //Variablen in char umwandeln //
113

114
      itoa (Ein1,Buffer1,10);
115
      itoa (Ein2,Buffer2,10);
116
      itoa (Ein3,Buffer3,10);
117
      itoa (Ein4,Buffer4,10);
118
      itoa (Aus1,Buffer5,10);
119
      itoa (Aus2,Buffer6,10);
120
      itoa (Aus3,Buffer7,10);
121
      itoa (Aus4,Buffer8,10);
122

123
      // Die Ausgabemarke 1te Zeile an 12 Stelle setzen Zeit + Einschaltverzögerung ausgeben //
124

125
        lcd_setcursor(11,1);
126
      lcd_string(Buffer4);
127
      lcd_string(Buffer1);
128
      lcd_string(Buffer2);
129
      lcd_data('.');
130
      lcd_string(Buffer3);
131
 
132
       // Die Ausgabemarke 2te Zeile an 12 Stelle setzen + Zeit Einschaltverzögerung ausgeben //
133

134
       lcd_setcursor(11,2);
135
      lcd_string(Buffer8);
136
      lcd_string(Buffer5);
137
      lcd_string(Buffer6);
138
      lcd_data('.');
139
      lcd_string(Buffer7);
140

141

142
       // Tastenabfrage TASTER_EIN1 //
143

144
      if  ( TASTER_EIN1 != 1)
145

146
          {
147
          Ein1 = Ein1 + 1;
148

149
          if (Ein1 > 9)
150
          {
151
          Ein1 = 0;
152
          Ein4 = Ein4 + 1;
153

154
          // auf 0 zurücksetzten //
155

156
          if (Ein4 > 3)
157
          {
158
          Ein4 = 0;
159
          }
160
          }
161

162
          // Tastenentprellung //
163

164
          _delay_ms(200);
165
          }
166

167
      // Tastenabfrage TASTER_EIN2 //
168

169
      if  ( TASTER_EIN2 != 1 )
170

171
          {
172
          Ein2 = Ein2 + 1;
173

174
          // auf 0 zurücksetzten //
175

176
          if (Ein2 > 9)
177

178
          {
179
          Ein2 = 0;
180
          }
181

182
          //Tastenentprellung //
183

184
          _delay_ms(200);
185
          }
186
  
187
      // Tastenabfrage TASTER_EIN3 //
188

189
      if  ( TASTER_EIN3 != 1 )
190
          {
191
          Ein3 = Ein3 + 1;
192

193
          // auf 0 zurücksetzten //
194

195
          if (Ein3 > 9)
196

197
          {
198
          Ein3 = 0;
199
          }
200

201
          // Tastenentprellung //
202

203
          _delay_ms(200);
204
          }
205

206
      // Tastenabfrage TASTER_Aus1
207

208
      if  ( TASTER_AUS1 != 1 )
209
          {
210
          Aus1 = Aus1 + 1;
211
          if (Aus1 > 9)  
212
          {
213
          Aus1 = 0;
214
          Aus4 = Aus4 + 1;
215

216
          // auf 0 zurücksetzten //
217

218
          if (Aus4 > 3)
219
          {
220
          Aus4 = 0;
221
          }
222
          }
223
          // Tastenentprellung //
224

225
          _delay_ms(200);
226
          }
227

228
      // Tastenabfrage TASTER_Aus2
229
      if  ( TASTER_AUS2 != 1 )
230
          {
231
          Aus2 = Aus2 + 1;
232

233
          // auf 0 zurücksetzten //
234

235
          if (Aus2 > 9)
236
          {
237
          Aus2 = 0;
238
          }
239

240
          // Tastenentprellung //
241

242
          _delay_ms(200);
243
          }
244

245
      // Tastenabfrage TASTER_Aus3 //
246

247
      if  ( TASTER_AUS3 != 1 )
248
          {
249
          Aus3 = Aus3 + 1;
250
        
251

252
          // auf 0 zurücksetzten //
253

254
          if (Aus3 > 9)
255

256
          {
257
          Aus3 = 0;
258
          }
259

260
          //Tastenentprellung //
261

262
          _delay_ms(200);
263
          }
264
      
265
      //Tastenbfrage ob in Schaltmodus umspringen//
266

267
      if  ( EINGANG_UM != 1 )
268
      {
269

270
      //Status LED einschalten (ROT) //
271

272
      PORTB |= (1<<AUSGANG_ROT);
273
      PORTB &= ~(1<<AUSGANG_GRN);
274

275
      // Schaltzeiten Generieren (in Mikrosekunden) //
276

277
      ZeitEin = Ein4 * 100000 + Ein3 + 10000 + Ein2 * 1000 + Ein1 * 100;
278
      ZeitAus = Aus4 * 100000 + Aus3 + 10000 + Aus2 * 1000 + Aus1 * 100;
279

280
      _delay_ms(500);
281

282
      // Warten aufs Schaltsignal oder Signal zum Zeiteinstellen //
283
      
284
        while (EINGANG_UM == 1)
285
        {
286

287
          // Abfrage Schaltsignal //
288

289
          if  ( EINGANG_SYN != 1 )
290
          {
291
            // Ausgang ist auf "Aus" und wird mit ZeitEin in Mikrosekunden verzögert eingeschaltet  //
292

293
            if  ( AUSGANG_SCHALTER != 1 )
294
            {
295

296
            //!!!!!!!!!!Hier müsste eine variable Zeitverzögerung stehen!!!!!!!!!!//
297

298
            PORTB |= (1<<AUSGANG_SCHALTER);
299

300
            }
301

302
            // Ausgang ist auf "Ein" und wird mit ZeitAus in Mikrosekunden verzögert ausgeschaltet  //
303

304
            if  ( AUSGANG_SCHALTER == 1 )
305
            {
306

307
            //!!!!!!!!!!Hier müsste eine variable Zeitverzögerung stehen!!!!!!!!!!//
308

309
            PORTB &= ~(1<<AUSGANG_SCHALTER);
310

311
            }
312
          }
313

314
        _delay_ms(500);
315

316
        }
317
        return 0;
318
      }
319

320

321
  }
322

323
  return 0;
324
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren