-
        

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

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

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454

    250µs-Timer für Arduino Due

    Anzeige

    hallo,
    kennt jemand Beispiel-Sketche, wie man Timer auf dem Due programmiert?
    Ich habe nur die alten Codes für die IRQs mit den völlig unleserlichen und uverständlichen AVR-Codes wie

    Code:
    // (in setup() 
      noInterrupts(); 
      TIMSK1 |= (1 << OCIE1A); 
      TCCR1A = 0;            
      TCCR1B = (1 << WGM12) | (1 << CS11); 
      OCR1A = 511; 
      interrupts();
    plus zugehöriger ISR
    Code:
    ISR(TIMER1_COMPA_vect) {  // 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]];           //
    
    }

    Alles ziemlich verkorkst, aber funktioniert wenigstens.

    Aber wie geht jetzt Auslesen von Quadratur-Encodern etc. in festen 200-250µs-Zeitabständen auf dem Due ?
    Geändert von HaWe (19.11.2014 um 16:40 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454
    weiß evtl jemand, wie es auf dem Beaglebone Black gemacht wird?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Hallo,

    völlig unleserliche und unverständliche AVR-Codes kannst du für den Due vergessen. Da brauchst du unleserliche und unverständliche SAM3 Codes.

    Die ARM Cortex liefern zwar das Grundgerüst, aber Timer sind bei ARM Controllern dann wieder herstellerspezifisch ausgeführt. Da hilft nur ein Blick in dieses schöne 1800 seitige Datenblatt vom Prozessor ...

    Das ist ein Grund, warum mein Due meist unbenutzt rumliegt. Einfache Timergeschichten gehen mit mbed-fähigen ARM Controllern viel einfacher.
    http://developer.mbed.org/handbook/Ticker
    http://developer.mbed.org/handbook/RTOS#rtos-timer
    Wenn das nicht reicht, wird es aber auch wieder herstellerspezifisch ...

    Der Beaglebone läuft ja normalerweise unter Linux, da werden die Timer des ARM vom Betriebssystem verwendet. Es gibt allerdings auch Timereingänge z.B. zur Frequenzmessung. Für zeitkritische Hardware Sachen hat der Beaglebone die PRUs, das sind zwei eigene Kerne (kein ARM, kein Linux) auf dem Chip.

    Quadraturencoder lesen ist bei solchen Prozessoren wie dem TI Sitara aber auch als Hardware verfügbar:
    http://www.adafruit.com/blog/2014/07...eagleboardorg/

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454
    haha, "Da brauchst du unleserliche und unverständliche SAM3 Codes."
    und der ist auch gut: "dieses schöne 1800 seitige Datenblatt vom Prozessor ..."

    na wunderbar :-/

    rtos sieht zwar auf den ersten Blick gar nicht sooo schwierig aus -
    (edit - ok - auf den zweiten allerdings schon... )
    ich hatte mir aber auch schon überlegt, die Scheduler-Lib zu benutzen, wenn das nicht geht.

    z.B per
    void loop1() { // neue Endlosschleife //
    // Encoderstellungen auslesen //
    // dann irgendwie berechnen //
    // dann ein Yield() fürs koop. Multitasking //
    // dann vllt ein paar µs warten //
    }

    Hast du Erfahrung mit der Scheduler-Lib?

    Zeitscheibenverhalten (Echtzeit ist es sicher nicht) ist dann aber nur die eine Sache,
    aber die andere ist dann Encoder auslesen und berechnen - das muss dann ja auch wieder von Grund auf neu programmiert werden

    Fangen wir beim 1. Problem mal an:
    Was hältst du / haltet ihr von der Scheduler-Lib ?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Na dann antworte ich mal für mich.

    Der Due ist ganz nützlich, wenn ich mal einen Controller mit vielen IOs und vielen UARTs brauche. Ansonsten halte ich vom Due und der zugehörigen Arduino Software nicht viel. Der Due ist nur eine Durchgangsstation, die echten Fans ignorieren ihn. Wer sich darauf einlässt, erkennt schnell, dass es bessere Alternativen gibt.

    Arduino ist primär 8-Bit. Ob der Arduino Zero daran etwas ändern wird, bleibt abzuwarten.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454
    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 ?

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    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.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454
    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.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    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.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.454
    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).

Seite 1 von 2 12 LetzteLetzte

Ä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, 16: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, 13:21
  3. Arduino Due + Treiber + Schrittmotor PROBLEM
    Von stevie3354 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 31.01.2014, 00:11
  4. Arduino Due HSMCI - SD/SDIO/MMC
    Von Superhirn im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 0
    Letzter Beitrag: 25.01.2013, 11:57
  5. Arduino Due erschienen
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 24.10.2012, 23:20

Berechtigungen

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