Hallo liebe community, ich beschäftige mich derzeit mit dem Programmieren in C, bin jedoch noch nicht sonderlich gut darin. Ich benutze den Mikrocontroller AT90S8515 und habe vor, ein Lauflicht zu programmieren, das durchgehend in eine Richtung läuft, bei einem Druck auf einen Schalter soll die Richtung dann geändert werden. Ich habe bereits angefangen, den Code zu schreiben, leider weiß ich jedoch weder, ob er richtig ist, noch, wie man die Richtung des Lauflichtes ändert. Ich hoffe, hier eine Antwort zu erhalten. Vielen Dank für eure Hilfe! Hier mein bisheriger Code (Ich hoffe, es ist erlaubt, ihn mit dieser Länge zu posten): #include <avr/io.h> #include <avr/delay.h> int main (void) { int x,y; DDRC = 0b11111111; PORTC = 0b00000000; x = 8; i = 1; while(x>=0) { PORTC = i; i = i * 2; x--; _delay_ms(500); } if(bit_is_set(PINA==1)) { PORTC = i; i = i / 2; x--; _delay_ms(500); } return 0; } Beste Grüße, Gharex
Nein, das Programm funktioniert nicht, vermutlich kompiliert es nicht mal. Es hat jetzt wenig Sinn, Dir ein fertiges Lauflicht-Programm zu schreiben, davon lernst Du nichts. Aber ein paar allgemeine Tipps zur Vorgehensweise könnten Dir vielleicht helfen: - Versuche nicht alles auf einmal, sondern gehe schrittweise vor! Mach erstmal ein Lauflichtprogramm ohne Taster, das kontinuierlich durchläuft. Das ist bisher nicht der Fall. Dein Lauflicht läuft nur einmal durch, danach ist das Programm zu Ende. Du brauchst eine Endlossschleife, damit das Licht wieder von vorne anfängt. - Danach machst Du ein neues Programm und versuchst per Taster eine LED ein- und auszuschalten. - Wenn diese beiden Programme laufen, versuchst Du das Lauflicht mit Wechselrichtung. Dabei musst Du bedenken, dass der Taster jederzeit gedrückt werden kann, nicht nur am Ende eines Durchlauf des Lauflichts. Das sauber umzusetzen ist gar nicht so einfach, da die Taste ja auch während der delay_ms()-Funktion gedrückt werden kann und Du es in der Zeit nicht erkennst. Dazu kommt, dass Taster prellen ... Da wäre dann ein guter Zeitpunkt, sich mit den Timern des Mikrocontrollers und Tasterentprellung zu beschäftigen. Das ist im Tutorial hier alles gut beschrieben, daher würde ich empfehlen, das mal durchzuarbeiten. Ach ja, wenn Du Code postest sind die Formatierungsfunktionen hilfreich, die über dem Antworten-Formular beschrieben sind. Für C-Code also das [c]-Tag benutzen.
Hallo xfr, danke für deine Antwort! Wenn ich das Ganze in eine for-Schleife setze und am Schluss die Variablen zurücksetze, sollte das Ganze doch unendlich weiter laufen, oder? Beispielsweise so: while(1) { int x = 1; for(i=0; i<8; i++) { PORTC = x; x = x * 2; _delay_ms(500); } x = 1; i = 0; } Beste Grüße!
Formatierung für C-Code
1 | C-Code |
macht deinen Code lesbarer. http://www.mikrocontroller.net/articles/Formatierung_im_Forum
Dann sieht das so aus:
1 | while(1) { |
2 | |
3 | int x = 1; |
4 | |
5 | for(i=0; i<8; i++) { |
6 | |
7 | PORTC = x; |
8 | x = x * 2; |
9 | _delay_ms(500); |
10 | |
11 | }
|
12 | |
13 | x = 1; |
14 | i = 0; |
15 | |
16 | }
|
Dominik W. schrieb: > Wenn ich das Ganze in eine for-Schleife setze und am Schluss die > Variablen zurücksetze, sollte das Ganze doch unendlich weiter laufen, > oder? Ja. Aber warum probierst Du es nicht einfach auf dem Mikrocontroller aus? Wenn das Licht dann endlos läuft, dann funktioniert es ja offensichtlich ...
Wollte erst einmal nachfragen, um sicher zu sein, dass ich die Grundlagen schon verstanden habe. :) Ich werde mal schauen, ob ich den Code zu Laufen bekomme.
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.