- LiFePO4 Speicher Test         
Ergebnis 41 bis 50 von 55

Thema: Quadrocopter (Dimensionierung)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #34
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hi!

    So, jetzt passiert endlich mal was.
    Letzte Woche sind die Bauteile für die Fernbedienung angekommen, habe dann gleich eine Platine geätzt und bestückt.
    Nach 3 Stunden probieren wusste ich dann auch, dass der Kondensator an Reset zum Programmieren weg muss
    Dann lief erstmal alles gut, Ansteuerung für Dualshock war schnell geschrieben, Kommunikation zum PC läuft auch ohne Probleme und das Funkmodul scheint auch zu funktionieren.
    Xmegas sind echt toll.

    Jedenfalls habe ich jetzt doch ein Problem, dass ich mir einfach nicht erklären kann.
    In meinem Programm sende ich dem Xbee 3 Plus Zeichen um es in den Command Mode zu versetzen, danach soll es ein "OK<CR>" zur Bestätigung senden.
    Das kommt auch definitiv an.
    Jedenfalls möchte ich die Zeichen, die das Xbee sendet in einer Interrupt Routine in ein Char Array schreiben, das später durch die Debug() Funktion an den PC übertragen werden soll.
    In der Funktion gebe ich auch die Zählvariable ISRCounter aus, die in der Interrupt Routine hochgezählt werden soll.
    Außerdem Toggle ich in der ISR das untere Nibble von PORTB, dadurch sehe ich an den LEDs, dass die ISR auch ausgeführt wird.
    Das Problem ist, dass der ISRCounter immer seinen Ursprungswert behält, in dem Fall 0, ich habe es aber auch mal oben mit 1 definiert, auch dabei bleibt der Wert 1.
    Ich kann mir das einfach nicht erklären, der Wert ist auch volatil und global, aber er ändert sich einfach nicht.
    Hier das Hauptprogramm:
    Code:
    #include "Dualshock.h"
    
    
    volatile char USARTdata[20];
    volatile uint8_t ISRCounter = 0;
    
    
    void DebugOut()
    {
        while(!(USARTD0.STATUS & USART_DREIF_bm));
        USARTD0.DATA = ISRCounter;
        for(uint8_t i = 0; ((USARTdata[i - 1] != 13) && (i < 20));i++)
        {
            if(USARTdata[i] != 0x00)
            {
                while(!(USARTD0.STATUS & USART_DREIF_bm));
                USARTD0.DATA = i;
                
                while(!(USARTD0.STATUS & USART_DREIF_bm));
                USARTD0.DATA = USARTdata[i];
            }
            
        }
    
    
    }
    
    
    
    
    int main(void)
    {
        Init::Clock_Init();
        Init::USART_Init();
        PMIC.CTRL |= PMIC_HILVLEN_bm; //High Level Interrupts freigeben
        sei();
        
        PORTB.DIR = 0xFF;
        PORTB.OUT = 0x00;
        Dualshock::init();
        while (!(Dualshock::SetAnalogMode() == 0x73)); //Versuchen in Analog Mode zu wechseln, bis es funktioniert        
        
        _delay_ms(1000); //Funkmodul in Command Mode
        while(!(USARTC0.STATUS & USART_DREIF_bm));
        USARTC0.DATA = '+';
        while(!(USARTC0.STATUS & USART_DREIF_bm));
        USARTC0.DATA = '+';
        while(!(USARTC0.STATUS & USART_DREIF_bm));
        USARTC0.DATA = '+';
        _delay_ms(1000);
        
        DebugOut();
        while(1)
        {
        Dualshock::getBytes();
        //while (!( USARTD0.STATUS & USART_DREIF_bm));
        //USARTD0.DATA = Dualshock::RightY;
        //while (!( USARTD0.STATUS & USART_DREIF_bm));
        //USARTD0.DATA = Dualshock::RightX;
        //PORTB.OUT = (Dualshock::RightX & 0x0F);
        
        }
    }
    
    
    ISR (USARTC0_RXC_vect)
    {
        USARTdata[ISRCounter] = USARTC0.DATA;
        PORTB.OUTTGL = 0x0F;
        //if(USARTdata[ISRCounter] == 13)
        //ISRCounter = 0;
        //else
        ISRCounter ++;
    }
    Kann sich das jemand erklären?

    Ich habe mal darauf verzichtet, die Klassen zu Posten, die Funktionen sollten soweit selbsterklärend sein.
    Falls jemand Interesse hat kann ich natürlich die Dualshock Klasse hochladen.

    Edit:
    Habe das Problem jetzt gelöst bekommen.
    Problem war einfach nur, dass das Xbee etwas mehr als eine Sekunde braucht um nach dem empfangen der "+++" Zeichenfolge das OK zurückzuschicken.
    Deshalb wurde zu dem Zeitpunkt, wo die Debug Funktion aufgerufen wird noch kein einziges mal die ISR ausgeführt.
    Echt mies, dass ich erst jetzt drauf gekommen bin, naja egal, jetzt läuft alles bestens.
    Hoffe, dass der Kram aus China bald ankommt, langsam wird es langweilig mit der Fernbedienung.

    mfg
    Olaf
    Geändert von crabtack (05.11.2014 um 19:27 Uhr)

Ähnliche Themen

  1. Motor-Dimensionierung
    Von Optix im Forum Motoren
    Antworten: 7
    Letzter Beitrag: 10.04.2011, 14:00
  2. Schaltregler-Dimensionierung
    Von OnkelTobi im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 23.08.2007, 19:52
  3. Brückengleichrichter -- Dimensionierung
    Von outdoorgamer im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 08.07.2007, 15:33
  4. Dimensionierung Trafo
    Von direct_y im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 10.06.2007, 14:11
  5. Dimensionierung Manipulator
    Von Brini im Forum Mechanik
    Antworten: 16
    Letzter Beitrag: 06.02.2006, 20:04

Stichworte

Berechtigungen

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

Labornetzteil AliExpress