-         

Ergebnis 1 bis 10 von 10

Thema: Asuro hilfe beim Programmieren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13

    Asuro hilfe beim Programmieren

    Anzeige

    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!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13
    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

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von BurningBen
    Registriert seit
    02.09.2008
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    842
    Schreibs mal so:
    Code:
    #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.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    26
    Beiträge
    239
    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:
    Code:
    #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
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13
    ok haut hin!
    danke
    aber jetzt muss ich euch weiterlöchern
    thema PCDemo
    also wenn ich
    Code:
    #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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    26
    Beiträge
    239
    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'
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13
    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?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13
    sorry war zu schnell mit dem hilferuf hab nur das programm nicht richtig verstanden!
    mfg

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Ybbs
    Alter
    33
    Beiträge
    13
    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?
    Code:
    #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

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    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:

    Code:
    #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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •