Forum: Mikrocontroller und Digitale Elektronik Variable Zeitverzögerung


von Dirk (Gast)


Angehängte Dateien:

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

von Frickelfritze (Gast)


Lesenswert?

Dirk schrieb:
> Vielen Dank schonmal und bin auf eure Antworten gespannt

Das AVR Studio Project File hilft in diesem Zusammenhang wenig.

von Dirk (Gast)


Lesenswert?

Was müsste ich hochladen? Ich habe gedacht das dort der Quellcode ist

von Dirk (Gast)


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
}

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.