-         

Ergebnis 1 bis 10 von 10

Thema: Wo liegt der fehler? - Asuro fährt nicht wie er soll

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    28
    Beiträge
    77

    Wo liegt der fehler? - Asuro fährt nicht wie er soll

    Anzeige

    hallo, mein asuro fährt scheinbar willkürlich. ich glaube es liegt am code.
    er soll, wie im bild beschrieben, erst gerade aus gegen eine wand fahren, dann einen 180° bogen rückwärts machen und dann wieder geradeaus gegen die nächste wand fahren. dann anhalten und aufhören.

    ps: die odometrie geht nicht. beim bogen kommt es nicht auf genauigkeit an. ist erstmal nur grob.


    Code:
    #include <stdlib.h>
    #include "asuro.h" 
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage 
    #define keine_taste (PINC & (1<<PC4))
    
    void MSleep (int dauer)
    {
      int z;
      for (z = 0; z < dauer; z++)
        Sleep (36);
    }
    
    
    int main(void){ 
    int i=0;
    Init(); 
    while(1) { 
    
      while (keine_taste) {
        StatusLED(RED); 
        BackLED(OFF,OFF); 
        MotorDir(FWD,FWD); 
        MotorSpeed(120,152); 
      }    
      if (PollSwitch()>0){   
        while (i<30) { 
          BackLED(ON,ON); 
          MotorDir(RWD,RWD); 
          MotorSpeed(120,152); 
    	  i++;
    	  MSleep(36);
        }   
        MotorSpeed(0,0); 
        i=0;
        while (i<250) {
          MotorDir(RWD,RWD); 
          MotorSpeed(120,0); 
    	  i++;
    	  MSleep(36);
        }     
        BackLED(OFF,OFF); 
        MotorDir(FWD,FWD);
    	MotorSpeed(120,152); 
        i=0;
        StatusLED(YELLOW);
    	if (PollSwitch()>0){
    	  StatusLED(GREEN);
    	  MotorSpeed(0,0);
    	  while (1){
    	    MotorSpeed(0,0);
    	  }
    	}
    	
      } 
      
    } 
    
    }
    http://www.picupload.net/s-8c871b060...4fbc54-jpg.php

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Alter
    25
    Beiträge
    17
    warum machst du nicht einfach:


    Code:
    #include <asuro.h>
    int main (void)
    {
    Init();
    int p;
    MotorDir(FWD,FWD);
    MotorSpeed(255,255);
    
    for(;PollSwitch()==0;);
    MotorDir(BREAK,RWD);
    MotorSpeed(0,255);
    for(p=0;p<1*1000;p++)
    {Sleep(72);}
    MotorDir(FWD,FWD);
    MotorSpeed(255,255);
    for(;PollSwitch()==0;);
    MotorDir(BREAK,BREAK);
    
    for(;;);
    }
    mfg Freddy

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo Weiti

    Ich habe dein Program etwas umgestellt:
    Code:
    #include "asuro.h"
    //#include <stdlib.h>
    
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    void MSleep (int dauer) // 1/1000 sek
    {
      int z;
      for (z = 0; z < dauer; z++)
        Sleep (36); // bei der orginalen Library muss hier 72 stehen
    }
    
    int main(void)
    {
    	Init();
    
    	StatusLED(RED); // vorwärts bis Hinderniss
    	BackLED(OFF,OFF);
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,120);
    	while (keine_taste);
    
    	BackLED(ON,ON); // zurück
    	MotorDir(RWD,RWD);
    	MotorSpeed(120,120);
    	MSleep(1080); // 36*30
    	MotorSpeed(0,0);
    	Msleep(200);
    
    	MotorDir(RWD,RWD); // drehen
    	MotorSpeed(0,120);
    	MSleep(2000); // 250*36=9000?
    	MotorSpeed(0,0);
    	Msleep(200);
    	BackLED(OFF,OFF);
    
    	MotorDir(FWD,FWD); // vorwärts bis nächstes Hinderniss
    	MotorSpeed(120,120);
    	StatusLED(YELLOW);
    	while (keine_taste);
    
    	StatusLED(GREEN); // fertig
       MotorSpeed(0,0);
       while (1);
    	return(0);
    }
    Deine Version lief mit meinem asuro auch nicht. Msleep() benötigt als Parameter die Zeit in Millisekunden (1/1000). Der wiederholte Aufruf von MotorSpeed() könnte dazu führen, das die PWM-Register nicht richtig funktionieren. Deshalb keine Schleife, sondern erst Motor setzen und dann warten.

    Gruß

    mic

    warum machst du nicht einfach:
    Weil PollSwitch() nicht immer das erwartete zurückliefert

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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    28
    Beiträge
    77
    die lösung mit dem while (keine_taste); ist genial. die ganzen schleifen sind total unsinnig. da habt ihr recht. allerdings musste ich die großschreibung bei Msleep() anpassen und beim drehen Msleep(14500) eingeben;
    der motor braucht mehr zeit um 180° zu machen.

    vielen dank an euch.

    gruß weiti

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    14500 sind 14,5 sekunden. braucht er wirklich so lange?
    kleinschreibung ist cool!

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    allerdings musste ich die Großschreibung bei Msleep() anpassen
    Oh, da hat sich bei mir ein kleiner Fehler eingeschlichen. Die Funktion heist mit Absicht MSleep() um sie auch mit einer Library nutzen zu können die Msleep() kennt. Blöderweise habe ich das bei der Verzögerung nicht beachtet, deshalb steht da fälschlicherweise Msleep(200);

    Da du eine Fehlermeldung hattest, verwendest du wohl die orginale CD-Version von asuro.c Hier läuft der Timer noch mit 72kHz, deshalb muss in der Funktion MSleep() das Sleep(36) auf Sleep(72) geändert werden. 72000 Ticks/Sekunde*72 ergibt die gewünschten 1/1000 Sek Verzögerung. Mit Sleep(36) wären 14500 immer noch über 7 Sekunden, das erscheint mir auch etwas viel Zeit für's Wenden. Irgendwas stimmt mit deinem Antrieben nicht, darauf weisen auch deine sehr unterschiedlichen Powerwerte der Motoren hin.

    Gruß

    mic

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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    28
    Beiträge
    77
    hallo auch. ich habe nach ewigkeiten mal wieder den asuro programmiert. nun geh dieses programm hier aber nicht mehr.
    ich benutze im moment KEINE libs aus dem forum, also nur die standart-sachen von der cd.
    das notepad gibt folgende fehler aus:

    Code:
    C:\Asuro\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=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.
    
    Size before:
    test.elf  :
    section    size      addr
    .text      1528         0
    .data         0   8388704
    .bss          1   8388704
    .noinit       0   8388705
    .eeprom       0   8454144
    .stab      3156         0
    .stabstr   1704         0
    Total      6389
    
    
    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
    test.c:7: error: parse error before string constant
    test.c: In function `main':
    test.c:16: warning: implicit declaration of function `Init'
    test.c:18: warning: implicit declaration of function `StatusLED'
    test.c:18: error: `RED' undeclared (first use in this function)
    test.c:18: error: (Each undeclared identifier is reported only once
    test.c:18: error: for each function it appears in.)
    test.c:19: warning: implicit declaration of function `BackLED'
    test.c:19: error: `OFF' undeclared (first use in this function)
    test.c:20: warning: implicit declaration of function `MotorDir'
    test.c:20: error: `FWD' undeclared (first use in this function)
    test.c:21: warning: implicit declaration of function `MotorSpeed'
    test.c:22: error: `PINC' undeclared (first use in this function)
    test.c:22: error: `PC4' undeclared (first use in this function)
    test.c:24: error: `ON' undeclared (first use in this function)
    test.c:25: error: `RWD' undeclared (first use in this function)
    test.c:27: warning: implicit declaration of function `Msleep'
    test.c:40: error: `YELLOW' undeclared (first use in this function)
    test.c:43: error: `GREEN' undeclared (first use in this function)
    make: *** [test.o] Error 1
    
    > Process Exit Code: 2

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    test.c:7: error: parse error before string constant

    Da stimmt was nicht in Zeile 7. Zeig uns mal das Programm dazu.

    test.c:27: warning: implicit declaration of function `Msleep'

    Bei der CD-Lib muss es MSleep() lauten. Programm zeigen ;)

    Gruß

    mic

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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    28
    Beiträge
    77
    hab das von radbruch korregierte. geht aber schon, es war so, das ich alle Msleep mit kleinem s hatte. wenn alle mit großem S sind gehts.

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    hab das von radbruch korregierte
    Ojeoje. Keine Ahnung was mich damals geritten hatte. Eigentlich sollte alles MSleep() lauten um die in der orginalen Lib nicht vorhandene Funktion zu ergänzen und keinen Konflikt mit der erweiterten Funktion Msleep() zu provozieren. Warum ich dann dieses Mischmasch abgeliefert habe weiß ich echt nicht mehr. Na, Hauptsache es läuft jetzt bei dir :)

    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
  •