- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 6 von 6

Thema: Software für Roboer funktioniert nicht wie erwartet

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Punkt 1:

    Watchdog ist nicht aktiv

    Punkt 2:

    init_timer1() ist die funktion aus der Library für das RN-Control aus dem Wiki.

    Code:
    void init_timer1(void)    //Initialisierung des Timers für Erzeugung des PWM-Signals
    {
       /* normale 8-bit PWM aktivieren (nicht invertiert),
       Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
       TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
    
       /* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
       TCCR1B = (1<<CS10);
    
       /* Interrupts für Timer1 deaktivieren
       Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
       TIMSK &= ~0x3c;
    }
    Punkt 3:

    Der 7805 sollte eigentlich nicht beim Anlaufen der Motoren in die Knie gehen, das Beschleunigen und Abbremsen der Motoren mit dem Code aus dem Demoprogramm funktioniert einwandfrei.

    Code:
        Mlinksvor();
        Mrechtsvor();
    
        setPWMlinks(0);
        setPWMrechts(0);
        waitms(40);
    
        for(uint8_t i=0; i<255; i=i+5)
        {
            setPWMlinks(i);
            setPWMrechts(i);
            waitms(40);
        }
    
        setPWMlinks(255);
        setPWMrechts(255);
        waitms(40);
    
        for(uint8_t i=255; i>0; i=i-5)
        {
            setPWMlinks(i);
            setPWMrechts(i);
            waitms(40);
        }
    
        setPWMlinks(0);
        setPWMrechts(0);
    
        Mlinksstop();
        Mrechtsstop();
        waitms(300);

    Edit: Der Controller resettet sich nicht ständig selber. Dies habe ich gerprüft, indem ich vor der Hauptschleife des Programms den Controller einfach eine kleine Tonfolge abspielen lassen habe. Die Motoren laufen immer wieder von neuem an, die Tonfolge ist jedoch nur beim Einschalten zu hören. Somit kann es schonmal nichts mehr mit Resets aufgrundvon was auch immer zu tun haben...

    Aktueller Code:

    Code:
    /*
     * Master.c
     *
     * Created: 02.08.2011 07:56:05
     *  Author: Torrentula
     */ 
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include "twimaster.c"
    #include "rncontrol.h"
    
    uint8_t data = 0;
    
    void getDistance(void){
    
        i2c_start_wait(0x50+I2C_WRITE);
        i2c_write(0xB8);
        i2c_stop();
        
        i2c_rep_start(0x50+I2C_READ);
        data = i2c_readNak();
        i2c_stop();
        
        if(data == 0){                        // request new data from SRF05 if the distance is 0cm
            i2c_start_wait(0x50+I2C_WRITE);
            i2c_write(0xB8);
            i2c_stop();
        
            i2c_rep_start(0x50+I2C_READ);
            data = i2c_readNak();
            i2c_stop();    
        }
    }
    
    void accelerate(void){
                           
                Mrechtsvor();
                Mlinksvor();
                
                for(uint8_t i = 0; i <= 200; i += 10){
                    setPWMlinks(i);
                    setPWMrechts(i);
                    _delay_ms(20);
                }    
                
                setPWMlinks(200);    
                setPWMrechts(200);
    }
    
    void slowdown(void){
                                
                    for(uint8_t i = 200; i >= 0; i -= 10){
                        setPWMlinks(i);
                        setPWMrechts(i);
                        _delay_ms(20);
                    }    
                
                    setPWMlinks(0);    
                    setPWMrechts(0);
                
                    Mlinksstop();
                    Mrechtsstop();
    }
    
    void goBack(void){
        
                Mrechtszur();
                Mlinkszur();
                
                for(uint8_t i = 0; i <= 200; i += 10){
                    setPWMlinks(i);
                    setPWMrechts(i);
                    _delay_ms(20);
                }    
                
                setPWMlinks(200);    
                setPWMrechts(200);
                _delay_ms(1000);
                
                for(uint8_t i = 200; i >= 0; i -= 10){
                    setPWMlinks(i);
                    setPWMrechts(i);
                    _delay_ms(20);
                }
                
                Mlinksstop();
                Mrechtsstop();
    }
    
    void leftTurn(void){
        
        // Turn a bit
            
                    Mlinkszur();
                    Mrechtsvor();
                    
                    for(uint8_t i = 0; i <= 200; i += 10){
                        setPWMlinks(i);
                        setPWMrechts(i);
                        _delay_ms(20);
                    }
                    
                    setPWMlinks(200);
                    setPWMrechts(200);
                    
                    while(data <= 50){
                        
                        getDistance();
                    }        
                    
                    for(uint8_t i = 200; i >= 0; i -= 10){
                        setPWMlinks(i);
                        setPWMrechts(i);
                        _delay_ms(20);
                    }
                    
                    setPWMlinks(0);    
                    setPWMrechts(0);
                
                    Mlinksstop();
                    Mrechtsstop();
                    
                    accelerate();
        
    }
    
    int main(void)
    {
        
        i2c_init();
        init_timer1();
        
        DDRB |= 0x03; // Channels for right motor
        DDRC |= 0xC0; // Channels for left motor
        DDRD |= 0xB0; // PWM-Channels for motors  
        
        sound(6, 270); //Startmelodie
        sound(8, 270);
        sound(11, 270);
        sound(7, 270);
        waitms(10);
        sound(7, 270);
        sound(6, 270);
        sound(11, 540);
        
        accelerate();
    
        while(1)
        {             
            getDistance();
            
            while(data > 50){
                
                // Just wait 
                getDistance();
            }    
                slowdown();
                goBack();
                leftTurn();
        }
    }
    Hoffe jemand anderes hat noch eine Idee....
    Geändert von Torrentula (05.08.2011 um 18:00 Uhr)
    MfG Torrentula

Ähnliche Themen

  1. 'volatile' funktioniert nicht mehr wie erwartet?
    Von vklaffehn im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 31.07.2011, 10:53
  2. Compiler-Software unter Linux funktioniert nicht
    Von karmic_koala im Forum Robby RP6
    Antworten: 18
    Letzter Beitrag: 13.06.2010, 15:15
  3. Wiso funktioniert meine Software für den ATmega88 nicht ??
    Von rob_88_20p im Forum C - Programmierung (GCC u.a.)
    Antworten: 39
    Letzter Beitrag: 26.07.2008, 21:43
  4. Delay ist schneller als erwartet??
    Von Charly_cs im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 11.11.2006, 18:12
  5. Professor erwartet Massenmarkt für Roboter
    Von Mehto im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 3
    Letzter Beitrag: 31.05.2006, 18:27

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests