Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO neuling (noob) hat mal Programiert
Hallo
ich habe zwei Programme geschrieben, und da mein ASURO, dank Conrad noch nicht Fertig ist weis ich nicht ob es geht, deshalb wollte ich euch fragen ob da überhaubt gehten kann.
1 Programm:
#include "asuro.h"
int main(void)
{
Init(1);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN)
while (PollSwich(1)==0){
Motorspeed(0,0);
SatusLED(Red);
MotorDir(RWD,BREAK);
StatusLED(GREEN)
MotorDir(FWD,FWD);
MotroSpeed(240,240);
While (PollSwich(1)==0)
while(1)
}
2 Programm:
#include "asuro.h"
int main(void){
Init();
MotorDir(FWD,FWD);
MotorSpeed (200,200);
sleep(216)*1750;
MotorSpeed (200,100);
sleep(216);
Motordir (FWD,BREAk);
Sleep(216);
Motordir(Break,Break);
while(1);
}
Gruß
Jonas Weber
Ps. nicht auslachen wenn die komplett falsch ist *g*
Deine Asuro ist vieleicht noch nicht fertig aber du kannst den Programmers Notepad/make/compiler functionen schon ausprobieren. Nur kannst du nicht den HEX-Datei flashen auf deinen Asuro.
Da sind sicher schon einiger Fehler in deine Programmen wovon den Compiler nichts machen kann. (Schreibfehler auch , aber auslachen, nee... nie! [-X ) Ich kann sie anzeigen fur dich, aber es wurde vielleicht ein besser Lehrmoment sein den Compiler-Fehlerliste anzuschauen und davon zu lernen. Weil den Compiler genau sagt wenn er etwas nicht versteht. (nur in etwas cryptische Sprache) Wie du das compilieren kann steht in den Asuro Anleitung. Leider nicht mit einer Tutorial uber das finden und beheben einer Fehler. Postet bitte hier den Error-liste im Programmers Notepad nach du das Compiliert hat. (nur die Tekst hier reinfugen, keine Monitor Abbildung machen)
Bongo1st
25.05.2009, 20:34
Hey
Habe noch ein einige Fragen zum Programmieren,…
Ich bin mir nicht sicher was die einzelnen Befehle bedeuten.
#include „asuro.h“ //einbinden einer anderen Datei
int main (void){ //beginnen des Hauptprogrammes
init() //Prozessor zurücksetzten? Aber wieso?
StatusLED(RED); //StatusLED auf rot stellen
while(1); //Endlosschleife, weswegen, LED schaltet sich nicht aus, bis ich den Befehl gebe?
return 0; // Beenden des Prozesses? Wieso?
} //Beenden des MainTasks
Ist dies Korrekt, was ich annehme?
Wie kann ich diese Codes In ein eigenes Fenster eingeben?
Also
Programm1:
C:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
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
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c -o asuro.o
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm
avr-objcopy -O ihex -R .eeprom test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex test.elf test.eep
avr-objdump -h -S test.elf > test.lss
Size after:
C:\Users\Jonas\AppData\Local\Temp\make60966.sh: /c/WinAVR/bin/avr-size: Invalid argument
make: *** [sizeafter] Error 126
> Process Exit Code: 2
Programm 2:
C:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
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
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c -o asuro.o
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm
avr-objcopy -O ihex -R .eeprom test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex test.elf test.eep
avr-objdump -h -S test.elf > test.lss
Size after:
C:\Users\Jonas\AppData\Local\Temp\make42206.sh: /c/WinAVR/bin/avr-size: Invalid argument
make: *** [sizeafter] Error 126
> Process Exit Code: 2
ich hoffe ihr könnt mir helfen
Gruß Jonas Weber
ps. könnte mir vllt jemand ein fertiges programm geben, da ich morgen den ASURO mal fahren sehen will *g* (so eins wo, wenn der ASURO irgend wo gegen fährt dann automatisch sich dreht und dann weiter fährt)
wär toll :P =D>
radbruch
25.05.2009, 21:15
Hallo
Init() initialisiert den Mega8, z.b. die Timer, PWM, ADC... und setzt Startwerte wie StatusLED oder MotorDir und löscht die LEDs.
Normalerweise springt ein Programm am Ende zurück zum aufrufenden Programm (und nimmt einen Übergabewert mit return mit). Da beim asuro aber kein aufrufendes Programm existiert würde man ins Nirwana springen. Genau dies verhindert die finale Endlosschleife while(1);
Gruß
mic
Die Funktion Init():
/* Init function Processor will be initalized to work correctly */
void Init (void)
{
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
// prepare RS232
UCSRA = 0x00;
UCSRB = 0x00;
UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
UBRRL = 0xCF; // 2400bps @ 8.00MHz
// I/O Ports
DDRB = IRTX | LEFT_DIR | PWM | GREEN_LED;
DDRD = RIGHT_DIR | FRONT_LED | ODOMETRIE_LED | RED_LED;
// for PWM (8-Bit PWM) on OC1A & OC1B
TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
// tmr1 running on MCU clock/8
TCCR1B = (1 << CS11);
// A/D Conversion
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
ODOMETRIE_LED_OFF;
FrontLED(OFF);
BackLED(ON,ON);
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,0);
sei();
}
radbruch danke aber ich vertseh das net richtig (bin noch noob *g*)
könntest du meine beiden programme so ändern das ich funktonieren :P
gruß Jonas Weber
versteh ich das richtig "könntest du meine beiden programme so ändern das ich funktonieren Razz "
du oder der Asuro???
hääääääääääää
*g*
raffs grad net so richtig
radbruch
25.05.2009, 22:01
Hallo
Dein Makefile scheint nicht zu funktionieren, aber damit kenne ich mich leider nicht aus und kann deshalb nicht helfen. Wenn alles klappt erhält man eine Ausgabe ähnlich denen im Anhang.
Prog1:
5: Init(1); zuviele Argumente (die 1 muss weg)
10: Semikolon ; nach StatusLED(GREEN) in Zeile 9 fehlt
10: PollSwich(1) falsch geschrieben und zuviele Argumente (die 1 muss weg)
12: SatusLED falsch geschrieben
15: Semikolon fehlt am Ende von Zeile 14
16: MotroSpeed falsch geschrieben, dadurch auch Fehler in 17 (while)
17: PollSwich(1) falsch geschrieben und zuviele Argumente (die 1 muss weg)
Prog2:
6: sleep falsch geschrieben (großklein) und *1750 ist Quatsch
9: Motordir und BREAk falsch geschrieben (großklein)
11: Break falsch geschrieben (großklein)
Ganz ehrlich, es ist eine Frechheit solch hingeschluderte Programme einzureichen. Das ist mit "ASURO neuling (noob)"-Sprüchen nicht zu entschuldigen. Bitte mehr anstrengen und in code-Tags posten.
Gruß
mic
[Edit]Auch ich hatte als Kind eine enorme Rechtschreibschwäche, trotzdem war Mathe mein Lieblingsfach und programmieren konnte ich auch. Da gibt es keinen Freiraum für eigene "Interpretationen", da muss man Buchstabe für Buchstabe und Ziffer für Ziffer kopieren. Und wenn's dann gar nicht klappt kann man die Befehle direkt aus der Anleitung kopieren und im Editor einfügen. Verschreiben ist dann unmöglich.
hallo danke ich vertsh nicht was an der make file ist bei mir sieht das komplett anders aus
Gruß Jonas
Cele93,
Auf deine compiler logs kann ich auch nicht ein gutes antwort geben. Das sieht aus den make program kann nicht richtig angerufen werden. Wie radbruch schon bemerkt hat. Nur ein wildes idee. Hast du vieleicht Vista auf deinen rechner? Möglich geht diesen alte WinAVR version nicht mit das moderne Vista. In Windows XP solte das ohne problemen gehen. ..... Meistens ;)
Der unteren Liste in den Abblidungen von Radbruch sind eigentlich was ich bedeuted habe.
@Bongo1
#include „asuro.h“; //einbinden einer anderen Datei
int main (void){ //beginnen des Hauptprogrammes
init(); //Prozessor zurücksetzten? Aber wieso?
StatusLED(RED); //StatusLED auf rot stellen
while(1); //Endlosschleife, weswegen, LED schaltet sich nicht aus, bis ich den Befehl gebe?
return 0; // Beenden des Prozesses? Wieso?
} //Beenden des MainTasksDie hochkommas sind nicht die richtigen. Nur diesen sind erlaubt: " " Gleich wie Radbruch.
radbruch
26.05.2009, 00:17
Hallo
Das sieht anders aus weil ich KamAVR als Ersatz für das PN verwende. Infos zu den Makefiles und einen kleinen C-Einsteigerkurs findet man in der Anleitung des asuro. Das Lesen der Anleitung kann ich nur empfehlen :)
Gruß
mic
ich nutze vista ich werde es einfach mal auf meinem xp versuchen.
ich habe mir schon die anleitung durch gelsen und einige dinge sind echt logisch aber bei widerun anderen vesteh ich nur Bahnhof, somit kommt auch so ein murgs raus *g*.
eins was ich nicht versteh ist, wie ich eine Zeitangabe reinprogramiere.
Beispiel: Asuro fährt gegen eine Wand; er bleibt stehen, dann soll ein wenig Ruckwärts, aber wo her weis der ASURO wie lang?? danach soll eine 90 Grad drehung machen, jetzt weis er wieder nicht wie lange oder??
ich hoffe ihr könnt mir helfen *g* (fast hoffungsloser fall)
Gruß Jonas Weber
ich habe mir jetzt nochmal alles durchgelesen und Notepad auf einem Xp Rechner Programiert. Desweiteren habe ich mir eine neuere Version von Notepad runtergeladen. Die Rechtschreibfehler und ähnliches habe ich entfernt, aber jetzt kommen immeer noch so komische sachen. Ich mal ein Scrennshot davon gemacht. Ich hoffe ihr könnt es mal anschauen *g*
http://www.bilder-space.de/show.php?file=26.05He2YoTykz2RoKqq.JPG
Gruß Jonas Weber
deine includes haben noch "altes" format, das meckert er an, aber es geht so.
bei der methode "serwrite" verwürfelst du signed mit unsigned variablen, das bemeckert er nur aber es ist kein fehler ... das übersetzen hat doch geklappt, unten steht "errors none"
Ich habe eines neues Programm geschreiben Fehler hat es keine , aber ich würde schon gern mal wissen was der ASURO so mit Programm macht. Könnte Jemand vllt dieses Programm auf sein ASURO spielen und mir dann sagen was passiert ist wär echt geil!!
code
#include "asuro.h"
int main(void)
{
Init();
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(GREEN);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}
{ MotorDir(RWD,RWD);
MotorSpeed(100,100);
BackLED(ON,ON);
}
{ MotorDir(BREAK,RWD);
MotorSpeed(0,150);
BackLED(ON,ON);
FrontLED(ON);
}
{
MotorDir(FWD,FWD),
MotorSpeed(150,150);
}
}
return 0;
}
/code
Gruß Jonas Weber
Ps. wie kann man den Quellentext in so ein kleines kästchen machen (hier im Forum)
wie kann man eingeben wie lang der ASURO etwas machen soll??
ich überleg mir schon die ganze Zeit wie das gehen soll, denn ASURO weis doch gar nicht wie lange der die Aktion ausführen soll.
Gruß
Jonas Weber
@cele93
zunächst ein paar kleinigkeiten, benutz bitte den editbutton wenn dein letzter post noch nciht beantwortet wurde, doppelposts sehen hässlich aus, ausserdem schreib mal vor deinen code [ c o d e] und dahinter [ / c o d e ] natürlich ohne die leerzeichen drinne, dann wirds lesbarer, editier am besten den beitrag gleich
iss nich bös gemeint aber es nimmt überhand
zu dem programm ... macht iwie keinen sinn, sieht so aus, als hätte man ein programm mit switch case blöcken hergenommen und zeilen rausgelöscht
der asuro sollte fahren bis ein taster anschlägt (ist nicht entprellt, also wird er gleich beim einschalten schon abbrechen) und dann in einer irrwitzig schnellen abfolge
1. bremsen
2. rückwärts fahren
3. nach links(?) drehen
4. und wieder gas geben
5. ins return 0 reinlaufen (was bei mikrokontrollern ein "verbot" ist)
zwischen den schritten wird kein augenzwinkern zeit sein, der ausro wird also rein nach augenmaß schnurstracks gas geben in die wand knallen und vielleicht kaputt gehen
was muss ich dann machen damit es geht ich verzweifle.
Gruß Jonas Weber
ich revidier meine aussage, er rennt NICHT ins return ... editier bitte den text, da kann man sich nur verlesen!!! sieht ja grauenhaft aus
im prinzip musst du ncihts weiter machen, als pausen einzubauen ...
wenn der text vernünftig eingerückt ist (nach jeder geöffneten geshweiften klammer den text um ein tab nach rechts verschieben, nach jeder gerschlossenen wieder ein tab nach links) erkennst du die einzelnen abschnitte, in jedem abschnitt bestimmst du die fahrrichtung für beide motoren und die geschwindigkeit, wenn du dir jetzt immer die fahrrichtung vorstellst, erkennst was er in welchem block macht und musst nurnoch entsprechend pausen dazwischen machen ... ausserdem muss die geschlossene geschweifte klammer direkt nach dem " else " vor das "return 0;" verschoben werden
und wie mach ich das mit den Pausen.
Noch ne frage wo her weis der ASuro wie lange er etwas machen soll, da gibs doch sicherlich ein befehl oder??
Gruß Jonas Weber
Ps. ich werde es editieren
und wie mach ich das mit den Pausen.
Noch ne frage wo her weis der ASuro wie lange er etwas machen soll, da gibs doch sicherlich ein befehl oder??
Gruß Jonas Weber
Ps. ich werde es editieren
/edit: bekomm das mit dem editieren nicht hin. hab deshalb ein scrennshot gemacht, wo es besser aussieht:
http://imagesup.de/picture.php?code=lpqb2yorcnc42axfjnp4
:-s
öhm ne pause einzubauen gibt es viel möglichkeiten, leider hab cih mich zu lang mit dem asuro net beschäftigt als das ich das jetzt wüsste, ich würd mal in der anleitung schauen an deiner stelle, vielleicht kann dir da wer anders kurz aushelfen
wie gesagt, die geschweifte klammen nach dem else, nach dem StatusLED(RED) muss hinter die eingeschobenen blöcke ! damit die blöcke im else zweig ausgeführt werden und nciht permanent
edit hab ich schon gefunden plus rutsch das immer nach links. kp warum.
hinter welche blöcke das vertsh ich noch nicht so richtig.
Gruß Jonas Weber
ps. wie fehlenden wiederstände sind soeben bei mir eingetroffen. ich werde ihn dann mal voll fertig machen.
ach noch ne frage: kann man de halben tischtennisball auch mit sekundenkleber anbringen??
Noch ne frage wo her weis der ASuro wie lange er etwas machen soll, da gibs doch sicherlich ein befehl oder??Den Funktion:
Sleep(anzahl_von_72kHz_perioden);
steht auch im anleitung beschrieben unter 9.2.5. Den Anzahl von 72KHz Perioden darf leider nicht großer sein als 255. Und das ist gleich wie 3.5 milisekunden. Fur ein langere warte Zeit muß man diesen Sleep komando wiederholen in einer for-schleife. (9.1.5 in dem anleitung)
sekundenkleber eignet sich nicht, das ist ein kontaktkleber! also möglichst fläche auf fläche, da du nur kante auf fläche klebst, sollte es schon heißkleber oder so universalbkleber sein
Den Tischtennisball am platine kleben wurde ich auch nicht empfehlen. Ich habe ein 25mm lange M3 bolze an dem halbe Tischtennisball geklebt mit heizkleber und dan mit muttern in das loch hinter dem Atmega8 montiert. Das geht perfekt und ist leicht demontierbar. Aber den heizklebberei in den Tischtennisball habe ich seit einiger monate nochmahls versterken mussen mit sekundenkleber. Das wird nun sicher fest bleiben.
Bongo1st
26.05.2009, 20:54
Ich habe nun auch ein erstes Programm geschrieben, jedoch habe ich eine Frage zur doppelten Abfrage der PollSwitch Funktion. Kann ich dies mit || ,, && oder ++ bewältigen?
Mein Problem die Störgeräusche der Asuro Motoren.
Hier noch das Programm:
#include "asuro.h"
//Tasten
#define K6 PollSwitch()==1 //Taste 6
#define K5 PollSwitch()==2 //Taste 5
#define K4 PollSwitch()==4 //Taste 4
#define K3 PollSwitch()==8 //Taste 3
#define K2 PollSwitch()==16 //Taste 2
#define K1 PollSwitch()==32 //Taste 1
//Tasten Kombinationen
#define K65 PollSwitch()==3 //Taste 6+5
#define K54 PollSwitch()==6 //Taste 5+4
#define K43 PollSwitch()==12 //Taste 4+3
#define K32 PollSwitch()==24 //Taste 3+2
#define K21 PollSwitch()==48 //Taste 2+1
#define K52 PollSwitch()==18 //Taste 5+2
#define K5432 PollSwitch()==30 //Taste 5+4+3+2
//Warten
#define WAIT1 for (i=0; i<1000; i++) {Sleep(72);} //1 Sekunde
#define WAIT2 for (i=0; i<400; i++) {Sleep(72);} //0.5 Sekunde
//Fahrten
#define VORWERTS StatusLED(GREEN); BackLED(ON,ON); MotorDir(FWD,FWD); MotorSpeed(124,120);
#define LINKS StatusLED(YELLOW); BackLED(OFF,ON); MotorDir(RWD,RWD); MotorSpeed(124,120); WAIT1; MotorDir (FWD,RWD); WAIT2; MotorSpeed(0,0); WAIT1;
#define RECHTS StatusLED(RED); BackLED(ON,OFF); MotorDir(RWD,RWD); MotorSpeed(124,120); WAIT1; MotorDir (RWD,FWD); WAIT2; MotorSpeed(0,0); WAIT1;
int main(void)
{
unsigned int i;
Init();
StatusLED(GREEN);
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(124,120);
while (1) {
if (K6)
{RECHTS}
else if (K5)
{RECHTS}
else if (K4)
{RECHTS}
else if (K3)
{LINKS}
else if (K2)
{LINKS}
else if (K1)
{LINKS}
else {VORWERTS}
}
}
radbruch
26.05.2009, 22:14
Hallo
Ich hoffe du verlierst nicht den Überblick bei den vielen #defines ;)
Auf den ersten Blick scheint if (k6 && k6)... eine Lösung für die Mehrfachabfrage zu sein. Bei genauerer Betrachtung erkennt man aber, dass dies wohl eine Sackgasse ist. Durch die if..else..else-Schachtelung hat man pro Durchlauf nur eine Chance die Tasten richtig zu erkennen. Außerdem kosten die vielen PollSwitch()-Aufrufe richtig viel Zeit. Besser wäre wohl ein solcher Ansatz:
#include "asuro.h"
#define k6 taste==1
#define k5 taste==2
#define k65 taste==3
char t1, t2, taste;
int main(void)
{
Init();
MotorSpeed(150, 150); // Zum Testen asuro in der Hand halten!
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1 && (t1==t2)) // Taste gedrückt und zweimal die selbe Taste erkannt?
{
taste=t1; // Dann überprüfen welche Taste es ist
if(k6) StatusLED(RED);
else if(k5) StatusLED(YELLOW);
else if(k65) StatusLED(GREEN);
}
else StatusLED(OFF); // Keine oder ungültige Taste
}
return(0);
}
(nicht getestet!)
Den TT-Ball habe ich mit Heißkleber befestigt. Drei Tropfen auf die Schnittkante und mittig auf die Platine geklebt hält ewig und läßt sich bei Bedarf rückstandsfrei entfernen.
Gruß
mic
Auserdem das, wurde seiner VORWERTS, LINKS und RECHTS defines nicht besser mit funktionen gemacht? Weil die #define nur tekst erganzungen sein vordem das eigentliche compilation prozess anfangt.
Bongo1st
27.05.2009, 07:56
Leider sind das die Befehle, die ich bis jetzt kenne und weis wie anwenden.
Den char Befehl kenne ich nicht und weis auch nicht was er bewirkt.
Wen ich das Programm durchsehe, habe ich einige Fragen.
Wo werden die k5,k6 und k65 definiert was sie sind? In der asuro.h?
t1 und t2= PollSwitch(); wieso benötigen diese keine werte?
Hoffe es sind nicht allzu einfache Fragen. :-#
Den char Befehl kenne ich nicht und weis auch nicht was er bewirkt.
char ist kein befehl, sondern eine deklaration einer variable vom TYP character (8bit groß)
was meinst du mit "benötigt keine werte" ???
PollSwitch() ist eine funktion die einen wert zurückliefert, der über das gleichheitszeichen den variablen t1 und t2 zugewiesen wird!
die defines für k5 und k6 stehen doch oben unter dem #include
t1 und t2 sind im übrigen variablen, d.h. zur laufzeit des programms können sie viele interschiedliche werte annehmen ...
mit deinen defines für k6 usw. erzeugst du eine temporäre variabel, du rufst die funktion pollswitch auf, die funktion liefert einen wert zurück, der prozessor merkt sich den wert in einer temporären variable und vergleicht dann diese variable mit der zahl, die du hinter dem vergleich geschrieben hast ... deine lösung ist zu aufwändig, da immer wieder die funktion pollswitch benutz wird, radbruchs lösung hingegen ruft den wert ab, speichert ihn in einer definierten variable und vergleicht den wert der variable mit dem wert der im define steht
#define wird vom so genannten pre-compiler verarbeitet, bevor aus deinem programm ein maschienencode für den asuro wird, geht er über den gesamten text, sucht nach der zeichenkette "k6" zum beispiel und ersetzt diese durch die zeichenkette "PollSwitch()==1" in deinem beispiel
hallo Bongo1st
zu deinen Fragen:
k5, k6, k65 werden am anfang definiert:
#define k6 taste==1
#define k5 taste==2
#define k65 taste==3
ähnlich wie bei dir
char ist ein datentyp, genauso wie int (unsigned int), float,... aber ich glaube das steht sogar in der anleitung
char besteht aus 8 bit, kann also zahlen von 0-255 speicher.
das genügt in diesem fall, da die funktion PollSwitch() als rückgabetyp auch char hat.
ich hoffe, das beantwortet deine fragen, bei der letzten weiß ich jedoch nicht genau was du meinst
#define wird vom so genannten pre-compiler verarbeitet, bevor aus deinem programm ein maschienencode für den asuro wird, geht er über den gesamten text, sucht nach der zeichenkette "k6" zum beispiel und ersetzt diese durch die zeichenkette "PollSwitch()==1" in deinem beispielGenau, das meinte ich.
So. Hab auch mal ne Frage hierzu.
Hier mein Code (Asuro kann hierbei halt noch ne Vierteldrehung, wenn ein äußerer Taster gedrückt wird, das ist das RECHTS2 bzw. LINKS2, sonst isses ziemlich gleich, Tasterkombinationen finde ich erstmal überflüssig, da das meiner Meinung nach sehr sehr selten zustandekommt):
#include "asuro.h"
#define k6 taste==1
#define k5 taste==2
#define k4 taste==4
#define k3 taste==8
#define k2 taste==16
#define k1 taste==32
#define WARTEN1 for (i=0; i<500; i++) {Sleep(72);} //warten
#define WARTEN2 for (i=0; i<250; i++) {Sleep(72);} //warten
#define WARTEN3 for (i=0; i<125; i++) {Sleep(72);} //warten
#define VORWERTS BackLED(OFF,OFF); StatusLED(GREEN); MotorDir(FWD,FWD); MotorSpeed(180,180); FrontLED(ON);
#define RECHTS1 StatusLED(YELLOW); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(ON,OFF); MotorDir(RWD,FWD); WARTEN2;
#define LINKS1 StatusLED(YELLOW); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(OFF,ON); MotorDir(FWD,RWD); WARTEN2;
#define RECHTS2 StatusLED(RED); FrontLED(OFF); BackLED(ON,ON); MotorDir (RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(ON,OFF); MotorDir(RWD,FWD); WARTEN3;
#define LINKS2 StatusLED(RED); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(OFF,ON); MotorDir(FWD,RWD); WARTEN3;
int main(void)
{
char t1, t2, taste;
unsigned int i;
Init();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1 && (t1==t2))
{
taste=t1;
if(k6)
{RECHTS2}
else if (k5)
{RECHTS1}
else if (k4)
{RECHTS1}
else if (k3)
{LINKS1}
else if (k2)
{LINKS1}
else if (k1)
{LINKS2}
}
else VORWERTS;
}
return(0);
}
Alles funktioniert super und passt auch, ABER nach einer Weile (manchmal 30s, manchmal auch 2-3 min) "hängt" der sich irgendwie auf. Der macht einmal gar nichts (nur grüne StatusLed leuchtet) oder fährt endlos im Kreis usw.
Ich bin noch ziemlich neu auf diesem Gebiet und wollte mal fragen, was da nicht passt. :-k
Bongo1st
27.05.2009, 22:54
Ich habe mir nochmals zeitgenommen und das Programm überarbeitet. Jedoch leuchtet nun nur noch die StatusLED grün auf, ansonsten passiert nichts.
@Wrex
Ich denke es ist nicht ideal mein Programm als Vorlage zu nehmen, da ich meinen Asuro erst ne Woche habe. Jedoch ist es natürlich ein Lob =D>
#include "asuro.h"
//Tasten
#define K6 taste==1 //Taste 6
#define K5 taste==2 //Taste 5
#define K4 taste==4 //Taste 4
#define K3 taste==8 //Taste 3
#define K2 taste==16 //Taste 2
#define K1 taste==32 //Taste 1
//Tasten Kombinationen
#define K65 taste==3 //Taste 6+5
#define K54 taste==6 //Taste 5+4
#define K43 taste==12 //Taste 4+3
#define K32 taste==24 //Taste 3+2
#define K21 taste==48 //Taste 2+1
#define K52 taste==18 //Taste 5+2
#define K5432 taste==30 //Taste 5+4+3+2
//Warten
#define WAIT1 for (i=0; i<1000; i++) {Sleep(72);} //1 Sekunde
#define WAIT2 for (i=0; i<400; i++) {Sleep(72);} //90 Grad-Kurve
//Fahrten
unsigned int i;
char t1,t2, taste;
void vorwerts (void)
{StatusLED (GREEN);
BackLED (ON,ON);
MotorDir (FWD,FWD);
MotorSpeed (124,120);}
void links (void)
{StatusLED (YELLOW);
BackLED (OFF,ON);
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (FWD,RWD);
WAIT2;
MotorSpeed(0,0);
WAIT1; }
void rechts (void)
{StatusLED (RED);
BackLED (ON,OFF);
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (RWD,FWD);
WAIT2;
MotorSpeed (0,0);
WAIT1;}
//Start
int main(void)
{
Init();
while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 && (t1=t2))
{
taste=t1;
if (K6) {rechts;}
else if (K1) {links;}
}
else {vorwerts;}
}
return (0);
}
radbruch
27.05.2009, 23:12
Jedoch leuchtet nun nur noch die StatusLED grün auf, ansonsten passiert nichts.
Vermutung: Dein asuro stürzt ab weil man Funktionen mit Klammern aufrufen muss:
if (K6) {rechts();}
else if (K1) {links();}
}
else {vorwerts();}
Alles funktioniert super und passt auch, ABER nach einer Weile (manchmal 30s, manchmal auch 2-3 min) "hängt" der sich irgendwie auf.Das direkte Umschalten der Motordrehrichtung bei hoher MotorSpeed erzeugt möglicherweise Impulse die den asuro reseten. Oder Akkus leer/Wackler in der Spannungsversorgung (Ein/Aus-Schalter). Auf die Dauer ist es für den asuro eher ungesund immer gegen die Wand zu knallen! Ich habe sogar schon von rausgeschleuderten Mega8s gelesen....
Gruß
mic
Bongo1st
27.05.2009, 23:44
SUPER
Danke für die Hilfe, funkt jetzt einwandfrei. Habe die () übersehen ](*,)
Versuche nun das Program noch zu erweitern. Werde dann das vollendete Programm einstellen.
Ich werd mal ein wenig rumtesten. Bis jetzt is noch nichts raus- bzw. abgefallen! =P~ :)
Ich will mich mal net zu arg hier beteiligen, da ich doch noch wenig Ahnung hab, aber kann es sein, dass der Teil hier:
if (t1 && (t1=t2))
so sein muss?
if (t1 && (t1==t2))
ich weis, dass es vielleicht pedantisch wirkt, aber es heisst vorwÄrts also Ä oder AE aber je öfter ich "vorwerts" lese und wenn es auch noch kopiert wird, fangen sich mir echt an die fußnägel zu kräuseln ..ich weis das ich auch manchmal schwer vergreife, aber nicht bös gemeint:p
ich würde aber auch auf die fehlenden klammern tippen, zum einrücken des codes noch ein kleiner tipp
returntype_t methodename (parametertype_t parameter name)
{
dosth();
return value_of_returntype_t;
}
alternativ
void methode(void)
{
doSth();
return; // return ohne einen parameter
}
radbruch
27.05.2009, 23:57
Jepp, es muss natürlich == heißen! Prima erkannt! Copy&Paste defekt?
Das ä/e lenkt zu sehr vom eigentlichen Thema ab...
Das direkte Umschalten der Motordrehrichtung bei hoher MotorSpeed erzeugt möglicherweise Impulse die den asuro reseten. Oder Akkus leer/Wackler in der Spannungsversorgung (Ein/Aus-Schalter).Das mit den Impulsen bei zu hoher Drehzahl. Ist das ne Vermutung oder ist das so? Man könnte doch den MotorSpeed "langsam" (innerhalb einer Sekunde oder sowas) herunterregeln, dann MotorDir umschalten und dann wieder hochregeln. Würde das was bringen? Oder ich stell allgemein den MotorSpeed runter, aber dann flitzt er nicht mehr so :)
Also Batterien sind voll und Wackler stell ich keinen fest. Weil das Programm an sich scheint ja zu funktionieren.
Bongo1st
28.05.2009, 19:33
Ich habe nochmals am Programm weiter gearbeitet. Nun ist Meine Frage:
Kann man Odometrie und Line gemeinsam benutzen?
int lData[2], oData[2];
l1 = (lData[1]);
o1 = (oData[1]);
Momentan will ich nur je einer der beiden Werte auslesen.
Dies Funktioniert auch mit der Odometrie, leider reagiert der ASURO nicht auf Line.
[Edit]
Hat sich erledigt, habe es herausgefunden
Hier Ist nun mein fertiges Programm es wurde getestet und Funktioniert einwandfrei.
Szenario: Weisses Quadrat mit Schwarzem Rand. Darin befinden sich Hindernisse.
Der Asuro bleibt im Quadrat. Wenn er mit einem Gegenstand kollidiert, weicht er diesem aus. Die Tasten K1 und K6 sind definiert, restliche Ausweichaktionen sind zufällig (Odometrie und Radstellung).
#include "asuro.h"
//Tasten
#define K6 taste==1 //Taste 6
#define K1 taste==32 //Taste 1
//Warten
#define WAIT1 for (i=0; i<1000; i++) {Sleep(72);} //1 Sekunde
#define WAIT2 for (i=0; i<400; i++) {Sleep(72);} //90 Grad-Kurve
//Fahrten
int i,o1,l1;
int lData[2], oData[2];
char t1,t2,t3, taste;
void vorwaerts (void)
{StatusLED (GREEN);
BackLED (OFF,OFF);
MotorDir (FWD,FWD);
MotorSpeed (124,120);}
void links (void)
{StatusLED (RED);
BackLED (ON,OFF);
MotorSpeed (0,0);
WAIT1;
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (FWD,RWD);
WAIT2;
MotorSpeed(0,0);
WAIT1; }
void rechts (void)
{StatusLED (RED);
BackLED (OFF,ON);
MotorSpeed (0,0);
WAIT1;
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (RWD,FWD);
WAIT2;
MotorSpeed (0,0);
WAIT1;}
//Start
int main(void)
{
Init();
while (1)
{
l1 = (lData[1]);
o1 = (oData[1]);
t1 = PollSwitch();
t2 = PollSwitch();
t3 = PollSwitch();
FrontLED(ON);
LineData (lData);
OdometrieData (oData);
if (l1 < 50)
{
if (o1 > 600) {rechts();}
else {links();}
}
else if (t1 && (t1=t2) && (t1=t3))
{
taste=t1;
if (K6) {rechts();}
else if (K1) {links();}
else {
if (o1 > 600) {rechts();}
else {links();}
}
}
else {vorwaerts();}
}
return (0);
}
hey das programm ist der hammer du hast es voll drauf im gegensatz zu mir -.-
Gruß Jonas Weber
ps. mach weiter so!!!!!
Du lehrst schnell. Nur ein par kleinigkeiten.
int i,o1,l1;
int lData[2], oData[2];
char t1,t2,t3, taste;
Diesen variablen declarationen gehoren eigentlich im main funktion. Nur wenn sie 'global' benutz werden (das heist jeder function muss zugang haben oder andern konnen) mussen sie ausen die main funktion deklariert werden. Sondern konnte man damit fehlerhafte Code produzieren wenn mehrere funktionen auch die variablen i, t1, t2, t3, taste, lData[], oData[] in ihren code anrufen. (lies mal uber "Gültigkeitsbereich" in diesem C-tutorial hier im Roboternetz: http://www.rn-wissen.de/index.php/C-Tutorial)
while (1)
{
l1 = (lData[1]);
o1 = (oData[1]);
t1 = PollSwitch();
t2 = PollSwitch();
t3 = PollSwitch();
FrontLED(ON);
LineData (lData);
OdometrieData (oData);
Diesen vet gedruckte Zeilen wurde ich umdrehen. Erst mal die lData und oData mit Werte einstellen im LineData und OdometriData funktionen, und danach den Rechter Werten in i1 und o1 ubertragen. Am anfang des ausfuhren einer Programm kan jeder speicherplatz einer unbekante werte haben. Die sind nicht immer 0 (vieleicht schon 'immer nicht 0'), oder eine sichere wert die das program nicht absturzen lasst. Bei dem ersten eintrit der While-schleife werden diesen unsichere werten im speicherplatz im nachsten If's verglichen. Deine If's hier sind nicht kritisch, aber was wen da einer Wurzel-funtion steht der etwas von einer negatiefe werte machen mus? Das ist unmoglich! (na ja, ohne 'komplizierte' mathematik ;) )
if (l1 < 50)
{
if (o1 > 600) {rechts();}
else {links();}
} Eigentlich sind die Variabelen l1 und o1 uberflussich. Du konnte hier auch (oData[1]>600) und (lData[1]<50) hinter if's setzen.
marcel_asuro
03.10.2009, 15:38
hey,
ich habe dieses programm hier:
#include "asuro.h"
int main(void)
{
Init(); // fein :)
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(RED);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
StatusLED(RED);
}
// Egal was PollSwitch() zurückliefert, ab hier leuchtet die StatusLED rot
{
MotorDir(RWD,RWD);
MotorSpeed(150,150);
BackLED(ON,ON);
}
// spätestens ab hier sind die BackLEDs an
{
MotorDir(BREAK,RWD);
MotorSpeed(0,150);
BackLED(ON,ON);
FrontLED(ON);
}
// und nun ist auch die FrontLED sicher eingeschaltet
{
MotorDir(FWD,FWD),
MotorSpeed(150,150);
}
// und der asuro sollte nun mit 150 nach vorne düsen
}
return 0;
}
das programm kopiere ich doch in die datei test.c (im ordner first try) [oder nicht?] dann klick ich auf tools>make [errors: none] ok, dann an die seite legen das programmers notepad2 und das flashtool öffnen: text.hex aus dem ordner first try auswählem programm drücken asuro anschalten und rüber flaschen !!! ok, wenn es fertig ist alles grün !!!! dan asuro aus und wieder an machen [alles soweit richtig, oder muss ich im programmers notepad 2 auf speichern befor ich das flash-tool benutze????] wenn der asuro angeschaltet wird geht die status led sofort auf GELB, dann auf grün, und bleibt die ganze zeit grün.....
ich weiß nicht was das problem ist !!!!
hoffe, dass ihr mir helfen könnt !!!!
gruß marcel
[Edit] Einrückungen und Kommentare im Code eingefügt von radbruch
Den test.c muss gespeichert werden vordem es compiliert wird ("tools/make"). Es hat keinen sin gleich vordem du den flash programme braucht. Weil die test.hex nicht geandert wird dadurch.
Das den Statusled nur gelb und grun leuchtet sagt mir das den geflashten test.hex von den ungeanderten firsttry programme ist. Deinem program macht den statusled im jedenfall rot. (rot bei irgend einer taster geprellt, oder rot bei keiner taster geprellt) Und wird danach niemahls auf eine andere farbe eingestellt. Kuck mal (im Windows Explorer venster, oder datei eigenschaffen) ob dem 'gespeichert auf" oder "geandert auf" zeiten gleich sind an das moment wen du es zu letzten compiliert hat.
Nur einer weitere anweisung fur dein program. Du verwendest keinen wartezeiten in deinem program. Die MotorDir, MotorSpeed und Backled, Frontled funktionen enden sehr schnell. Dadurch wird deinem asuro in einer fraktion einer sekunde wieder umschalten im ruckwartsgang oder stehenbleiben. Aber den radern haben dan nocht kaum gedreht, oder gar nichts.
Auch wurde ich selbst die backleds nur anschalten wenn den motoren gebremst werden (MotorSpeed auf 0, oder MotorDir auf Break ). Damit kannst du sehen was Asuro versucht zu machen. Dein program lasst sie leuchten an jedem stelle. Wenn irgend etwas fehlt mit den MotorDir oder MotorSpeed funktionen kannst du nicht merken an welcher stelle er is in das program.
marcel_asuro
03.10.2009, 16:43
naja, ich verstehe nur bahnhof (kann das mal jm. auf HOCHdeutsch) erkären und nicht wie valen, diese "sprache" versteh ich net, das ist z.T deutsch z.T was weiß ich was
gruß marcel
ps. ich wäre dankbar, wnn mir mal jm. ein programm (.hex) geben könnte
Verzeihung, aber deutsch ist nicht meiner mutter sprache. Und versuche nur zu helfen. Danke.
[Edit] Einrückungen und Kommentare im Code eingefügt von radbruchRadbruch der Rettung! Danke.
marcel_asuro
03.10.2009, 17:20
sry. aber ich wollte ja nix gegen dich sagen, bin nur ein bisschen deprimiert weil es nicht klappt :( [aber danke für deine mühe !!!!]
gruß marcel
radbruch
03.10.2009, 17:21
Hallo Marcel
Was mir total mißfällt ist diese Anmerkung von dir:
"naja, ich verstehe nur bahnhof (kann das mal jm. auf HOCHdeutsch) erkären"
Ich würde das hier auch nicht als "hochdeutsch" bezeichnen.
das programm kopiere ich doch in die datei test.c (im ordner first try) [oder nicht?] dann klick ich auf tools>make [errors: none] ok, dann an die seite legen das programmers notepad2 und das flashtool öffnen: text.hex aus dem ordner first try auswählem programm drücken asuro anschalten und rüber flaschen !!! ok, wenn es fertig ist alles grün !!!! dan asuro aus und wieder an machen [alles soweit richtig, oder muss ich im programmers notepad 2 auf speichern befor ich das flash-tool benutze????] wenn der asuro angeschaltet wird geht die status led sofort auf GELB, dann auf grün, und bleibt die ganze zeit grün..
Da du hier im RN-Forum noch neu bist (ein herzliches Willkommen übrigens;) kannst du nicht wissen, dass der Support hier sehr international ist. Ich gehe mal davon aus, dass du dir in Zukunft solche Bemerkungen verkneifen wirst.
Gruß
mic
Das mit den Pause könnte man z.B über Sleep(wert) lösen und zu deiner Frage woher der Asuro weiß wie lange er etwas machen soll:
Du könntest z.B einen Timer starten und den in deiner while schleife abfragen und z.B. bei einem bestimmten Wert die derzeitige funktion abbrechen und in eine andere wechseln
marcel_asuro
03.10.2009, 18:09
Hallo Marcel
Was mir total mißfällt ist diese Anmerkung von dir:
"naja, ich verstehe nur bahnhof (kann das mal jm. auf HOCHdeutsch) erkären"
Ich würde das hier auch nicht als "hochdeutsch" bezeichnen.
das programm kopiere ich doch in die datei test.c (im ordner first try) [oder nicht?] dann klick ich auf tools>make [errors: none] ok, dann an die seite legen das programmers notepad2 und das flashtool öffnen: text.hex aus dem ordner first try auswählem programm drücken asuro anschalten und rüber flaschen !!! ok, wenn es fertig ist alles grün !!!! dan asuro aus und wieder an machen [alles soweit richtig, oder muss ich im programmers notepad 2 auf speichern befor ich das flash-tool benutze????] wenn der asuro angeschaltet wird geht die status led sofort auf GELB, dann auf grün, und bleibt die ganze zeit grün..
Da du hier im RN-Forum noch neu bist (ein herzliches Willkommen übrigens;) kannst du nicht wissen, dass der Support hier sehr international ist. Ich gehe mal davon aus, dass du dir in Zukunft solche Bemerkungen verkneifen wirst.
Gruß
mic
ich habe mich ja schon quasi entschuldigt, und es wird ja nicht wieder vorkommen
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.