PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : erste versuche mit dem asuro



Nordwind
22.09.2011, 16:09
hallo,
ich habe mir einen asuro bestellt um mal mit der C programiierung anzufangen.
Nun tuen sich mir ein paar Fragen auf:

Aus der SPS Technik kenne ich es so das ich der CPU vorher die variablen erklären muss (e0.1 = start oder sowas in der art)
woher weiss der asuro wo die motoren angeschlossen sind oder eben auch die led? (habe zumindest nichts gefunden das ich da irgendwo was eintippen muss)

habe versucht mich an der anleitung durchzuhangeln und der selbsttest usw scheint auch zu klappen.
danach habe ich das programm

#include “asuro.h”
int main(void) {
Init();
StatusLED(YELLOW);
while(1); // Endlosschleife
return 0;
}

eingegeben wo die statusled rot leuchten sollte
tut sie aber nicht :(

übersetzen klappt fehlerfrei und übertragen auch.

ich hoffe mir kann da jemand helfen


danke im voraus
stefan

radbruch
22.09.2011, 16:29
Hallo

Ich kann nicht glauben, dass du dieses Beispielprogramm fehlerfrei übersetzen kannst:

#include “asuro.h”

Das ist ein Fehler in der Anleitung, die Gänsefüsschen müssen die Anführungszeichen auf der 2er-Taste sein!


übersetzen klappt fehlerfrei und übertragen auch.Stellt sich natürlich die Frage, WAS wurde fehlerfrei übersetzt und übertragen? Erste Idee: Speichern vergessen vor dem Kompilieren. Dann wird ein "leeres" Programm erzeugt und übertragen. Die rote StatusLED deutet darauf hin, dass kein Init() ausgeführt wird, denn nach Init() sollte die StatusLED zumindest grün leuchten. Wenn das Programm richtig ausgeführt werden sollte, müsste die StatusLED ja eigentlich gelb (=YELLOW) leuchten.


woher weiss der asuro wo die motoren angeschlossen sind oder eben auch die led?Schau dir mal die Dateien asuro.h und asuro.c an. Diese beiden Dateien (und noch ein paar andere Libraries) werden durch den Befehl #include "asuro.h" in dein Programm eingebunden.

Gruß

mic

Nordwind
22.09.2011, 16:36
achso ok gespeichert habe ich nicht das erklärt einiges danke :)

Valen
22.09.2011, 16:41
Statt die geposteten Code sollte es Gelb Leuchten. ( StatusLED(YELLOW); ) Nun, dan Funktioniert es (vielleicht ... weil du nicht sagst wie es leuchtet).

Mit:

#include "asuro.h"

wird diese asuro.h Datei eingeladen das verschiedene Konstanten und Variablen Deklariert. Genau was du wissen möchtest. Zusätzlich wird in dem makefile (Datei: makefile. ) zu dem Compiler gesagt es soll auch den Datei asuro.c mit compilieren. Diese Datei enthält den Code für den verschiedene Asuro-spezifische Befehlen. Diese Dateien (gesammt die originale Lib/Code-Bibliothek genannt) sollen in dem Mappe stehen, gleich neben dein eigene bearbeite Programm.

Nordwind
22.09.2011, 18:01
denke erstmal an alle für die hilfe....
ich bin mitlerweile soweit das ich wenn ich den asuro nur einschalte mit diversen programmen die farbe der status led ändern kann *juhu*

nächster schritt wäre dann ja wenn der kollisionsschalter kommt die farbe zu ändern aber das hau schon wieder nicht hin

mein programm schaut so aus:



#include "asuro.h"


int main(void) {
Init ()
while (1) {
if (PollSwitch()>0) {StatusLED (RED);}
else {StatusLED (GREEN);}
}
}


ich bekomme beim kompilieren aber folgende meldung:


avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:6: error: parse error before "while"
make: *** [test.o] Error 1

> Process Exit Code: 2



was habe ich nu wieder falsch gemacht?


da tippe ich mal auf einen syntaxfehler
kann ich mir irgendwie anzeigen lassen wo was fehlt bzw. wo genau der fehler liegt?

radbruch
22.09.2011, 18:05
Init ();

Aller Anfang ist schwer ;)

Verwende mal den Code-Tag:


#include "asuro.h"

int main(void)
{
Init ();
while (1)
{
if (PollSwitch()>0)
{
StatusLED (RED);
}
else
{
StatusLED (GREEN);
}
}
return(0);
}

Gruß

mic

Valen
22.09.2011, 18:06
...
Init ()
while (1) {


parse error before "while"Das sagt es schon. Etwas stimmt nicht vorne von "while". Hint: was gehört hinter jeder Befehl/Funktionsanruf? Antwort: ein Punkt-Komma. ;)

Nordwind
22.09.2011, 18:09
wegen diesem mini ; spackt alles rum? ich sollte bei normalen sps steuerungen bleiben da weiss ich was die mir sagen wollen :D

Nordwind
23.09.2011, 00:26
so danke erstmal für die tolle hilfe :)
habe nu ein programm wo die motoren rennen


#include "asuro.h"

int main(void)
{
Init ();
while (1)
{
if (PollSwitch()>0)
{
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(80,160);
Sleep(3000);
FrontLED(OFF);
BackLED(ON,ON);
}
else
{
StatusLED (GREEN);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
FrontLED(ON);
BackLED(OFF,OFF);
}
}
return(0);
}


ist auch alles wunderbar bis die endschalter kommen dann fährt er nur kurz rückwärts......
gibt es einen befehl mit dem ich eine anweisung zeitlich begrenzen kann und dann wieder einen schritt zurückspringen kann? (dasmit dem sleep tut mal garnix, und ist das einzige was ich bei google gefunden habe)

also nachdem der endschalter betätigt wurde 3 sekunden rückwärts mit drehung und dann wieder vollgas?

und wieso blinken meine backleds? ist das nen wackelkontakt von meinen pollschaltern oder wo kommt dat wieder her?

t1001hh
23.09.2011, 08:16
Hallo,
Um mit dem ASURO richtig umgehen zu können solltest du mal das C-Tutotial durcharbeiten, um zu wissen was man mit C und mit Mikrokontrollern überhaupt so machen kann.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
(nur meine Meinung)

gruß aus Hamburg

radbruch
23.09.2011, 09:27
Sleep(3000);

Parameter für Sleep() ist 0 bis 255!

Sleep(255) wartet etwa 3,5 Millisekunden.


... abends früher ins Bettchen gehen.

Nordwind
23.09.2011, 10:54
ja das früher ins bettchen ist eine sehr gute iddee :)
irgendwie lkppt das mit der verzögerung aber trozdem nicht :D

Valen
23.09.2011, 19:53
ja das früher ins bettchen ist eine sehr gute iddee :)
irgendwie lkppt das mit der verzögerung aber trozdem nicht :DWie lange dauert den dein (geänderte?) verzögerung?

"Irgendwie klappt das nicht" ist nicht eine genaue erklärung was wirklich passiert. Bitte erkläre besser was er macht.

Nordwind
24.09.2011, 09:11
Also ich bin nu ein ganzes stück weitergekommen


#include "asuro.h"
int main (void)
{
Init();
int z;

MotorSpeed(200,200);

while(1)
{


if (PollSwitch()< 1)
{MotorDir(FWD,FWD);
BackLED(ON,OFF);}
else
{MotorDir(FWD,RWD);
BackLED(OFF,ON);}
for(z=0 ; z < 230 ; z++){Sleep(216);}

MotorDir(FWD,FWD);

}

return(0);
}

dieses programm funktioniert so wie ich mir das vorgestellt habe.
die verzögerung habe ich hier irgendwo im forum gefunden und so wie ich das verstehe hängt das mit der z variablen zusammen das er jetzt eine bestimmte zeit rückwärts fährt aber warum er das jetzt genau macht habe ich noch nicht ganz nachvollziehen können.

so wie ich das verstehe setze ich mit dem z=0 z auf 0
dann schaue ich ist z kleiner als 230 und zähle dann mit z++ solange hoch bis er bei 230 angekommen ist?

Valen
24.09.2011, 14:20
Also ich bin nu ein ganzes stück weitergekommen



dieses programm funktioniert so wie ich mir das vorgestellt habe.
die verzögerung habe ich hier irgendwo im forum gefunden und so wie ich das verstehe hängt das mit der z variablen zusammen das er jetzt eine bestimmte zeit rückwärts fährt aber warum er das jetzt genau macht habe ich noch nicht ganz nachvollziehen können.

so wie ich das verstehe setze ich mit dem z=0 z auf 0
dann schaue ich ist z kleiner als 230 und zähle dann mit z++ solange hoch bis er bei 230 angekommen ist?Stimmt genau! Jeder Durchlauf der for-Schleife wird er Sleep(216) machen. Insgesamt ungefähr 0,7 Sekunden.

Nordwind
24.09.2011, 15:12
funktioniert das sleep denn nur in verbindung mit der z variablen (ich weiss das die auch anders heissen kann) oder reicht auch
sleep(250)

Valen
24.09.2011, 15:20
Nein, das:

for(z=0 ; z < 230 ; z++)

ist nur eine generelle Wiederholung-schleife. Jeder Befehl das dahinter steht, oder mehrere Befehlen zwischen { } Klammern, wird so oft wiederholt bis die Vergleichung (zbs. z<230) hinter den erste Punktkomma stimmt. Danach geht es weiter im Programm.

Erweiterung: Jeder Sleep tick (also Sleep(1); ) dauert 1/72000 von einer Sekunde in dem mitgelieferte asuro.c und asuro.h Bibliothek. Das Sleep-zahl darf nicht höher sein als 255 (sonnst geht den Compiler durch den mauer), deshalb sollst du einer wiederholungsschleife benutzen für höhere Verzögerungzahlen.

Bei dem erweiterte Asuro-Bibliothek (http://sourceforge.net/projects/asuro/files/AsuroLib/) dauert jeder Sleep Tick 1/36000 von einer Sekunde.

Nordwind
24.09.2011, 19:52
also ist dieses gewurschtel mit der z variablen quasi eine art multiplikator bzw. eine verzögerung der verzögerung?

Abnormal
25.09.2011, 08:17
die Definition einer Anzahl von Wiederholungen ausgedrückt durch eine Zählvariable die in einer Schleife bis zum definierten Wert hochzählt und dabei eine Funktion wiederholt ausführt.
es ist also keine verzögerung der verzögerung sondern eine aneinanderreihung einer bestimmten Anzahl der angeführten Funktion. Es ist auch kein faktor, denn sonst bräuchtest du ja nur zb 35 hinschreiben und er würde es 35 mal machen - es ist eine zählschleife aus der mab meinetwegen auf einen Faktor rückschließen kann

radbruch
25.09.2011, 09:11
Das "Gewurschtel" ist eine Schleife:

http://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturen#Schleifen