PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Asuro Anfänger) Erstes Programm und kein Plan von Nix



albi1989
07.08.2007, 10:27
So Leute Hallo :D
Ich mach da ja vonner Schule dieses "Projekt" mit dem Asuro mit.
Ok Schule ist noch nicht, aber ich kann meine Finger nicht von dem Teil lassen und hab dann, jetzt auch versucht mein erstes Programm zu schreiben. Ziel soll sein fahren und bei Hindernis 5 mal rot leuchten
soll nacher noch mehr könn aber so weit bin ich gekommen
Hier der Code:

#include "asuro.h"

int main(void)
{
unsigned char taste;
int blink=0;
Init();
MotorDir(FWD,FWD);
while(1)
{
taste=PollSwitch();
SerWrite(taste,5);
if(taste>0)
{
MotorSpeed(0,0);
for(int i=0; i<10 ; i++)
{
if(blink==0)
{
StatusLED(RED);
blink=1;
for(int a=0;a<333;a++)
{
Sleep(217);
}
}else if(blink==1)
{
StatusLED(OFF);
blink=0;
for(int a=0;a<333;a++)
{
Sleep(217);
}
}
}
}
if(taste==0)
{
MotorSpeed(120,120);
}
}
return 0;
}



Das ganze Funktioniert auch aber wenn ich den SerWrite(); Befehl weg lasse dann geht nix mehr der geht einfach so in die for Schleife obwohl Taste garnicht >0 sein kann dann macht der nach jedem blinken son ruck als ob er absulut jede if anweisung und for Schleife in dem Programm ignuriert -.-
Und ich hab absulut keine Ahnung wieso, weil der Befehl eigentlich ja nur die Variable Taste über die infrarot Schnittstelle senden soll

Ich Danke schon mal für eure Hilfe :D

damaltor
07.08.2007, 11:36
sieht schon mal gar nich so schlecht aus.

der code ist zwar durchaus noch optimierbar, aber er tut wohl seinen dienst.

das problem ist die funktion pollswitch():
diese funktion macht häufige zicken und gibt falsche werte zurück. das liegt an fehlerhaften widerständen, an dem kondensator C6 und an einigen anderen dingen.

es gibt verschiedene lösungsansätze dafür, von mehrfachen abfragen, bis hin zu änderungen an der platine. bitte benutze die suchfunktion, und gib taster ein, und wähle das asuro forum aus.

auf jeden fall ist es so, dass pollswitch, als eine der ersten funktionen eines programms ausgeführt, immer falsche werte gibt. durch die SerWrite funktion, die (in mikroprozessorzeitrechnung) ewig dauert, kann der kondensator C6 entladen werden und die funktion kann ewas bessere werte schaffen.

mal was anderes: tut die serwrite funktion überhaupt ihren dienst? nee wa?=)

albi1989
07.08.2007, 13:42
öhm ich bin doch im asuro Forum ??? oder meinst das im Zusammhang der Suchfunktion

Naja also ich hab da nun so einen taster test laufen lassen
der gibt 1 2 4 8 16 32 aus so solls auch glaub sein also von der Hardware alles ok (meiner Meinung nach zumindest)

Hab jetzt mit dem hyperterminal von Windows meine SerWrite funktion ausgelesen also in der zeit wo er färht bzw noch kein taster gedrückt ist
das aus
$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0 $0$0

wobei $ anscheint sone arte Leerzeichen sein soll

Wie dem auch sei also könnte schon eine sleep(216) also 3 ms ausrechen damit der kondensator sich entladen kann

Noch ne interessante Frage gibt es das oder ähnliche Probleme auch bei anderen Funktionen ?

radbruch
07.08.2007, 14:30
Hallo albi1989

Doch, du bist schon im asuro-Bereich. Herzlich willkommen.

Deine Tastenwerte sehen gut aus, allerdings vermutlich bei stehendem asuro. In deinem Programm könntest du anstatt (taste>0) testweise auch mal auf die einzelnen Taster prüfen (taste==1)... (taste==32) oder Gruppen wie (taste==33) oder (taste==12) bzw. (taste==7) oder (taste==56). Jeder Taster wird durch ein Bit im Ergebniss von PollSwitch() dargestellt. Mehrere Taster durch die Summe der Wertigkeiten der jeweiligen Bits. (*würgs* alles klar soweit?)

Eine Möglichkeit wäre die Mehrfachabfrage von PollSwitch() und der anschliessende Vergleich der Ergebnisse:

taste1=PollSwitch();
taste2=PollSwitch();

if ((taste1==taste2) && (taste1>0)) ....

Vielleicht bringt auch eine kurze Verzögerung nach Init() etwas:

Init();
Sleep(255);

Mit serWrite() kann man nur Zeichenketten an den PC senden, der zweite Parameter gibt die Länge der Zeichenkette an. Um Werte zu senden, must du eine andere Funktion verwenden:

PrintInt(taste);

Die Funktion ist aus der erweiterten asuro-Bibliothek und sieht so aus:


void PrintInt(int wert)
{ char text[6]=" ";
itoa(wert,text,10);
SerWrite(text,5);
}

Wenn du diesen Code vor int main() in dein Programm kopierst, kann du diese Funktion auch mit deiner aktuellen Bibliothek nutzen.


...gibt es das oder ähnliche Probleme auch bei anderen Funktionen?
Leider, oder zum Glück, gibt es ähnliche Probleme bei der Odometrie, bei den Liniensensoren und auch bei der Regelung der Motoren. Schliesslich wollen wir ja was lernen und nicht nur unterhalten werden.

Gruß

mic

harry3
07.08.2007, 20:28
Ich hab eine kleine Funktion geschrieben welche mir den PolSwitch Wert korrigiert(er dämpft im Grunde genommen die Schwankungen von PollSwitch):



unsigned char fkt_taster(void)
{
unsigned char taster=0;

taster=PollSwitch();

if(taster==PollSwitch() && taster!=0)
return taster;
else
return 0;
}



Eine einfachere Variante zu blinken ist folgende:


for(i=0;i<MAX;i++)
{
Msleep(500);
StatusLED(GREEN);
Msleep(500);
StatusLED(OFF);
}

damaltor
07.08.2007, 20:32
hilfts was? ist ein guter ansatz.

harry3
07.08.2007, 20:42
Ich schätze mal du verwendest nicht die asuro lib aus dem Netz, dann kannst du das Msleep und PrintInt wie in den letzten Beiträgen beschrieben nicht verwenden. Ich empfehle dir aber dringend die asuro lib runterzuladen.

Ich hab mir für einen anderen Prozessor mal eine Minimalstvariante von itoa geschrieben(um Speicherplatz zu sparen), beachte aber bitte dass sie nur 3 Stellen handeln kann sowie nur positive Zahlen(also ideal für unsigned char wie es der Rückgabewert von PollSwitch ist):



unsigned char *int_to_ascii(int punkte)
{
static unsigned char temp[4]={'\0','\0','\0', '\0'};
int n=0,hilfsvar=1;

for(n=3;n>0;n--)
{
temp[n-1]=(punkte%(hilfsvar*10)-punkte%hilfsvar)/hilfsvar+'0';
hilfsvar=hilfsvar*10;
}
hilfsvar=0;
for(n=0;n<3;n++)
{
if(temp[n]!='0')
hilfsvar=1;//1 wenn kein blanking mehr erforderlich

else if(temp[n]=='0' && hilfsvar==0)
temp[n]=' ';
}
return temp;
}



Somit kannst du dann auch ohne Asurolib schreiben:



SerWrite(int_to_ascii(PollSwitch()),4);




Grüße,
Harri

damaltor
07.08.2007, 23:44
itoa geht auch ohne erweiterte lib... nei mir sogar mit der cd version

izaseba
08.08.2007, 00:27
itoa geht auch ohne erweiterte lib
Eben, itoa ist ein Bestandteil der stdlib.h
Harry3, was ist jetzt Deine Funktion besser ?
Ist sie schneller?
Belegt sie weniger Flash ?
Habe jetzt keine Lust zu testen, aber die modulo operationen sehen nicht gerade "schnell" aus...

Gruß Sebastian

albi1989
08.08.2007, 12:10
Ihr seid göttlich :D geiles Forum !!!
Voll viel Information muss ich erst mal verkraften
Mit der Bibliothek meint ihr die asuro.h die ich da eingebunden habe ?
Wo bekommt man aktuelle erweiterte Library her ?
Wo ist der unterschied zwischen Sleep(); und Msleep(); außer dem größeren Datentypen ?
Danke für den code fürs blinken
hab das schon so mal ausprobiert aber mit sleep(); was meiner meinung nach auch gehn müsste hats da aber nicht (kann auch anderen grund gehabt haben) deswegen hab ich so lange was rum geschreiben bis es dann so ging :D


if ((taste1==taste2) && (taste1>0))

hab ich so änlich schon mal gesehn aber warum sollte taste1 ungleich taste2 sein ? oder dauert PollSwitch(); wieder so lange das sich das bis dahin geändert haben kann wegen dem Kondensator?

Oh Gott viele Fragen hab ich da naja ist ja ein Forum und dafür da :D
für die nächste könnt ich bestimmt die suchfunktion benutzen aber da ich ja schon so viel gefragt hab tuts die eine da auch nichts mehr ^^

wenn ich bei meinem programm immer noch so wie oben ein rad festhalte geht das blinken los wurde aber eig keines meiner taster angepackt und was dann noch komischer ist dann geht er erst bei 10 bis 15 mal blinken wieder los also nach jeden 5 mal ein ruck dann wieder blinken, wieso hab ich wie so oft kein plan :D
den effekt find ich sogar eig voll toll weil angenomm es verhackt sich nur ein rad oder der henkt einfahc nur iwo fest oder färht wogegen wo er nicht lang kommt und die taste sich abe nicht betätigen
aber ich mag sachen nicht die ich nicht versteh wieso das so ist :D

damaltor
08.08.2007, 12:59
ja. pollswitch dauert etwa 20 prozessortakte. in dieser zeit entlädt sich der kondensator c6, darum ist es ein anderes ergebnis.

mit Msleep kannst dulängere verzögerungen schaffen: die zahl hinter msleep bezeichnet millisekunden, und sie darf maximal 32000 sein.
Die Zahl hinter Sleep bezeichnet 1/72 millisekunden. Sleep(216) wartet also nur 3 millisekunden. die zahl darf nicht größer als 255 sein.

poste doch nochmal deinen aktuellen code, evtl finden wir was wegen dem ruckeln...

radbruch
08.08.2007, 13:11
Hallo


...aber warum sollte taste1 ungleich taste2 sein?

Weil die Funktion PollSwitch() aus diversen Gründen nicht immer den richtigen, also den der gedrückten Tasten entsprechenden, Wert zurückliefert.

Gründe sind z.B.:

- Falsche Widerstände oder zu große Toleranzen
- schlechte Kalibrierung der Taster in asuro.c
- zu schnelle Abfrage für C6 oder C7
- und die üblichen Montageprobleme wie "kalte" Lötstellen oder Brücken
- möglicherweise zu geringe Akkuspannung
- möglicherweise Störimpulse der Motoren

Gruß

mic

albi1989
08.08.2007, 15:37
achso :D
Das gut zu wissen dann muss ich ja die Splee(); funktion nicht mehr inne for schleife setzten und ausrechen wie lange ne sec ist :D

Ok das ruckel ist nu weg gegangen
also dank taste1==taste2 und ich hab die verzögerung von SerWrite(); durch sleep(); ersetzt ruckelt nur dann wenn einer der taster klempt glaub ich das das der grund ist weil geht nur weiter wenn ich die alle mal rßücke und wieder rauszieh aber selbst wenn einer gedrückt ist soll auf keine fall der motor anspringen also entweder volle fahrt oder garnix
und bei den reifen geht das blinken immer noch los wenn die reifen stoppen
hier noch mal der code

#include "asuro.h"
unsigned char taste1;
unsigned char taste2;
int main(void)
{
Init();
MotorDir(FWD,FWD);
while(1)
{
taste1=PollSwitch();
taste2=PollSwitch();
for(int i=0; i<3; i++)
{
Sleep(216);
}
if((taste1==taste2)&&(taste1>0))
{
MotorSpeed(0,0);
for(int i=0; i<3 ; i++)
{
StatusLED(RED);
for(int a=0;a<333;a++)
{
Sleep(217);
}
StatusLED(OFF);
for(int a=0;a<333;a++)
{
Sleep(217);
}
}
//wenden();
}else if((taste1==taste2)&&(taste1==0))
{
MotorSpeed(160,160);
}
}
return 0;
}
void wenden (void)
{
MotorDir(BREAK,RWD);
MotorSpeed(120,120);
for(int i=0 ; i<333; i++)
{
Sleep(217);
}
}



So und die azuro lib hab ich nun auch sag doch einer das die hier bei RoboterNetz so der Link ist :D
na klasse komm ich wieder voll nicht kla hab nu die exe installiert
C:\WinAVR\ASURO_src\AsuroLib ist das da richtig wo muss das rein ???
und was muss ich nun einbinden also inkluden damit ich die erweterten befehle benutzen kann und wo kann ich nachlesen welche es alle gibt ?

EDIT:
hab statt taste1==taste2 nu die Funktion benutzt weil sie beim flaschen wert(heißt ja so gut wie taster null) anfängt zu fahren und von daher muss das prog nicht zwei mal laufen bis er started

was mich noch wurmt ist das er einfach grünleuchted beim fahren das hab ich ihm aber net gesagt das er das machen soll :(

harry3
08.08.2007, 18:19
itoa geht auch ohne erweiterte lib
Eben, itoa ist ein Bestandteil der stdlib.h
Harry3, was ist jetzt Deine Funktion besser ?
Ist sie schneller?
Belegt sie weniger Flash ?
Habe jetzt keine Lust zu testen, aber die modulo operationen sehen nicht gerade "schnell" aus...

Gruß Sebastian

Mit asurolib hab ich Msleep gemeint, itoa ist natürlich stdlib.
Bei Asuro hab ich jetzt noch nicht auf die Größe geschaut, aber als ich für den A68k etwas programmiert habe konnte ich mit meiner int_to_ascii Funktion Speicherplatz gegenüber itoa sparen. Das war der Grund warum ich sie verwendet habe.
Geschwindigkeit hab ich nicht getestet weil sie bei solch kleinen Funktionen sowieso minimal ist.

Grüße,
Harri

damaltor
08.08.2007, 19:09
wie du die lib einbindest steht im entsprechenden thread und in der readme, musste mal nachsehen.

albi1989
08.08.2007, 20:33
Also unter dem setup steht das es fertig ist wenn nix abbricht hat den krims krams aber garnicht in das verzeichnis kopiert in dem mein WinAvr drin ist hoffe ma das linking funzt

in dem thread stand ich soll beim inkluden statt "" <> benutzen geht aber nicht :( beim kompelieren steht das er die Funktion Msleep(); nicht kennt

da stand noch was von make file ändern im moment versteh ich aber nur bahnhof naja vlt soltle ich mal nach draußen durch die gegend crusen und dann versuch ich es weiter wird man ja bekloppt bei -.- grrrrr *drüberärger

damaltor
08.08.2007, 21:48
beim inkluden: "" bedeutet das die inkludierte datei im gleichen verzeichnist ist
<> bedeutet dass die inkludierte datei im compilerverzeichnis ist.

albi1989
08.08.2007, 21:52
funzt beides nicht hab auch schon die make-lib.bat ausgefürht obwohl eig sinnfrei da ja in der exe angeblich alles gemacht wird also bitte sagt mir doch einfahc was ich machen soll ich raffs einfach grad voll nicht und iwie nervts schon langsam das das einfahc nicht hinhaun will -.-

radbruch
09.08.2007, 09:03
was mich noch wurmt ist das er einfach grünleuchted beim fahren das hab ich ihm aber net gesagt das er das machen soll

Etwa so hört die Funktion Init() in asuro.c auf:


FrontLED(OFF);
BackLED(ON,ON);
BackLED(OFF,OFF);
StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(0,0);


Gruß

mic

albi1989
09.08.2007, 12:21
Also hmmm dann änder ich das da halb :D
Aber danke für die Information wie gesagt bin ein totaler Anfänger. Naja noch
Also mit der asuro lib das hat geklappt naja teilweise ich muss die datei also meine test.c datei in dem Verzeichnis
C:\WinAVR\avr installiern
ich will aber eig meine geschiebenen datein in
C:\WinAVR\ASURO_src\FirstTry haben

bin mir eig schon sicher das sich das in der makefile ändern lassen müsste nur hab ich keine Ahnung wie :(

Sternthaler
14.08.2007, 02:21
Hallo zusammen.
Da dies ja nicht der erste Thread mit Hilferuf zur Installation und Inbetriebnahme der Asuro-LIB ist, habe ich mal einen eigenen Thread für eine 'hoffentlich komplette Übersicht' angelegt.
Ihr findet dies unter So wird die Asuro-LIB installiert und in Betrieb genommen (https://www.roboternetz.de/phpBB2/viewtopic.php?p=306481)

Vorsicht: es geht da bei 'Adam und Eva' los. ;-)

damaltor
14.08.2007, 16:58
sollte der evtl zu der lib im download-thread verlinkt werden? wenn ja, bitte bitte eine pm schicken, ich ändere das dann nach meinem urlaub.

radbruch
14.08.2007, 17:24
wenn ja, bitte bitte eine pm schicken
Ja!

Sternthaler
14.08.2007, 23:29
Hallo damaltor,
ich habe m.a.r.v.i.n. schon gebeten einen Link zu legen. (Der arme Kerl ist jetzt gerade aus dem Urlaub zurück, und du verläßt uns nun. :( )

damaltor
15.08.2007, 15:29
der thread ist abgeschlossen, damit nicht jeder was reinposten kann. allerdings werde ich den link sofort nach en ferien nachtragen.

mfg

zumi411
08.09.2007, 10:53
Hallo alle zusammen. Ich bin neu hier und hab mir jetz vor einer Weile auch einen Asuro zugelegt.Nur komme ich mit der Programmierung in C überhaupt nicht klar.

Ich hatte beabsichtigt, dass er am Anfang normal halbe Geschwindigkeit vorwärts fahren sollte mit grüner Status LED.
Bei einer Kollision an den linken 3 Tastsensoren soll er nach hinten links zurücksetzen,
bei Kollision an den Rechten nach Hinten rechts, bei roter StatusLED für ca. 2 Sekunden.
Wenn nach der Zeit keine Kollision bei den Tastern vorliegt, soll er wieder bei halber geschwindigkeit vorwärts fahren bei grüner LED, bis zur nächsten Kollision usw.
Ihr kennt ja diese "KollisionsKüchenputzroboter", ungefähr nach diesem prinzip.
Nur was soll man mit einem Roboter der nichts macht?

Ich wollte fragen ob mir nicht einer von euch dieses Programm erstellen kann und mir über e-mail zuschickt: s.zumbrock@t-online.de
Ihr würdet mich damit überglücklich machen!

farratt
08.09.2007, 14:06
Hallo Leute!
Ich hab mal ne Frage zu der oben erwähnten Funktion PrintInt.
Und zwar legt Ihr dort ein char-array der Länge 6 an. Meiner Meinung nach müsste es aber 7 heißen. Begründung:

int bedeutet nichts anderes als signed int. D. h. es handelt sich um eine 15bit-Zahl plus Vorzeichenbit. Die kleinste mögliche Zahl ist somit -(2^15)=-32768. Beachtet man das Minuszeichen, ist diese Zahl doch 6-stellig. Zusätzlich braucht man dann noch ein Byte Platz für das '\0'-Zeichen, dass die Funktion itoa anlegt. So kommt man auf 7 Byte. Demzufolge müsste es in der letzten Zeile auch SerWrite(text,6); heißen, oder?
Hoffentlich hab ich jetzt nicht totalen Müll geschrieben... [-o<

Gruß farratt

farratt
08.09.2007, 14:23
So! habs jetzt mal getestet:

Dieser Code (der von oben) funktioniert nicht:


void PrintInt(int wert)
{ char text[6]=" ";
itoa(wert,text,10);
SerWrite(text,5);
}


int main(void)
{
Init();
PrintInt(-32768);
while(1);
return 0;
}


Da gibt Asuro -3276 (also eine Ziffer zu wenig) aus.

Dieser Code (von mir) funktioniert:


void PrintInt(int wert)
{ char text[7]={'\0'};
itoa(wert,text,10);
SerWrite(text,6);
}


int main(void)
{
Init();
PrintInt(-32768);
while(1);
return 0;
}


Gruß farratt

damaltor
08.09.2007, 15:40
fertige programme gibts hier nur zum selbst-raussuchen. überlege dir, wie man das problem anpacken könnte, und macche dir einen ungefähren plan. dann melde dich mit den ersten versuchen, und wir werden dir helfen. das ziel eines forums ist nicht, andere leute programme schreiben zu lassen, die man selbst dann nicht versteht.

farratt
08.09.2007, 15:49
@damaltor: Meinst du jetzt mich?

Wenn ja: Ich versteh nich genau was du meinst.

Wenn nein: Ist die Funktion PrintInt aus der Lib? Wenn ja, dann sollte sie korrigiert werden, denn meiner Meinung nach enhält sie Bugs.

harry3
08.09.2007, 15:56
@damaltor: Meinst du jetzt mich?

Wenn ja: Ich versteh nich genau was du meinst.

Wenn nein: Ist die Funktion PrintInt aus der Lib? Wenn ja, dann sollte sie korrigiert werden, denn meiner Meinung nach enhält sie Bugs.

Du hast schon Recht mit dem Array.

Ich hab in meiner Asuro Lib mal die Funktion rausgesucht, und dort steht es richtig mit 7:


void PrintInt (
int wert)
{
char text [7]; // "-12345"

itoa (wert, text, 10);
SerPrint (text);
}


Damaltor hat übrigens nicht dich gemeint.

damaltor
08.09.2007, 15:58
eigentlich meinte ich albi1989, hab aber eben gemerkt dass der thread schon etwas älter ist ;)

printint ist aus der neuen lib, die hier im rn entstanden ist. sie funktioniert einwandfrei, was für fehler hast du denn gefunden?

farratt
08.09.2007, 16:00
Oben hat jemand eine Funktion PrintInt aus der Lib zitiert und diese Version enthielt Fehler (siehe mein Beiträge etwas weiter oben). Aber harry3 meinte, dass die von mir genannten Fehler in der aktuellen Lib nicht mehr vorkommen, von daher hat sichs erledigt.

harry3
08.09.2007, 16:02
printint ist aus der neuen lib, die hier im rn entstanden ist. sie funktioniert einwandfrei, was für fehler hast du denn gefunden?

radbruch hat die Funktion falsch gepostet. In der Asurolib selbst ist sie allerdings richtig(siehe print.c)

zumi411
08.09.2007, 16:53
also ich blick da jetz mit hilfe derAsuro-Lib langsam durch! nur egal was ich programmiere, immer zeigt er beim durchlaufen mit der makedatei den selben fehler an:
"test.c:15: error: `for' loop initial declaration used outside C99 mode
test.c:21: error: `for' loop initial declaration used outside C99 mode
test.c:29: error: `for' loop initial declaration used outside C99 mode"

könnte mir einer von euch helfen wie ich diese fehler weg bekomme?

harry3
08.09.2007, 17:13
also ich blick da jetz mit hilfe derAsuro-Lib langsam durch! nur egal was ich programmiere, immer zeigt er beim durchlaufen mit der makedatei den selben fehler an:
"test.c:15: error: `for' loop initial declaration used outside C99 mode
test.c:21: error: `for' loop initial declaration used outside C99 mode
test.c:29: error: `for' loop initial declaration used outside C99 mode"

könnte mir einer von euch helfen wie ich diese fehler weg bekomme?


Bin mir nicht 100%ig sicher, aber ich denke es liegt daran:

Früher musste man bei C die Variablen immer am Blockanfang definieren, also z.B. mussten in der main Funktion alle Variablen am Anfang von main definiert werden, und erst dann konnte man weitermachen.
Durch eine Erneuerung des C Standards war es dann möglich, Variablen dort zu definieren, wo man sie braucht.

Ich empfehle aber den alten Weg, also alle Variablen am Anfang zu definieren.

Konkret heißt das:
Du hast wohl geschrieben:
for(int n=0;n<MAX;n++)

Du hast also n erst in der for Schleife definiert!
Definiere n am Anfang von main und das Problem sollte verschwunden sein!

zumi411
08.09.2007, 20:16
also ich habe gar keine for Angabe. Hier ist die komplette datei.Villeicht kannst du mir ja weiter helfen.:
00001 /************************************************** *************************
00002 *
00003 * File Name: kollisiontest.c
00004 * Project : ASURO
00005 *
00006 * Description: Kollisionstest mit Hilfe der Tastensensoren
00007 *
00008 * Ver. Date Author Comments
00009 * ------- ---------- ----------------- ------------------------------
00010 * 1.0 10.09.2005 m.a.r.v.i.n initial build
00011 * 1.1 08.01.2006 m.a.r.v.i.n 2x PollSwitch + Vergleich,
00012 * anstelle 8x PollSwitch
00013 *
00014 * benoetigt die modifizierte Asuro Bibliothek 'asuro.c'
00015 * von waste, stochri und andun. Zu finden bei www.roboternetz.de
00016 */
00017 /************************************************** *************************
00018 * *
00019 * This program is free software; you can redistribute it and/or modify *
00020 * it under the terms of the GNU General Public License as published by *
00021 * the Free Software Foundation; either version 2 of the License, or *
00022 * any later version. *
00023 ************************************************** *************************/
00024
00025 #include "asuro.h"
00026
00027 #define FULL_L 250
00028 #define FULL_R 220
00029
00030 /* Motor vorwärts */
00031 void MotorFwd(void)
00032 {
00033 MotorDir(FWD,FWD);
00034 MotorSpeed(FULL_L,FULL_R);
00035 }
00036
00037 /* Motor rückwärts */
00038 void MotorRwd(void)
00039 {
00040 MotorDir(RWD,RWD);
00041 MotorSpeed(FULL_L,FULL_R);
00042 }
00043
00044 /* Motor rückwärts Links */
00045 void MotorRwdL(void)
00046 {
00047 MotorDir(RWD,RWD);
00048 MotorSpeed(FULL_L,0);
00049 }
00050
00051 /* Motor rückwärts Rechts */
00052 void MotorRwdR(void)
00053 {
00054 MotorDir(RWD,RWD);
00055 MotorSpeed(0, FULL_R);
00056 }
00057
00058 /* Motor stop */
00059 void MotorStop(void)
00060 {
00061 MotorSpeed(0,0);
00062 }
00063
00064 int main(void)
00065 {
00066 unsigned char t1, t2;
00067
00068 Init();
00069 while (1)
00070 {
00071 t1 = PollSwitch();
00072 t2 = PollSwitch();
00073 if (t1 == 0 && t2 == 0) /* keine Taste */
00074 {
00075 MotorFwd(); /* vorwärts fahren */
00076 FrontLED(ON);
00077 BackLED(OFF,OFF);
00078 }
00079 else if (t1 && t2 && t1 == t2)
00080 {
00081 MotorStop();
00082 if (t1 & 0x07) /* Tasten links gedrückt? */
00083 {
00084 MotorRwdL(); /* Rückwärtskurve links fahren */
00085 FrontLED(OFF);
00086 BackLED(ON,OFF);
00087 }
00088 if (t1 & 0x38) /* Tasten rechts gedrückt? */
00089 {
00090 MotorRwdR(); /* Rückwärtskurve rechts fahren */
00091 FrontLED(OFF);
00092 BackLED(OFF,ON);
00093 }
00094 Msleep(1000); /* 1 Sekunde fahren */
00095 }
00096 }
00097 return 0;
00098 }
00099

zumi411
09.09.2007, 13:05
das mit dem fehler hat sich erledigt: mein Programmers Notepad spinnt nen bischen hab jetz die .hex Datei nur will mir das flashprogramm die datei nicht auf den Asuro senden da steht immer:
Failed to Open!
Already in use!?!
Aber ich habe die datei doch garnicht geöffnet!

zumi411
09.09.2007, 13:32
das mit dem Flashen hat sich auch erledigt. nur kann mir mal einer sagen was mit meinem Programmers Notepad los ist ?
bei der gleichen Datei wie oben zeigt er jetz nicht mehr die "alten" Fehler an sondern die neuen nämlich:
test.c:1: error: parse error before numeric constant
test.c:25: error: syntax error at '#' token
test.c:27: error: syntax error at '#' token
test.c:28:1: invalid digit "8" in octal constant
test.c:28: error: syntax error at '#' token
test.c:29:1: invalid digit "9" in octal constant
test.c:38:1: invalid digit "8" in octal constant
test.c:39:1: invalid digit "9" in octal constant
test.c:48:1: invalid digit "8" in octal constant
test.c:49:1: invalid digit "9" in octal constant
test.c:58:1: invalid digit "8" in octal constant
test.c:59:1: invalid digit "9" in octal constant
test.c:68:1: invalid digit "8" in octal constant
test.c:69:1: invalid digit "9" in octal constant
test.c:78:1: invalid digit "8" in octal constant
test.c:79:1: invalid digit "9" in octal constant
test.c:80:1: invalid digit "8" in octal constant
test.c:81:1: invalid digit "8" in octal constant
test.c:82:1: invalid digit "8" in octal constant
test.c:83:1: invalid digit "8" in octal constant
test.c:84:1: invalid digit "8" in octal constant
test.c:85:1: invalid digit "8" in octal constant
test.c:86:1: invalid digit "8" in octal constant
test.c:87:1: invalid digit "8" in octal constant
test.c:88:1: invalid digit "8" in octal constant
test.c:89:1: invalid digit "9" in octal constant
test.c:90:1: invalid digit "9" in octal constant
test.c:91:1: invalid digit "9" in octal constant
test.c:92:1: invalid digit "9" in octal constant
test.c:93:1: invalid digit "9" in octal constant
test.c:94:1: invalid digit "9" in octal constant
test.c:95:1: invalid digit "9" in octal constant
test.c:96:1: invalid digit "9" in octal constant
test.c:97:1: invalid digit "9" in octal constant
test.c:98:1: invalid digit "9" in octal constant
test.c:99:1: invalid digit "9" in octal constant
wa isn das fürn mist programm!

harry3
09.09.2007, 18:26
Stehen die Zeilennummern auch im Programm?
Wenn ja weg damit!

Poste deinen Code bitte mit dem Code Tag und ohne Zeilennummern, das erleichtert für uns das Anschauen um einiges!

Wenn du mit Programmers Notepad nicht zufrieden bist so kannst du z.B. auch AVR Studio verwenden. Gibts gratis im WWW.

zumi411
10.09.2007, 16:00
ja schon mal danke wegen den zeilen aber was meinst du mitCode Tag?

coCo
10.09.2007, 16:47
Hi,
er meint, dass du das hier benutzen sollst um solchen code zu posten:
hier den code reinschreiben (natürlich ohne das *). Das sieht dann so aus:


hier den code reinschreiben

MfG

zumi411
10.09.2007, 17:23
ne is ok hat sich erledigt. hab es entlich hinbekommen! hat zwar noch manchmal schwierigkeiten beim wenden aber sonst funktioniert er jetz. man ist das ding geil!
Also noch mal vielen dank für eure hilfe!
mfg

harry3
10.09.2007, 19:38
Na so eine Euphorie hört man ja gerne :mrgreen:

Solltest du dich mit C näher beschäftigen möchten so kann ich dieses Tutorial empfehlen: Einfach geschrieben und doch sehr umfassend:
http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/cyris/

Viel Spaß noch!

Sternthaler
12.09.2007, 00:54
@damaltor
Wäre der Link von harry3 nicht eine sinnvolle Ergänzung für deinen Die wichtigsten Dateien, Quellcodes, Downloads (https://www.roboternetz.de/phpBB2/viewtopic.php?t=30004)-Beitrag? Das Tutorial finde ich recht gut.