-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Probleme bei Programmierung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.12.2010
    Beiträge
    22

    Probleme bei Programmierung

    Anzeige

    Hi Leute,
    ich hab mich mal wieder an meinen NIBO2 gewagt um etwas zu programmieren.
    Das Programm, soll den Nibo solange geradeaus fahren lassen, bis der Wert des copro_distance[2] größer als 3 wird.
    Aber, der Motor schaltet irgendwie nicht ab. (letztendlich geht es nur um den unteren teil des Programms).
    Code:
    #include <nibo/niboconfig.h>
    #include <nibo/display.h>
    #include <nibo/gfx.h>
    #include <nibo/copro.h>
    #include <nibo/delay.h>
    #include <nibo/iodefs.h>
    #include <nibo/bot.h>
    #include <avr/interrupt.h>
    #include <nibo/spi.h>
    #include <stdio.h>
    #include <nibo/leds.h>
    #include <stdint.h>
    #include <nibo/pwm.h>
    
    
    
    int main() {
    sei();
    bot_init();
    spi_init();
    display_init();
    leds_init ();
    pwm_init ();
    //-------------------------------------------------------
    copro_ir_startMeasure();
    
    
    //-------------------------------------------------------
    leds_set_headlights (1024);                                        //Frontlicht setzen
    leds_set_status(LEDS_GREEN, 2);
    leds_set_status(LEDS_GREEN, 3);
    //-------------------------------------------------------
    
    void blinker_links () {                                            // Blinker Links definieren
    int a = 1;
    while (a<=10){
    leds_set_status (LEDS_ORANGE, 0);
    leds_set_status (LEDS_ORANGE, 1);
    delay (100);
    leds_set_status (LEDS_OFF, 0);
    leds_set_status (LEDS_OFF, 1);
    delay (100);
    a++;
    }
    }
    //-------------------------------------------------------
    void blinker_rechts () {
    int b = 1;
    while(b<=10)                                                    // Blinker Rechts definieren
    {
    leds_set_status (LEDS_ORANGE, 4);
    leds_set_status (LEDS_ORANGE, 5);
    delay (100);
    leds_set_status (LEDS_OFF, 4);
    leds_set_status (LEDS_OFF, 5);
    delay (100);
    b++;
    }
    }
    //-------------------------------------------------------
    void warnblinker () {
    int c = 1;
    while(c<=10)                                                    // Warnblinker definieren
    {
    leds_set_status (LEDS_ORANGE, 0);
    leds_set_status (LEDS_ORANGE, 1);
    leds_set_status (LEDS_ORANGE, 4);
    leds_set_status (LEDS_ORANGE, 5);
    delay (100);
    leds_set_status (LEDS_OFF, 0);
    leds_set_status (LEDS_OFF, 1);
    leds_set_status (LEDS_OFF, 4);
    leds_set_status (LEDS_OFF, 5);
    delay (100);
    c++;
    }
    }
    //-------------------------------------------------------        
    copro_ir_startMeasure();
    copro_setSpeedParameters(5, 6, 7);
    
    
    void motor_geradeaus (){
    while(1==1){
    copro_setSpeed(20, 20);
    }
    }
    //-------------------------------------------------------
    
    while(1==1){
    delay(10);
    char text[20]="-- -- -- -- --";
    // Co-Prozessor
    if (copro_update()) {
    sprintf(text, "x x x x x",
    (uint16_t)copro_distance[0]/256,
    (uint16_t)copro_distance[1]/256,
    (uint16_t)copro_distance[2]/256,
    (uint16_t)copro_distance[3]/256,
    (uint16_t)copro_distance[4]/256);
    
    
    while(copro_distance[2]<3){
    motor_geradeaus ();
    }
    }
    }
    return 0;
    }
    mfg freekwave

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Ich kenn den NIBO2 zwar nicht aber die Programmiersprache ist ja C und du hast in dem Teil wo der Motor gesteuert wird folgendes stehen:

    while(1==1){
    copro_setSpeed(20, 20);
    }

    Die Schleife wird solange ausgeführt wie 1 = 1 ist, also die Bedingung wahr ist. Da 1 ein fester Wert ist und du nicht z.B. geschrieben hast Variable = 1, ändert sich dieser Wert im laufenden Programm nie und der Controller hängt quasi in einer Endlosschleife fest wo er den Befehl:

    copro_setSpeed(20, 20);

    andauernd ausführt.
    Den selben Fehler hast du auch in dem Programmteil unter dem Motorteil gemacht, nur dieser Fehler macht sich noch(!) nicht bemerkbar, weil der Controller halt wie gesagt schon vorher in einer Endlosschleife festhängt.
    Wenn du das korrigierst sollte es eigentlich funktionieren
    Hier steht das nochmal auf Seite 12 erklärt:

    http://download.nicai-systems.com/ni...l_20110909.pdf
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.12.2010
    Beiträge
    22
    leider nicht, ich habe die zwei besagten while schleifen rausgenommen, aber es funktioniert iwi immoment komplett nicht. d.h. die Motoren gehen nach den einschalten sofort an, egal ob vor den Sensoren etwas ist oder nicht.

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Hast du den auch mal die Werte aus diesem Befehl entfernt:

    while(1==1){
    copro_setSpeed(20, 20);
    }

    ?
    Du musst die Werte denk ich mal auch aus dem Befehl löschen also z.B. wenn ein Hinderniss erkannt wird die Werte von 20 auf 0 umändern. Du hast ja in deinem Programm keine Bedingung unter welcher dieser Befehl ausgeführt werden soll. Da steht einfach nur das die Motoren sich mit einem Speed von 20, 20 drehen sollen und nicht

    if(Bedingung)
    {
    Motor soll sich drehen
    }

    Wie gesagt ich kenn deinen Bot nicht und kann es leider auch nicht testen aber die Tatsache das sich die Motoren drehen deutet ja darauf hin das dieser Befehl andauernd ausgeführt wird. Was du machen könntest ist erstmal alles unnötige ausklammern und dann mit einfachen Print-Befehlen eine Art Debug-Schnittstelle zu machen, also das du nach jedem

    copro_setSpeed(20, 20);

    eine Ausgabe über UART machst. So siehst du wann der Befehl ausgeführt wird und ob der Befehl die ganze Zeit ausgeführt wird.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    30.11.2009
    Ort
    Gütersloh
    Beiträge
    46
    Um die Motoren zu stoppen ist lediglich ein _copro_stopImmediate();_ nötig.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von Hero_123
    Registriert seit
    29.08.2010
    Beiträge
    202
    Hallo freekwave

    1.) "copro_setSpeed(20,20)" heißt, dass der NIBO2 mit ca 7cm/s (linkes Rad, rechtes Rad) fahren soll - und das macht er, bis er entweder einen Stopp-Befehl erhält oder man die Speed ("copro_setSpeed(0,0)" auf NULL setzt.
    2.) Ich habe mir mal kurz Dein Programm angesehen - man sollte in der main keine Funktionen deklarieren, sondern sie nur verwenden; die Deklaration sollte außerhalbe der main erfolgen
    3.) mit while(1==1) in einer Funktion zu arbeiten ist sehr gefährlich, da gibt es keine Abbruchbedingung => wird IMMER WEITER durchgeführt
    4.) "while(copro_distance[2]<3){ motor_geradeaus (); }" => das fkt so nicht, denn: solange der Abstand < 3 ist, soll der NIBO geradeaus fahren => Du liest aber in der while-schleife NIE den neuen Abstand ein(copro_update!!)

    mfg


    Hero_123

    Arroganz ist die Perücke auf der Glatze der Unwissenheit

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.11.2009
    Ort
    Gütersloh
    Beiträge
    46
    Hallo.

    Ich hätte da auch mal eine Frage zur Programmierung und zwar würde ich gerne
    Mittels nds3_get_dist(); ermittelte Werte über XBee versenden. Den ermittelten
    Wert speicher ich wie folgt:

    uint8_t dist_val1 = nds3_get_dist();

    Über XBee lassen sich anscheinend nur Zeichen im Hex-Format versenden.
    Mein Problem ist jetzt irgendwie den gespeicherten Wert in dist_val1 in
    einzelne Hex Werte zu zerlegen. Mir wäre schon geholfen, wenn ich wüßte,
    wie ich den Wert in dist_val1 in einen _array_ kriegen würde. Natürlich nicht
    als _string_, sondern irgendwie in der Form array[0]=1; array[1]=8; array[2]=0;
    Besser wäre natürlich noch array[0]=0x31; array[1]=0x38; array[2]=0x30;.

    Vielen Dank.

    Lieben Gruß
    sourcecode

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von Hero_123
    Registriert seit
    29.08.2010
    Beiträge
    202
    Hallo sourcecode

    mal ein paar Fragen zu Deinen XBEEs - wie hast Du die denn konfiguriert, mit welcher Baudrate sendest Du, welches Terminalprogramm verwendest Du, wie hast du den FDT-Treiber konfiguriert?

    Ich habe bei meinen XBEE Modulen ein seltsames Phänomen - ich verwende als Anzeige hterm, ein XBEE ist als Enddevice, das andere als Coordinator konfiguriert (hängt am PC - USB). Wenn ich nun das erste Mal das Modul am USB anstecke, hterm starte und den NIBO einschalte (der dann sofort das Senden beginnt), empfange ich die Daten am PC problemlos. Wenn ich das hterm beende ("disconnect" und Programm beenden) und dann wieder starte und connecte, empfange ich weiterhin Daten (soweit, so gut).
    Wenn ich nun mich wieder disconnecte, den NIBO AUSSCHALTE und nach ca 3 min wieder EINSCHALTE und mit hterm wieder Daten empfangen will, fkt es nicht mehr - ich empfange einfach keine Daten mehr vom NIBO, obwohl er sendet; ich kann aber Daten an den NIBO senden. Erst wenn ich alles ausschalte (also auch den PC neu boote) kann ich wieder daten vom NIBO empfangen...
    Hast Du dieses Phänomen auch schon mal gehabt, dass keine Daten mehr empfangen werden, wenn der NIBO aus- und dann nach ca 3 min wieder eingeschaltet wird???

    Hero_123
    Arroganz ist die Perücke auf der Glatze der Unwissenheit

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.11.2009
    Ort
    Gütersloh
    Beiträge
    46
    Hallo Hero_123,

    das Phänomen kann ich nur bestätigen. Passiert bei mir von Zeit zur Zeit auch.
    Manchmal reicht es den XBee-Explorer (USB) aus zu stöpseln und wieder ein
    zu stöpseln - manchmal muß ich auch komplett den Rechner neu starten.

    Konfiguriert habe ich die XBee's ebenfalls als Coordinator und Enddevice. Baudrate 57600.
    Als Terminalprogramm verwende ich X-CTU.
    FTDI-Treiber Konfiguration: Senden/Empfangen 4096 Bytes
    Wartezeit: 1ms
    Timeouts Lesen/Schreiben: 0

    sourcecode

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von Hero_123
    Registriert seit
    29.08.2010
    Beiträge
    202
    Hallo sourcecode

    Einerseits freuts mich, dass Du die gleichen Probleme hast wie ich - anderseits ist das echt sch*** - könnte mir vorstellen, dass es am FTDI-Treiber liegt, habe es mit dem "alten" und dem "neuesten" Treiber ausprobiert - kein Unterschied...werden wohl damit leben müssen (also den NIBO NICHT ausschalten)..mein Treiber ist wie Deiner konfiguriert; ein wirklich gutes Terminalprogramm ist hterm - läuft auch auf WIN 7!

    Zu Deiner Frage - ich übertrage mit dem XBEE z.B die Drehzahl und lass sie mir im hterm als Dezimalwert anzeigen - dazu wandle ich den Wert und speicher ihn und schicke dann den Wert charweise über das XBEE-Modul: anbei einige Code-Schnipsel:

    #define buf 80 /* Groesse Char-Buffer Wert einlesen - Empfangsbuffer */
    char buf_ges[buf]; /* gesamter Buffer zum Werte rausschreiben */
    char temp_buf[8]; /* temporaerer Buffer zum zwischenspeichern */



    itoa((int8_t)copro_speed_l, temp_buf, 10); /* umwandeln und speichern der Speed links */
    strcat(buf_ges, temp_buf);
    usart_puts(buf_ges);


    /* Funktion, um Character auf Terminal auszugeben */
    extern void usart_putc(unsigned char c) {
    while(!(UCSR1A & (1 << UDRE1))){
    }
    UDR1 = c;
    }

    /* Funktion, um String auf Terminal auszugeben */
    extern void usart_puts(char *s) {
    while (*s){ /* solange nicht Stringende erreicht */
    usart_putc(*s); /* Aufruf Fkt usart_putc(*s) */
    s++; /* Zeichen um 1 weiter zaehlen */
    }
    }

    hoffe, das hilft ....

    Hero_123

    edit: habe vergessen zu erwähnen, dass bei mir über den UART1 gesendet wird (ich habe mir meine eigenen UART1-Fkt geschrieben), das XBEE Modul habe ich über SteckerX6 angeschlossen; verwendest Du das XBEE-Modul von nicai?
    Geändert von Hero_123 (22.12.2011 um 22:54 Uhr)
    Arroganz ist die Perücke auf der Glatze der Unwissenheit

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Probleme mit der Asuro Programmierung...:(
    Von RobinHood im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 10.04.2010, 16:30
  2. Probleme bei Programmierung des Atmege32
    Von Daniel1979 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 01.04.2008, 16:29
  3. Probleme bei AVR Butterfly-Programmierung
    Von Youngtimer im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 21.11.2007, 19:01
  4. tiny13 Probleme mit Programmierung
    Von gulliver im Forum Assembler-Programmierung
    Antworten: 13
    Letzter Beitrag: 07.10.2007, 23:19
  5. Probleme mit IR/RC5 Programmierung
    Von Lutz im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 8
    Letzter Beitrag: 09.03.2005, 18:31

Berechtigungen

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