- 12V Akku mit 280 Ah bauen         
Seite 3 von 12 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 113

Thema: neue Asuro Lib V2.70 (Release Candidate 3)

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Beiträge
    9

    Fehler in Doku motor.c

    Anzeige

    Powerstation Test
    Leute,

    die Lib ist eine sehr schönes Werk - vielen Dank. Die Doxygen-Doku hat einen Fehler in motor.c:

    Der Range von SetMotorPower() ist falsch beschrieben:

    Setzt Motor Geschwindigkeit und Richtung (Autor: stochri)
    Parameter:
    leftpwm linker Motor (-rückwaerts, + vorwaerts) (Wertebereich -255...255)
    rightpwm rechter Motor (-rückwaerts, + vorwaerts) (Wertebereich -255...255)
    Richtig ist (wär hätte das gedacht) -128...127.

    Simsys

  2. #22
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Simsys,
    erst einmal herzlich willkommen im Forum.
    Schön, dass die Doku gelesen wird, und noch besser, das von dir eine Mitteilung zum Fehler kommt.

    Du hast noch die Lib erwischt, zu der eine einheitliche Doku gerade angefangen wurde. Ich bin bisher noch nicht durch alle Sourcen gekommen um ein einheitliches Grundgerüst mit m.a.r.v.i.n zu veröffentlichen.
    Habt alle bitte noch etwas Geduld.

    Zu der Differenz zwischen Doku und Funktion sollten wir aber auf alle Fälle stochri befragen, denn er hat seine Funktion korrekt auf englisch kommentiert. Nur ist der Kommentar-Teil, der für die HTML-Doku benutzt wird falsch geschrieben worden.

    An stochri die Frage:
    Macht es tatsächlich Sinn für diese Motor-Funktion einen anderen Wertebereich beizubehalten, oder sollte man da eher einen anderen Variablentyp spendieren um bei den bekannten Werten bis 255 zu bleiben und die interne *2-Geschichte wieder entfernen?
    Lieber Asuro programieren als arbeiten gehen.

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.142
    Blog-Einträge
    3
    Hallo Sternthaler,

    den Wertereich -128 ... +127 habe ich aus Spargründen gewählt. Der 255er Bereich wäre natürlich angenehmer für die Programmierung, was aber sowohl Speicherplatz als auch Rechenzeit kostet, weil man ja die Variablen dann auf 16Bit erweitern muss.
    Meiner Meinung nach reicht für eine feinfühlige Ansteuerung der Motoren der halbierte PWM-Wert auch aus.

    Wenn Ihr es ändern wollt, könnt Ihr es ändern. Für die Programmierung wäre es von Vorteil, für den Platzbedarf von Nachteil Für mich stand die Entscheidung auch auf der Kippe. Ich habe die Routine für eines meiner Experimente mit maximaler Ausführungsgesschwindigkeit gebraucht.
    Ich vermute auch, dass noch einige Routinen im Laufe der Zeit dazu kommen und dann wird man den Platz wohl benötigen wird.
    Ein wenig Platzu könnte man auch sparen, wenn man die Routine in die Go- und Turn-Funktion einbaut.

    Gruss,
    stochri

  4. #24
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2007
    Beiträge
    7
    Hi

    Ich versuch grad die Interruptgesteuerte Odometrie zu versehen, aber so ganz steig ich nicht durch.

    Meine Hauptfrage betrifft eigentlich die Variable toggle ind der Signal routine (den rest versteh ich noch so halbwegs)

    Diese gibt ja an, ob jetzt gerade das rechte oder das linke Rad ausgelesen werden soll, richtig?
    Da diese allerdings bei Aufruf der Funktion (also bei jedem interrupt ?) zu 0 initialisiert wird und erst am ende geXORt wird, ist mir ein Rätsel wie das funktioniert. Wo mach ich da grad nen Denkfehler?

    Mit untertänigster Bitte um Erleuchtung

    Mooses

  5. #25
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Mooses78,
    ist relativ einfach.

    Es sieht tatsächlich so aus als ob die Variable immer mit FALSE initialisiert würde. Das Geheimnis ist das STATIC (natürlich klein geschrieben) vor ALLEN 3 Varaiblen:

    static unsigned char tmp[2],flag[2],toggle=FALSE;

    Solche, mit static erzeugten, Variablen werden GENAU EINMAL initialisiert und dann NIE wieder.
    Das war's schon. C hat halt so seine Geheimnisse


    Zitat Zitat von stochri
    Wenn Ihr es ändern wollt, könnt Ihr es ändern.
    OK, ich gebe dir Recht, dass das ganze Rechenzeit und Speicher kostet. Also bleibt es so und ich werden die Doku anpassen.

    Oder gibt es sonst noch andere Vorschläge??

    Meiner Meinung nach macht es nicht allzu viel Sinn, die Funktion MotorSpeed komplett durch die neue Funktion SetMotorPower zu ersetzen. Die original Funktion MotorSpeed ist (mittlerweile) eine inline-Funktion und benötigt dadurch nur extrem wenig Platz. Sie kann also aus Gründen der Kompatibilität ruhig drin bleiben.
    Lieber Asuro programieren als arbeiten gehen.

  6. #26
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Beiträge
    9

    Doxyfile

    Hallo,

    die Doku ist inzwischen echt klasse. Eine Bitte für die Linux-Fans (ich bin einer): Die Verzeichnisse in Doxyfile sollten mit einem Slash (/) statt einem Backslash (\) getrennt sein (nicht aber das Zeilenende):

    statt
    examples\EncoderTest \
    besser
    examples/EncoderTest \

    Code:
    INPUT                  = ./ \
                             lib \
                             lib/inc \
                             examples/EncoderTest \
                             examples/FirstTry \
                             examples/IRCollisionTest \
                             examples/KollisionTest \
                             examples/LineTest \
                             examples/MotorTest \
                             examples/SelfTest \
                             examples/TasterTest
    Doxygen generiert dann unter Windows immer noch tadelos die ganze Doku.

    Gruß
    Simsys

  7. #27
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Das ist erledigt (für die nächste Version)
    Lieber Asuro programieren als arbeiten gehen.

  8. #28
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2007
    Beiträge
    7
    Hallo Sternthaler

    tja, wie leicht mna so ein kleines static doch übersehen kann...

    Dankeschön für die schnelle Antwort

    Mooses

  9. #29
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Beiträge
    9
    So, ich habe das Linien-Verfolgungs-Programm ein wenig bearbeitet:

    - Auf das notwendigste reduziert
    - Etwas verbessert (Dank an HermannSW!)
    - Doxygen-Kompatibel kommentiert

    Ich schlage vor, es statt des test.c in das Verzeichnis examples/LineTest aufzunehmen. Ich habe es in "ltest.c" umbenannt, da ich ansonsten Doxygen nicht überreden konnte die Kommentare anzuzeigen.

    ltest.c
    Code:
    /****************************************************************************/
    /*!
      \file     ltest.c
    
      \brief    Linienverfolgung
    
    Enthält einen Algorithmus, der den Asuro Linien verfolgen lässt. Dazu wird die
    LED vorne unten "FrontLED" eingeschaltet und das reflektierte Licht mittels der
    beiden Empfangs-LEDs vorne unten ausgewertet.
    
    Der Asuro regelt die Geradeausfahrt. Wenn er links neben die Linie kommt, so
    bremst er das rechte Rad ab und umgekehrt. Wie stellt er fest, dass von der 
    Mitte abweicht? Er leuchtet den Untergrund an miss auf den Empfängern rechts
    und links das reflektierte Licht. Befindet sich beispielsweise der linke 
    Empfänger über der hellen Linie, so wird dort mehr Licht reflektiert. Die 
    beiden Messwerte sind ungleich - der Asoro versucht sie wieder anzugleichen.
    
    Regelungstechnisch gesehen handelt es sich um einen \htmlonly 
    I-Regler. \endhtmlonly
    Solange Asuro eine Abweichung feststellt, wird er immer mehr dagegen angehen 
    bis die Abweichung wieder auf Null ist. Das Maß des Gegensteuerns ist nicht 
    abhängig von der Differenz der Helligkeiten sondern nur von der Zeit, wie 
    lange die Abweichung besteht.
    
    **************************************************************************/
    
    /**************************************************************************
    *
    * Original: File Name:   LineDemo.c by Jan Grewe
    *           Copyright (c) 2003 DLR Robotics & Mechatronics
    * 
    * Geändert: Simsys
    *
    ***************************************************************************
    *   This program is free software; you can redistribute it and/or modify  *
    *   it under the terms of the GNU General Public License as published by  *
    *   the Free Software Foundation; either version 2 of the License, or     *
    *   any later version.                                                    *
    ***************************************************************************/
    
    #include "asuro.h"
    
    /*! Legt die höchste Geschwindigkeit der Motoren fest */
    #define MAXSPEED 140
    /*! Legt die niedrigste Geschwindigkeit der Motoren fest */
    #define MINSPEED 30
    
    
    /*! Geschwindigkeiten der beiden Motoren merken */
    int speedLeft,speedRight;
    /*! Speicherplatz für A/D-Wandlung reservieren */
    unsigned int lineData[2];
    /*! Helligkeitsdifferenz der Bauteile fest halten */
    int ADOffset;
    
    /*!
    Die Linie befindet sich links von der Mitte, also müssen wir das linke Rad
    bremsen damit sie wieder in die Mitte kommt.
    */
    void LineLeft (void)
    {
        speedLeft  -= 1;      /* links bremsen */
        if (speedLeft < MINSPEED) 
            speedLeft = MINSPEED;
    }
    
    /*!
    Die Linie befindet sich rechts von der Mitte, also müssen wir das rechte Rad
    bremsen damit sie wieder in die Mitte kommt.
    */
    void LineRight (void)
    {
        speedRight  -= 1;     /* rechts bremsen */
        if (speedRight < MINSPEED) 
            speedRight = MINSPEED;
    }
    
    int main(void)
    {
        int i;
        unsigned char j;
    
        Init();                     // Initialisierung der Asuro Hardware
        FrontLED(ON);               // FrontLED ein
    
        for (j = 0; j < 0xFF; j++)  // Einlesen der beiden Empfangsdioden
            LineData(lineData);
                                    // Differenz bestimmen und abspeichern
        ADOffset = lineData[LEFT] - lineData[RIGHT]; 
        speedLeft = speedRight = MAXSPEED;  // Speed einstellen
        StatusLED(GREEN);           // Anzeigen: alles, jetzt geht es los!
    
        while (1) {                 // Endlosschleife
            LineData(lineData);     // Helligkeitswerte einlesen
            i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset; // Helle Linie
    //        i = (lineData[RIGHT] - lineData[LEFT]) + ADOffset; // Dunkle Linie
            if ( i > 4)
                LineLeft();         // Die Linie befindet sich links
            else {
                if ( i < -4)        // Die Linie befindet sich rechts
                    LineRight();
                else
                    speedLeft = speedRight = MAXSPEED;  // keine Differenz, gerade!
            }
            MotorSpeed(speedLeft,speedRight);           // Geschwindigkeiten setzen
        }
    }
    Nachfolgend auch noch das angepasste Makefile
    Code:
    # WinAVR Sample makefile written by Eric B. Weddington, J�g Wunsch, et al.
    # Released to the Public Domain
    # Please read the make user manual!
    #
    #
    # On command line:
    #
    # make all = Make software.
    #
    # make clean = Clean out built project files.
    #
    # make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
    #
    # make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
    #                4.07 or greater).
    #
    # make program = Download the hex file to the device, using avrdude.  Please
    #                customize the avrdude settings below first!
    #
    # make filename.s = Just compile filename.c into the assembler code only
    #
    # To rebuild project do "make clean" then "make all".
    #
    
    
    # MCU name
    MCU = atmega8
    
    # Output format. (can be srec, ihex, binary)
    FORMAT = ihex
    
    # Target file name (without extension).
    TARGET = ltest
    
    # Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
    # (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
    OPT = s
    
    
    # List C source files here. (C dependencies are automatically generated.)
    SRC = $(TARGET).c
    
    # If there is more than one source file, append them above, or adjust and
    # uncomment the following:
    SRC += asuro.c
    
    # You can also wrap lines by appending a backslash to the end of the line:
    #SRC += baz.c \
    #xyzzy.c
    
    
    
    # List Assembler source files here.
    # Make them always end in a capital .S.  Files ending in a lowercase .s
    # will not be considered source files but generated files (assembler
    # output from the compiler), and will be deleted upon "make clean"!
    # Even though the DOS/Win* filesystem matches both .s and .S the same,
    # it will preserve the spelling of the filenames, and GCC itself does
    # care about how the name is spelled on its command-line.
    ASRC = 
    
    
    
    
    # Optional compiler flags.
    #  -g:        generate debugging information (for GDB, or for COFF conversion)
    #  -O*:       optimization level
    #  -f...:     tuning, see GCC manual and avr-libc documentation
    #  -Wall...:  warning level
    #  -Wa,...:   tell GCC to pass this to the assembler.
    #    -ahlms:  create assembler listing
    CFLAGS = -g -O$(OPT) -I../../lib/inc\
    	-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
    	-Wall -Wstrict-prototypes \
    	-Wa,-ahlms=$(<:.c=.lst)
    
    VPATH=../../lib
    
    # Optional assembler flags.
    #  -Wa,...:   tell GCC to pass this to the assembler.
    #  -ahlms:    create listing
    #  -gstabs:   have the assembler create line number information; note that
    #             for use in COFF files, additional information about filenames
    #             and function names needs to be present in the assembler source
    #             files -- see avr-libc docs [FIXME: not yet described there]
    ASFLAGS = -Wa,-ahlms=$(<:.S=.lst),-gstabs 
    
    
    
    # Optional linker flags.
    #  -Wl,...:   tell GCC to pass this to linker.
    #  -Map:      create map file
    #  --cref:    add cross reference to  map file
    LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
    
    
    
    # Additional libraries
    #
    # Minimalistic printf version
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_min
    #
    # Floating point printf version (requires -lm below)
    #LDFLAGS +=  -Wl,-u,vfprintf -lprintf_flt
    #
    # -lm = math library
    LDFLAGS += -lm
    LDFLAGS += -lasuro
    
    
    
    # ---------------------------------------------------------------------------
    
    # Define directories, if needed.
    DIRAVR = c:/winavr
    DIRAVRBIN = $(DIRAVR)/bin
    DIRAVRUTILS = $(DIRAVR)/utils/bin
    DIRINC = .
    DIRLIB = $(DIRAVR)/avr/lib
    
    
    # Define programs and commands.
    SHELL = sh
    
    CC = avr-gcc
    
    OBJCOPY = avr-objcopy
    OBJDUMP = avr-objdump
    SIZE = avr-size
    
    REMOVE = rm -f
    COPY = cp
    
    HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
    ELFSIZE = $(SIZE) -A $(TARGET).elf
    
    FINISH = echo Errors: none
    BEGIN = echo -------- begin --------
    END = echo --------  end  --------
    
    
    
    
    # Define all object files.
    OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 
    
    # Define all listing files.
    LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
    
    # Combine all necessary flags and optional flags.
    # Add target processor to flags.
    ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
    ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
    
    
    
    # Default target.
    all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
    	$(TARGET).lss sizeafter finished end
    
    
    # Eye candy.
    # AVR Studio 3.x does not check make's exit code but relies on
    # the following magic strings to be generated by the compile job.
    begin:
    	@$(BEGIN)
    
    finished:
    	@$(FINISH)
    
    end:
    	@$(END)
    
    
    # Display size of file.
    sizebefore:
    	@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE);fi
    
    sizeafter:
    	@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE);fi
    
    
    
    # Display compiler version information.
    gccversion : 
    	$(CC) --version
    
    
    
    
    # Convert ELF to COFF for use in debugging / simulating in
    # AVR Studio or VMLAB.
    COFFCONVERT=$(OBJCOPY) --debugging \
    	--change-section-address .data-0x800000 \
    	--change-section-address .bss-0x800000 \
    	--change-section-address .noinit-0x800000 \
    	--change-section-address .eeprom-0x810000 
    
    
    coff: $(TARGET).elf
    	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
    
    
    extcoff: $(TARGET).elf
    	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
    
    # Create final output files (.hex, .eep) from ELF output file.
    %.hex: %.elf
    	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
    
    %.eep: %.elf
    	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
    	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
    
    # Create extended listing file from ELF output file.
    %.lss: %.elf
    	$(OBJDUMP) -h -S $< > $@
    
    
    
    # Link: create ELF output file from object files.
    .SECONDARY : $(TARGET).elf
    .PRECIOUS : $(OBJ)
    %.elf: $(OBJ)
    	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
    
    
    # Compile: create object files from C source files.
    %.o : %.c
    	$(CC) -c $(ALL_CFLAGS) $< -o $@
    
    
    # Compile: create assembler files from C source files.
    %.s : %.c
    	$(CC) -S $(ALL_CFLAGS) $< -o $@
    
    
    # Assemble: create object files from assembler source files.
    %.o : %.S
    	$(CC) -c $(ALL_ASFLAGS) $< -o $@
    
    
    
    
    
    
    # Target: clean project.
    clean: begin clean_list finished end
    
    clean_list :
    	$(REMOVE) $(TARGET).hex
    	$(REMOVE) $(TARGET).eep
    	$(REMOVE) $(TARGET).obj
    	$(REMOVE) $(TARGET).cof
    	$(REMOVE) $(TARGET).elf
    	$(REMOVE) $(TARGET).map
    	$(REMOVE) $(TARGET).obj
    	$(REMOVE) $(TARGET).a90
    	$(REMOVE) $(TARGET).sym
    	$(REMOVE) $(TARGET).lnk
    	$(REMOVE) $(TARGET).lss
    	$(REMOVE) $(OBJ)
    	$(REMOVE) $(LST)
    	$(REMOVE) $(SRC:.c=.s)
    	$(REMOVE) $(SRC:.c=.d)
    
    
    # Automatically generate C source code dependencies. 
    # (Code originally taken from the GNU make user manual and modified 
    # (See README.txt Credits).)
    #
    # Note that this will work with sh (bash) and sed that is shipped with WinAVR
    # (see the SHELL variable defined above).
    # This may not work with other shells or other seds.
    #
    %.d: %.c
    	set -e; $(CC) -MM $(ALL_CFLAGS) $< \
    	| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
    	[ -s $@ ] || rm -f $@
    
    
    # Remove the '-' if you want to see the dependency files generated.
    -include $(SRC:.c=.d)
    
    
    
    # Listing of phony targets.
    .PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
    	clean clean_list program
    Beste Grüße
    Simsys

  10. #30
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Simsys,

    Klasse. Gut dokumentierte Beispielprogramme sind natürlich ebenfalls willkommen. Falls es sonst noch Beispielcode gibt, entweder etwas neues oder die Verbesserung der bestehenden Programme, immer her damit.

Seite 3 von 12 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests