Archiv verlassen und diese Seite im Standarddesign anzeigen : Einsteiger braucht hilfe bei den 1. Programmen
Erst mal hallo an alle, da ich hier neu bin und schonmal danke im voraus,
Ich wollte wissen, ob der folgende code richtig ist, da ich grade mit c angefangen habe und das mein erstes programm ist.
#include "asuro.h"
int main(void)
{ char befehl[8];
unsigned char ktaster;
Init();
SerRead(befehl,8,0);
MotorDIR(FWD,FWD);
MotorSpeed(255,255);
while(1);{
ktaster=PollSwitch();
if (ktaster>7)
{MotorSpeed(180,60);}
else
{MotorSpeed(60,180);}
}
return 0;}
int main(void)
{ unsigned int odata[2];
init();
OdometrieData(odata);
if (odata<1023)
{SerWrite("Wir fahren",9);}
else
{SerWrite("Wir fahren nicht",14);}
while(1);
return 0;}
was mir so auf die schnelle einfällt
(1) nimm bitte den code button wenn du code postest
(2) du hast zweimal die main funktion
was soll dein programm eigentlich genau machen?
zu 1) werd ich mir merken und zu 2) werde ich ändern und er soll auf befehl "fahr los" los fahren dann wenn er irgendwo gegesstößt die richtung ändern und danach die odo leds checken und wenn die merken das er fährt "wir fahren" senden und wenn nciht dann "wir fahren nicht" senden.
OdometrieData(odata);
if (odata<1023)
{SerWrite("Wir fahren",9);}
else
{SerWrite("Wir fahren nicht",14);}
das wird ztu 100% nicht funktionieren.
er wird dir immer ausgeben, dass er fährt.
mt der funktion OdometrieData() wird NICHT DIE DREHZAHL GEMESSEN.
die drehzahl musst du dir erst selbst ausrechnen. gibts hier n paar threads dazu.
mfg EDH
eventuell wäre da jetzt sogar ein einsatzweck für diese multitasking.
in einem thread wird der motor gesteuert
im anderen thread "wir fahren" bzw "wir fahren nicht" ausgegeben
oha wir wollen mal lieber nichts überstürzen^^
Sieht das besser aus? Ich hab den code jezt nochmal überarbeitet
#include "asuro.h"
int main(void)
{ char befehl[8];
unsigned char ktaster;
Init();
SerRead(befehl,8,0);
MotorDIR(FWD,FWD);
MotorSpeed(255,255);
while(1);{
ktaster=PollSwitch();
if (ktaster>7)
{MotorSpeed(180,60);}
else
{MotorSpeed(60,180);}
}
return 0;
void abfrage(void) {
unsigned int odata[2];
init();
OdometrieData(odata);
if (odata<1023)
{SerWrite("Wir fahren",9);}
else
{SerWrite("Wir fahren nicht",14);}
while(1);
return 0;}
}
mhh...
also genaugenommen sieht der code immer noch ziemlich scheps aus
aber ich glaube nicht das es jetzt was bringt, wenn ich erklär was falsch ist, oder den berichtigten code poste.
hast du die asruo anleitung GENAUESTENS studiert?
da steht ja nicht wirlich viel über c drinn. aber das was man am anfang für den asuro braucht ist vorhanden.
vieleicht solltest du lieber erst selber programme schrieben, wenn du alle beispiele auswendig kannst.
Naja ich hab die anleitung durchgelesen ich kann sie nich auswendig aber ich meine dass ich sie verstanden habe. ABer es kann auch sien dass ich nur denek das ich sie verstanden habe, aie allerdings gar nicht wirklich verstanden habe^^ Aber ich fänd es nett wenn du mir vllt den richtigen code posten würdest (wenn es keine Umstände macht), dann kann ich besser sehen was ich falsch mache.
damaltor
27.11.2006, 11:36
also was schon mal nicht geht ist while(1);{...
an dieser stelle wird er hängen bleiben. while(1); ist eine endlosschleife. besser gehts so:
while(1){
Hier rein kommen die Anweisungen die immer wieder wiederholt werden sollen
}
sälbstverständlich werden diese anweisungen dann bis ewig wiederholt. es hilft also auch nix, eine zweite while(1) schleife unten drunter zu schreiben. du musst alle anweisungen da rein packen.
fang mal an mit einem programm, das nur auf die taster reagiert und meinetwegen die leds anschaltet. dann nimmst du als zweite schwoerigkeitsstufe die motoren dazu... und immer so weiter. das ist der beste (und eigentlich auch einzige) weg das zu lernen: schritt für schritt.
meld dich wenn du noch fragen hast!
Was hällst du erstmal davon?
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
init();
StatusLED(GREEN)
MotorDIR(FWD;FWD);
MotorSpeed(200,200);
while(1){
ktaster=Pollswitch();
Pollswitch();
if (ktaster>0)
{StatusLED(RED);}
else
{StatusLED(GREEN);}
}
return 0;
}
[/code]
sollte ich die "Pollswitch();" Abfrage vllt noch öfters machen?
(1) Init() statt init()
(2) MotorDir() statt MotorDIR()
damaltor
27.11.2006, 19:27
wenn du die PollSwitch Abfrage öfter machst, ist das risiko eines falschen wertes kleiner. 3-4 mal helfen eigentlich, 10x geht auf nummer sicher(in einer schleife), braucht aber auch mehr zeit.
es wäre einfacher, wenn du in der if abfrage einfach die varible switched nimmst
die wird von nem interrupt gesetzt.
damaltor
27.11.2006, 19:42
allerdings musst du daran denken, sie nach dem was der asuro machen soll wen der schalter gedrückt wurde, wieder auf 0 zu setzen.
beispiel:
if(switched=1){
hier kommt das hin was er machen soll
switched=0;
}
ahem nur ein kleiner hinweis.
es muss heise
if(switched==1) {
}
alternativ kann man auch einfach
if(switched) {
}
schreiben
Ähm ich weiß nicht ob ich das jezt richtig verstanden habe aber ich hoffe dass das so richtig ist.
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
ktaster=Pollswitch();
Pollswitch();
if(switched==1){
{StatusLED(RED);}
else
{StatusLED(GREEN);}
switched=o
}
return 0;
}
den aufruf von pollswith kannste streichen. auserdem hängt der zweite eh irgendiwe so in der lugt un bewerikt gar nix
bei dir steht switched=o
es muss heisen switched=0
auf was bezieht sich den "switched" nur auf die Taster oder reagiert die funktion einfach auf alles was sich verändert?
Sieht das so besser aus?
#include "asuro.h"
int main(void)
{
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
{StatusLED(RED);}
else
{StatusLED(GREEN);}
switched=0
}
return 0;
}
switched bezieht sihc nur auf die taster
(1) Schreib lieber MotorDir(FWD,FWD) statt MotorDir(FWD;FWD)
(2) du hast bei der if abfrage zwei geschweifte klammern
(3) nach StatusLED(GREEN) kommt noch ein strichpunkt
ok, aber welche geschweiften klammerrn sind den zuviel?
if(switched==1){
{StatusLED(RED);}
else
di eklammer wo direkt vor StatusLED steht ist zuviel
Also müsste es heißen:
#include "asuro.h"
int main(void)
{
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
StatusLED(RED);}
else
{StatusLED(GREEN);}
switched=0
return 0;
}
Kommt der Block in der while Schleife denn nicht in Klammern?
damaltor
27.11.2006, 22:01
ist er doch... o0
while(1){
da is ne klammer.
allerdings hast du das semikolon und die schliessende klammer hinter switched=0 vergessen.
Hallo Sloti,
ich denke, Dir mangelt es noch massiv an C-Kenntnissen.
Dein Code sieht grauenhaft aus...
So wird das nichts Gescheites werden.
Les Dir am besten erstmal einen der vielen C-Kurse im Netz durch, fang an mit dem Verstehen von einfachen "Hallo-Welt"-Programmen usw..
Hat zwar am Anfang nichts mit Robotern und AVRs zu tun, aber es hilft Dir am besten weiter. Bevor Du mit solchem Code Deinen Controller totflash'st, bis mal was Lauffähiges rauskommt, hast Du auf einem Standard-PC einen leichteren Einstieg in C.
By the way: Dein Betreff zu diesem Thread is ja auch echt gut gewählt.
Gruß
Michl
damaltor
27.11.2006, 22:34
Ach naja... wenigstens die Grundidee ist ja vorhanden, und jeder versuch ist besser als der vorherige... =) wir müssen uns eigentlich nur noch um die syntax kümmern.
ausserdem: wenn du soweit wärst, du würdest den asuro doch auch nicht in die ecke stellen, um erst mal nen c-kurs zu machen oder? =)
der titel ist allerdings einer der genialsten, das is schon richtig -.-
Ihr habt ja recht der titel war scheiße aber wenn ich ihn speziel auf etwas beziehen würde und ich dann eine andere Frage hätte würde der Titel nicht mehr passen. (Konjunktiv ist ne bescheuerte Erfindung)
und wegen der Klammer ich werd sie da hinschreiben.
ps:@damaltor herzlichen Glückwunsch zum 300 Beitrag^^
mfg.
Sloti
damaltor
27.11.2006, 22:45
oh... o0 wow... =)
du kannst den titel übrigens ändern *anpiek*
editiere den ersten post und gib ihm einen vernünftigen titel, das hilft doch sehr...
ausserdem: wenn du soweit wärst, du würdest den asuro doch auch nicht in die ecke stellen, um erst mal nen c-kurs zu machen oder? =)
Ja, würde ich,
oder fährst Du auch Auto ohne die Fahrschule davor besucht zu haben ?
Wenn man die User hier nach Qualität der Beiträge bewerten würde, hättest Du einen "Roboter Noob" anstatt "Roboter Experte" unter Deinem Nick stehen.
Eben.
Ich denke, es sollte hier um Robotik gehen.
Die Grundlagen der Programmierung sowie auch Elektronik-Grundkenntnisse sollte man schon mitbringen. Sonst kommt als nächstes die Frage, was ein Spannungsteiler ist.
Ich finde es ja durchaus gut, wenn ein 14jähriger sich für das alles interessiert. Aber auf die Hau-Ruck-Methode funktioniert das sicher nicht.
Gruß
Michl
Ich denke, dass eure Einwände berechtigt sind, aber um Missverständnissen vorzubeugen:
1. Ich habe noch gar keine Asuro. Ich bin blos darauf gekommen, da wir in der Schule einen Kurs für Robotik haben und dort bald einen (bzw. 15) Asuros bauen.
2. Ich bin kein Mensch der etwas überstürzt anfängt allerdings habe ich mein erstes Program, welches hier ganz am Anfang steht, geschrieben, nachdem ich die Anleitung durch hatte und gemerkt habe, dass Programieren gar nicht so schwer ist. Aber langsam sehe ich ein, dass ich noch kaum Ahnung habe wie das geht. Aber mein Leben ist (hoffentlich) noch lang und ich habe aller Zeit der Welt C zu lernen.
was haltet ihr von dem neuen titel?^^
ist jedenfalls passender als der erste ;)
So mein nächster Schritt soll sein dass wenn er gegen die Wand stößt sich umdrehen soll erstmal nicht mehr. Ich weiß, dass es eine turn Funktion gibt aber ich weißt nicht wie sie funktioniertund in der standart asuro Bibliothek auch soeit ich weiß nciht drin ist. ich habs einfach mal so gemacht:
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
{StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
Sleep(255);
MotorDir(BREAK,BREAK);}
else
{StatusLED(GREEN);}
switched=0
}
return 0;
}
Ich denke dass es nicht so funkioniert wie es soll, er soll nämlich um 180° gedreht werden.
also syntax der turn funktion ist so:
Turn(grad,geschwindigkeit)
achtung:
zuvor Encode_Init() aufrufen
zu dem code oben:
switched = 0 in den else block zu schreiben ist schwachsinn
wie soll er eigentlich drehen, wenn immer alle motoren gleichschnell laufen?
[edit] ups da hab ich übersehen das vorher noch mal MotorDir drann steht :oops: [edit]
damaltor
28.11.2006, 20:01
sieht nicht schlecht aus, habe nur die überflüssigen klammern in der if-abfrage weggemacht.
es heisst
if(bedingung){aktion}else{aktion}
und nicht
if(bedingung){{aktion}else{aktion}}
es gibt nur ein problem: die funktion sleep(255) wartet etwa 3 milliseknunden, aber der asuro wird länger brauchen um sich um 180 grad zu drehen.
probiers mal damit:
zuerst definierst du noch einen int i am anfang des programms.
dann machst du folgendes an der stelle, wo er sich drehen soll:
for(i=0;i<333;i++){
sleep(255);
}
dann wartet er 333*3ms=ca eine sekunde, bevor er anhält. ob er es in dieser zeit schafft, weiss ich nicht, aber du musst dann mit dem wert für i (der 333) experimentieren biss es hinhaut.
hier der neue code:
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
Sleep(255);
MotorDir(BREAK,BREAK);}
else{
StatusLED(GREEN);}
switched=0
}
return 0;
}
damaltor
28.11.2006, 20:06
wie soll er eigentlich drehen, wenn immer alle motoren gleichschnell laufen?
ganz einfach... die motoren laufen in verschiedene richtungen...
XD
das hab ich wohl übersehen :cheesy:
damaltor
28.11.2006, 22:42
kein problem, meld dich wenns läuft!
Ich hab nochmal eine allgemeine Verständnis frage zu den Bibliotheken.
und zwar, wenn man die standart lib vom Asuro erweitern will brauch ma ndoch einfach nur die neu definierten funktionen aus der neuen lib kopieren und in die Standart lib einfügen oder?
Oder als Alternative kann man beide Bibliotheken auf den Asuro flashen und muss dann nur im Programm die neue Bibliothek neben der Standart lib mit #include... verknüpfen oder ?
Wenn das so einigermaßen stimmt hab ichs begriffen^^.
Hi sloti,
deine Hex-Datei beinhaltet immer die Bibliothek die mit #include <libname.h> in deiner test.c Datei steht. Die Bibliothek wird nicht einzeln auf den Asuro geflasht!
Willst du die Bibliothek auswechseln überschreibst du einfach die Alte.
So einfach is das...
:)
O.
damaltor
29.11.2006, 16:58
genau, du flashst ja nur dein eigenes programm. das, was bei #include steht, wird mit kompiliert und mit geflasht, d.h. wenn du die neue bibliothek einfach über die alte drüber kopierst (die original-bib ist ja noch auf der cd), und dann neu kompilierst, dann wird dein programm mit der neuen bib laufen.
einfach die funktionen rüber zu kopieren, wird evtl nihct gehen, weil einige der neuen funktionen auf einem 36kHz-counter basieren, während bei der alten bib ein 72kHz-counter verwendet wurde. Beispielsweise die Textübertragung per infrarot würde nicht mehr hinhaun.
also einfach die neue bib runterladen (ich empfehle version 2.6, in version 3.0 wurden einige funktionen recht nutzlos umbenannt, was das programmieren nur erschwert. ansonsten wurden nur kleinere aufräumarbeiten durchgeführt) und über die alte asuro.c und asuro.h drüber kopieren. dann kannst du so wie immer programmieren, du musst nichts weiter beachten.
Ja das is ja einfach. Ich bin ja schon drin^^
Die neusete Version meines Programmes:
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
int i
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0,i<333,i++);
{Sleep(255);}
MotorDir(BREAK,BREAK);}
else
{StatusLED(GREEN);}
}
return 0;
}
damaltor
29.11.2006, 22:52
sieht gut aus.... kleine korrekturmaßnahmen in rot:
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
int i //Hier fehlt ein Semikolon
Init();
StatusLED(GREEN) // hier fehlt ein semikolon
MotorDir(FWD;FWD); //Zwischen die richtungsangaben kommt ein komma
MotorSpeed(200,200);
while(1){
if(switched==1){
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0,i<333,i++); // dieses semikolon muss weg. if(bedingung){aktion}. Ausserdem kommt zwischen startbedingung, endbedingung und i++ ein semikolon und kein komma
{Sleep(255);}
MotorDir(BREAK,BREAK);}
else
{StatusLED(GREEN);}
}
return 0;
}
ansonsten müsste es eigentlich hinhaun...
[edit]habs grad mal getestet... leider fährt asuro nur vorwärts. warum weiss ich grad nich... werd morgem nal schaun.
erst müssen noch die taster mit StartSwitch() auf Interrupt betrieb geschaltet werden.
Ok danke ich hasse diese Tippfehler^^
kommt das StartSwitch() direkt unter Init() ?
du musst es nur vor dem ersten einsatz von switched hinschreiben
der übersichtlichkeit halber wäre es aber direkt unter Init() passend
ok, danke.(ich muss jezt noch 15 zeichen zusammen kriegen)
damaltor
30.11.2006, 19:07
erst müssen noch die taster mit StartSwitch() auf Interrupt betrieb geschaltet werden.
oh mann... ich hab fast 3 stunden dranne rumgebaut... danke dir
so in der neuen Version soll der Asuro jezt nachdem er sich gedreht hat in die andere Richtung weiterfahren.
#include "asuro.h"
int main(void)
{
unsigned char ktaster;
int i
Init();
StatusLED(GREEN)
MotorDir(FWD;FWD);
MotorSpeed(200,200);
while(1){
if(switched==1){
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0,i<333,i++);
{Sleep(255);}
MotorDir(BREAK,BREAK);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,180);}
else
{StatusLED(GREEN);}
}
return 0;
}
sidn noch n paar fehler drinn
#include "asuro.h"
int main(void)
{
unsigned char ktaster; // brauchst du gar nicht
int i //struchpunkt vergessen
Init();
StatusLED(GREEN) //strichpunkt vergessen
MotorDir(FWD;FWD); //parameter werden duchr ein komma getrennt
MotorSpeed(200,200);
while(1){
if(switched==1){ //schreib einfach switched statt switched==1
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0,i<333,i++); //bei for kommen schon strichpunkte hin
{Sleep(255);}
MotorDir(BREAK,BREAK);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,180);}
else
{StatusLED(GREEN);}
}
return 0;
}
so... auserdem hast du StartSwitch() vergessen
bei mir funktioniert das aber trotzdem nicht...
damaltor
04.12.2006, 17:11
hier
for (i=0,i<333,i++); //bei for kommen schon strichpunkte hin
muss ein semikolon weg. ansonsten passiert in der for schleife gar nix.
richtig sieht die zeile so aus:
for(i=0;i<333;i++)
{sleep(255)};
(hinter dem letzten befehl vor einer schliessenden klammer } braucht man kein ; zu setzen.)
wenn du so kurz wie möglich schreiben willst dann so:
for(i=0;i<333;i++) sleep(255);
wenn man nur eine anweisung benötigt, dann braucht man auch keine klammern. =)
gehts jetz?
den strichpukt bei der for schleife hab ich übersehen.
ber gehen tuts trotzdem nicht (bei mir zumindest)
damaltor
04.12.2006, 17:29
hmmm... hast du alle deine fehler (inklusive StartSwitch) korrigiert?
der von mir verbesserte code
#include "asuro.h"
int main(void)
{
int i; //struchpunkt vergessen
Init();
StartSwitch();
StatusLED(GREEN); //strichpunkt vergessen
MotorDir(FWD,FWD); //parameter werden duchr ein komma getrennt
MotorSpeed(200,200);
while(1){
if(switched==1){ //schreib einfach switched statt switched==1
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0;i<333;i++)
{Sleep(255);}
MotorDir(BREAK,BREAK);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,180);}
else
{StatusLED(GREEN);}
}
return 0;
}
damaltor
04.12.2006, 17:53
setz mal unter MotorSpeed(200,200)
switched=0;
da zu beginn falsche werte für die taster ausgelesen werden, könnte es sein dass switched von anfang an 0 ist und deshalb komische sachen passieren... aber DER fehler kann das nicht sein. ich werd mal nen bissl suchen.
nach ein bisschen debuggen stelle ich fest:
es scheitert an der if abfrage in der while schleife.
damaltor
04.12.2006, 18:45
woher weisst du das? und was genau ist falsch?
#include "asuro.h"
int main(void)
{
// brauchst du gar nicht
int i; //struchpunkt vergessen
Init();
StartSwitch();
StatusLED(GREEN); //strichpunkt vergessen
MotorDir(FWD,FWD); //parameter werden duchr ein komma getrennt
MotorSpeed(200,200);
switched = 0;
while(1){
SerWrite("while schleife\n",15);
if(switched){ //schreib einfach switched statt switched==1
SerWrite("taster gedrückt\n",15);
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(100,100);
for (i=0;i<333;i++)
{Sleep(255);}
MotorDir(BREAK,BREAK);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,180);
switched = 0;
}
else
{StatusLED(GREEN);}
}
return 0;
}
bei mir zumindest gibt er dauernd nur "while schliefe" aus. sonst nichts. kein "tawster gedürkct"
wenn ich wüsste woran das liegt und was falsch ist hätte ichs schon verbessert.
hi,
ich habe mir grade meinen 1. Asuro gekauft und habe da ein problem.
das Teil "Q1" (BC548 oder BC547) sind nicht aufzufindne auf fotos kann man die transistoren erkennen die halbrundne teile aber die sind vollkommen anders beschriftet.
Wer kann mir helfen!?!?!?!!?
Das ganze spielt sich auf dem IR transciever ab nicht auf der Asuro platine
Asuro-n00b
28.12.2006, 17:55
Der Transistor Q1 muss so in den Transciever eingebaut werden, dass die flache Seite zu der COM-Buchse zeigt.
Asuro-n00b
28.12.2006, 18:00
Hier habe ich gerade noch ein Bild dazu gefunden, wo du es sehen kannst:
http://www.jc.edu/academics/Robotics/2006/ASURO's%20website_jabrizue/images/shots/IMG_0488.JPG
Und hier noch ein Bild, wo die Anschlussbezeichnungen gut zu sehen sind:
http://www.personeel.glr.nl/koster/elektro/transistor.JPG
ist das denn egal welchen transistor man nimmt. Es gibt da doch 3 verschiedene arten oder irre ich mich da?
danke ich weiß jezt bescheid. kansst den Eintrag da oben vergessen.
damaltor
28.12.2006, 23:20
ja es gibt 3 arten. 2 arten sind 4x vorhanden, eine art nur einmal. diesen einzelnen transistor musst du da einlöten.
kontrollier aber trotzdem nochmal was draufsteht!
oder poste mal die beschriftungen deiner transistoren.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.