-
Programmierung C - Asuro
Hallo!
Ich bin versiert im Umgang mit Programmiersprachen, doch auf dem Gebiet C bin ich ein Neuling. Jetzt hab ich mir ein einfaches Programm für den Asuro gebastelt, aber es will und will nicht funktionieren. Er überspringt mir ständig meine Schleife, von der das Fahren abhängig ist - hier mal ein Code (hab ihn vereinfacht, aber vielleicht könnt ihr mir mal Tipps geben, wie er mir die Schleife mitnimm)
Code:
#include "asuro.h"
int main(void)
{
Init();
int i;
i=1;
while(i<300)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
i++;
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
}
-
Hallo,
ich selbst kann zwar kein (oder nur sehr sehr wenig) C, aber was glaubst du, wielange der µC braucht, deine while(i<300) Schleife abzuarbeiten? Das geht so schnell, dass die Motoren nicht einmal drauf reagieren können.
Du könntest z.b. einen Wait-Befehl einbauen, in C heißt das glaube ich Delay(x). Aber da kenne ich mich zuwenig aus.
Gruß
Chris
-
Zuerst musst du die util/delay.h includen und dann kannst du per _delay_ms(x); für x millisekunden pausieren.
Code:
#include "asuro.h"
#include <util/delay.h> int main(void) { Init(); int i; i=1; while(i<300) { MotorDir(FWD,FWD); MotorSpeed(200,200); i++;
_delay_ms(500); // eine halbe sekunde pausieren bevor weitergemacht wird } MotorDir(BREAK,BREAK); MotorSpeed(0,0);
}
EDIT: sorry der online editor hat mir das layout zerissen.. :/
-
Hallo
In der Library des asuro befindet sich die Funktion Sleep() zur Verzögerung. Ein Sleep(1) dauert 1/72000 Sekunden, eine Verzögerung um eine Sekunde könnte dann etwa so aussehen:
while(1=0; i<1000; i++) Sleep(72); // 72 ist eine Millisekunde mit der 72kHz-Library.
Programme für AVR-Microkontroller sollten nie beendet werden, da niemand weiß, wohin der Rücksprung aus main() führt und welche Folgen ein Rücksprung haben kann! Deshalb sollten die Progamme als Endlosschleife laufen oder in einer solchen Enden:
Code:
#include "asuro.h"
int main(void)
{
Init();
while(1)
{
//eigenes Programm
}
return(0);
}
(Programmgrundgerüst für den asuro)
Dein Programm von oben könnte also etwa so aussehen:
Code:
#include "asuro.h"
int i;
int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(200,200);
for(i=0; i>1000; i++) Sleep(72);
StatusLED(RED);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
while(1);
return(0);
}
Gruß
mic
-
Vielen Dank für eure Antworten - ich hab mir schon soetwas gedacht, hab aber nicht recht gewusst wie ich die Sleep-Funktion richtig einsetze - vielen Dank nochmal, auch den Tipp bez. des Codes!
[EDIT]
Eines ist mir aber noch unklar - wieso ist da eine Schleife vor dem Sleep? Die bräucht ich in dem Fall ja gar nicht, wenn ich einfach die Sleepzeit mit 1000 multipliziere hab ich ja die Sekunden, oder verstehe ich da was falsch?
Vielen Dank!
[/EDIT]
-
Die for-Schleife macht 1000 mal Sleep(72), wartet also eine Sekunde. Die Sleepzeit kann nicht größer als 255 sein, weil der Parameter für Sleep() ein char ist.
-
-
So jetzt brauch ich nochmals eure Hilfe!
Hier mein Code:
Code:
#include "asuro.h"
int i;
int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
for(i=0; i>2000; i++) Sleep(72);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
StatusLED(RED);
while(1);
return(0);
}
Theoretisch sollte er jetzt losfahren - 2 Sekunden lang fahren und dann bremsen. Macht er aber nicht, sondern nach dem Booten leuchtet sofort die rote LED!
Vielen Dank nochmal!
-
i>2000
i ist nie größer als 2000, die Schleife wird deshalb sofort wieder verlassen. Blöd wenn man ungetestete Programme verbreitet. Entschuldigung. Richtig wäre
for(i=0; i<2000; i++)
-
Ok das hätte ich auch selbst sehen können! ;-)
Danke nochmal!