PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro hilfe beim Programmieren



reiteringer
26.12.2008, 16:56
Also für mich ist programmieren, Neuland ! Habe die Programme Test.c und SelfTest.c am Bot zum laufen bekommen!
Habs aber nicht weiter geschafft, hab im Forum vieles darüber gelesen, was möglich wäre, nur sollte ich mal diese Hürde schaffen!
Klartext: PCDemo.c im Notepad2 geöffnet mit dem tool make compiliert,und was es sonst noch alles tut mit dem Programm ==> output ist ein Hex das sich selftest nennt wo aber leider auch selftest drinn is!
also was muss ich wo umbenennen, muss ich im makefile was verändern, damit ich zb. PCdemo am asuro zum laufen kriege!
danke im voraus für eure Hilfe!

reiteringer
26.12.2008, 23:21
Selbst beim ausführen von:
#include "asuro.h"

int main(void)
{
Init();

while(1);
StatusLED(RED);
return 0;
}


ich hab nat. gespeichert
bleibt die StatusLed grün !!!!
also ich hab diese zeile nur ins test.c eingefügt vom asuro handbuch abgeschrieben, was muss ma noch verändern oder wo liegt der fehler?
bitte um Hilfe!
mfg

BurningBen
27.12.2008, 00:07
Schreibs mal so:

#include "asuro.h"

int main(void)
{
Init();

while(1) {
StatusLED(RED);
return 0;
}
}

Bisher wurde bei dir immer ne leere While-Schleife durchgeführt.
Und der Rest danach (auch deine LED) wurden gar nicht mehr erreicht.

hai1991
27.12.2008, 13:28
hallo zusammen

ich würde es ein bisschen abändern, denn ich glaube, dass in der anleitung steht, dass der asuro(prozessor) nie bis zu return 0; kommen soll, da ansonsten nicht definiert ist, wie er sich verhält

meine version schaut so aus:


#include "asuro.h"

int main(void)
{
Init(); //initialisierung

StatusLED(RED); //statusLED auf rot setzten (1mal genügt)

while(1); // in einer endlosschleife gefangen halten (es wird nichts ausgeführt)
return 0; //somit gibt es auch kein undefiniertes ende

}


d.h. es genügt wenn du 2 zeilen in deinem programm vertauschst

reiteringer
27.12.2008, 14:39
ok haut hin!
danke
aber jetzt muss ich euch weiterlöchern
thema PCDemo
also wenn ich

#include "asuro.h"
#include <stdlib.h>

#define OFFSET 0x3F
#define STEP 5

#define RWD_KEY '2'
#define FWD_KEY '8'
#define LEFT_KEY '4'
#define RIGHT_KEY '6'
#define STOP_KEY '5'

volatile unsigned char switchPressed;
int speedLeft,speedRight;

SIGNAL (SIG_INTERRUPT1)
{
unsigned int i;

DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
for (i = 0; i < 0xFE; i++);

ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);

// und ab gehts --- fahr zurück
MotorDir(RWD,RWD);
MotorSpeed(200,200);
FrontLED(ON);
BackLED(ON,ON);
for (i = 0; i < 0xFFFD; i++); // Sleep does not work here

switchPressed = TRUE;
SWITCH_OFF;
DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1
}

void PCFwd(void)
{
speedRight += STEP;
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(ON);
BackLED(OFF,OFF);
}

void PCRwd(void)
{
speedRight -= STEP;
speedLeft -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
FrontLED(OFF);
BackLED(ON,ON);
}

void PCLeft (void)
{
speedLeft -= STEP;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
speedRight += STEP;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(OFF);
BackLED(ON,OFF);
}

void PCRight (void)
{
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
speedRight -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
FrontLED(OFF);
BackLED(OFF,ON);
}


void PCStop(void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}


void PCDemo(void)
{
unsigned char cmd;
unsigned char leftDir = FWD, rightDir = FWD;

Init();
StartSwitch();
sei();
for(;;) {
cmd = 0;
SerRead(&cmd,1,0xFFFE);
switch (cmd) {
case RWD_KEY : PCRwd(); break;
case FWD_KEY : PCFwd(); break;
case LEFT_KEY : PCLeft(); break;
case RIGHT_KEY : PCRight(); break;
case STOP_KEY : PCStop(); break;
}
if (speedLeft > 0 && speedLeft < OFFSET) speedLeft += OFFSET;
if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
if (speedRight > 0 && speedRight < OFFSET) speedRight += OFFSET;
if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;

if (switchPressed) {
speedLeft = 0;
speedRight = 0;
switchPressed = FALSE;
}

leftDir = rightDir = FWD;
if (speedLeft < 0) leftDir = RWD;
if (speedRight < 0) rightDir = RWD;

if (speedLeft > 255) speedLeft = 255;
if (speedLeft < -255) speedLeft = -255;
if (speedRight > 255) speedRight = 255;
if (speedRight < -255) speedRight = -255;

MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
}
}




ins text.c einfüge
habe ich danach folgenden Fehler:

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
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o(.in it9+0x0): undefined reference to `main'
make: *** [test.elf] Error 1

> Process Exit Code: 2

könntet ihr euch das mal anschauen was zu ändern is?
bitte, danke!
mfg

hai1991
27.12.2008, 14:55
hallo

ich glaube du musst void PCDemo in void main umändern
denn der compiler sucht immer nach der main-funktion (man könnte auch haupfunktion dazu sagen) und fängt dort zum "übersetzen" an

in diesem fall gibt es keine solche funktion und er weiß nicht was er machen soll bzw. wo er anfangen soll

siehe fehlemeldung: undefined reference to `main'

reiteringer
27.12.2008, 16:04
hat funktioniert!! zumindest das rüberspielen!
egal bei welcher taste es bewegt sich nur der linke motor, und der nicht immer so wie er sollte fehler im programm beim asuro gibts da noch alte programme die mitspielen? was kann ich tun?

reiteringer
27.12.2008, 19:31
sorry war zu schnell mit dem hilferuf hab nur das programm nicht richtig verstanden!
mfg

reiteringer
27.12.2008, 23:08
wiedermal ne frage meine fachliteratur is noch nicht bei mir eingetroffen, darum muss ich meine Fragen hier stellen!
Kann mir wer sagen wo ich im folgenden Programm die geschwindigkeit runter oder die Frequenz der odometrie erhöhen kann um engere Kurven radien zu meistern?

#include "asuro.h"

#define SPEED 0x200F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}

void main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}

mfg

radbruch
27.12.2008, 23:43
Hallo

Mit SPEED gibt man die maximale Geschwindigkeit an, mit STEP die Stärke der Reaktion auf eine Abweichung von der Linie. Diese Reaktion sollte man noch vom Helligkeitsunterschied abhängig machen:


#include "asuro.h"

#define SPEED 175
#define STEP 5

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += STEP;
if (speedLeft > SPEED)
{
speedLeft = SPEED;
speedRight -= STEP;
}
}

void LineRight (void)
{
speedRight += STEP;
if (speedRight > SPEED)
{
speedRight = SPEED;
speedLeft -= STEP;
}
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return(0);
}

Ich kann es nicht testen weil mein asuro grad zerlegt ist.

speedLeft = speedRight = SPEED;

Das ist kritisch weil nicht sicher ist ob beide Seiten bei gleicher SPEED gleichschnell drehen wenn wir genau auf der Linie sind.

Bauchgefühlsmässig könnte nach dem MotorSpeed(speedLeft,speedRight); noch ein Sleep(100); reinpassen.

Gruß

mic