- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 20

Thema: 250µs-Timer für Arduino Due

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    ja, ich brauchte ihn, weil ich
    - mindestens annähernd so viele I/Os brauche wie beim Mega für meine 6-8 Encodermotore mit pwm (5 digit. pins pro Motor)
    - multitaskingfähig
    - 2 unabhängige Hardware-i2c-Ports, beide als Slave benutzbar
    - mehr Speicher für anspruchsvollere Programme (mindestens ~100k RAM, am liebsten noch mehr)
    - und mehr Rechenpower, mindestens 10x so schnell wie die AVRs (Mega), was der Due ja kann.
    - eine einfache IDE wie Sketch war auch Vorraussetzung, Eclipse oder VS sind für mich der Horror.

    nu hab ich ihn als Hardware - und hoffte eigentlich, die Arduino-Entwickler haben auch an den Soft-Teil gedacht, um ihn auch nutzen zu können...

    aber zurück zum 1. Fragenkomplex -

    kennst du die Scheduler-Lib, und falls ja:
    - was hälst du davon
    - und denkst du, man kann extra-loops für Encoder Reading verwenden ?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Nachtrag:

    Die mbed-Beispiele für Encoder verwenden alle Interrupts:
    http://developer.mbed.org/cookbook/QEI
    http://developer.mbed.org/teams/OpenMoCo/code/QEIx4/

    Das sollte man mit dem Due und Standard-Arduino Code eigentlich nachbauen können.
    The Arduino Due board has powerful interrupt capabilities that allows you to attach an interrupt function on all available pins. You can directly specify the pin number in attachInterrupt().
    - - - Aktualisiert - - -

    Zitat Zitat von HaWe Beitrag anzeigen
    kennst du die Scheduler-Lib, und falls ja:
    Nur mal kurz angesehen, nie in einem Projekt benutzt. Ich verwende mbed-RTOS.

    Für Encoder würde ich eher zu Interrupts tendieren. S.o.

  3. #3
    HaWe
    Gast
    zu den Links:
    http://developer.mbed.org/cookbook/QEI
    http://developer.mbed.org/teams/OpenMoCo/code/QEIx4/

    ...was man da jetzt für die Encoder als libs (Ordner) in den Arduino-Sketch-Ordner kopieren muss, und wie das dann im Sketch-Programm später aussieht, erkenne ich da ehrlich gesagt nicht so recht...

    mbed-RTOS ist mir zu schwierig, denke ich.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Kopieren soll man da nichts.

    Man muss das in Sketch nachprogrammieren. Dazu schaut man sich den Source an, z.B.
    http://developer.mbed.org/users/aber...1551aa/QEI.cpp

    Da tauchen Sachen auf wie
    Code:
    QEI::QEI(PinName channelA,
             PinName channelB,
    und
    Code:
        channelA_.rise(this, &QEI::encode);
        channelA_.fall(this, &QEI::encode);
     
        //If we're using X4 encoding, then attach interrupts to channel B too.
        if (encoding == X4_ENCODING) {
            channelB_.rise(this, &QEI::encode);
            channelB_.fall(this, &QEI::encode);
        }
    D.h. es gibt da Pins für Channel A und B. Steigenden und fallenden Flanken daran werden Funktionen zugeordnet, hier überall die gleiche.

    So was ähnliches muss man sich in Sketch auch schreiben.

  5. #5
    HaWe
    Gast
    ach so, ganz neu schreiben - das hatte ich nicht verstanden, ich dachte bis jetzt, das wäre schon für Sketch.
    Das kann ich allerdings leider nicht, dazu verstehe ich zuwenig davon, und C++ kann ich überhaupt nicht - nur nacktes C (oder eben extrem abgespeckte Objekte wie z.B. Serial und entsprechend automatisch included und aufbereitet wie in Sketch).

  6. #6
    HaWe
    Gast
    heißt das etwa, es gibt keine fertigen Sketch-Beispielcodes für Due-Timer ???

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Was ist mit der Lib, die Google gleich als erstes findet ?
    https://github.com/ivanseidel/DueTimer

    Wenn man mal in die DueTimer.cpp schaut, sieht man, dass sich das ganze doch etwas vom AVR unterscheidet.
    Die Registerzugriffe scheinen aber auch beim Due schon durch Funktionen gekapselt zu sein. Was da an Libraries
    in Arduino 1.5.x alles steckt, scheint aber nirgends richtig dokumentiert zu sein.

  8. #8
    HaWe
    Gast
    ah - jetzt verstehe ich...
    es ist ganz anders als die AVR-Variante. ich hatte nicht an so eine komplette lib gedacht.
    Das Programm sieht ja ausgesprochen simpel aus, viel einfacher als das oben für den AVR:

    Code:
    #include <DueTimer.h>
    
    int myLed = 13;
    
    bool ledOn = false;
    
    void myHandler(){
    	ledOn = !ledOn;
    
    	digitalWrite(myLed, ledOn); // Led on, off, on, off...
    }
    
    void setup(){
    	pinMode(myLed, OUTPUT);
    
    	Timer3.attachInterrupt(myHandler);
    	Timer3.start(500000); // Calls every 500ms
    }
    
    void loop(){
    
    	while(1){
    		// I'm stuck in here! help me...
    	}
    	
    }
    Hier wird dann ja wohl Timer 3 verwendet, bei mir oben war es glaube ich Timer 1 und alle 250µs, dann also
    Timer1.attachInterrupt(myHandler);
    Timer1.start(250); // Calls every 250µs

    in myHandler dann meine ISR arrays
    Code:
    volatile long   motenc[MAXMOTORS]    = {0, 0, 0, 0, 0, 0},
                    oldenc[MAXMOTORS]    = {0, 0, 0, 0, 0, 0};
    int8_t schrittTab[16] = {0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0};
    
    volatile int8_t ISRab[MAXMOTORS]     = {0, 0, 0, 0, 0, 0};
    
    void myHandler() {  // read encoder values
    
      ISRab [ 0] <<= 2;
      ISRab [ 0] &= B00001100;
      ISRab [ 0] |= (digitalRead(pinenc0A) << 1) | digitalRead(pinenc0B);
      motenc[ 0] += schrittTab[ISRab[0]];           //
    
      ISRab [ 1] <<= 2;
      ISRab [ 1] &= B00001100;
      ISRab [ 1] |= (digitalRead(pinenc1A) << 1) | digitalRead(pinenc1B);
      motenc[ 1] += schrittTab[ISRab[1]];           //
    
      ISRab [ 2] <<= 2;
      ISRab [ 2] &= B00001100;
      ISRab [ 2] |= (digitalRead(pinenc2A) << 1) | digitalRead(pinenc2B);
      motenc[ 2] += schrittTab[ISRab[2]];           //
    
      ISRab [ 3] <<= 2;
      ISRab [ 3] &= B00001100;
      ISRab [ 3] |= (digitalRead(pinenc3A) << 1) | digitalRead(pinenc3B);
      motenc[ 3] += schrittTab[ISRab[3]];           //
    
      ISRab [ 4] <<= 2;
      ISRab [ 4] &= B00001100;
      ISRab [ 4] |= (digitalRead(pinenc4A) << 1) | digitalRead(pinenc4B);
      motenc[ 4] += schrittTab[ISRab[4]];           //
    
      ISRab [ 5] <<= 2;
      ISRab [ 5] &= B00001100;
      ISRab [ 5] |= (digitalRead(pinenc5A) << 1) | digitalRead(pinenc5B);
      motenc[ 5] += schrittTab[ISRab[5]];           //
    
    }
    - müsste dann doch so funktionieren...? Werde ich gleich am Wochenende austesten!

    Ein ganz herzliches Dankeschön! 8-)
    Geändert von HaWe (21.11.2014 um 16:52 Uhr)

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Ein Problem bei deinem Code dürfte das digitalRead() sein. Das ist bei Arduinos als ziemlich langsam verrufen.

    Bei mbed gibt es da die Möglichkeit mit PortIn alle 32 Pins eines Ports auf einmal zu lesen, das wäre für die Abfrage mehrerer Encoder sicher viel besser.

    Eventuell gibt es in den Untiefen der Arduino Software dafür auch Funktionen ...

Ähnliche Themen

  1. G-Code Interpreter Arduino Due, CNC-Fräse
    Von stevie3354 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 9
    Letzter Beitrag: 26.12.2014, 15:36
  2. [ERLEDIGT] I2C Problem mit dem Arduino DUE
    Von jok3r im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 2
    Letzter Beitrag: 22.03.2014, 12:21
  3. Arduino Due + Treiber + Schrittmotor PROBLEM
    Von stevie3354 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 30.01.2014, 23:11
  4. Arduino Due HSMCI - SD/SDIO/MMC
    Von Superhirn im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 0
    Letzter Beitrag: 25.01.2013, 10:57
  5. Arduino Due erschienen
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 24.10.2012, 22:20

Berechtigungen

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

12V Akku bauen