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
Dirk schrieb: > Vielen Dank schonmal und bin auf eure Antworten gespannt Das AVR Studio Project File hilft in diesem Zusammenhang wenig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.