Direct Port manipulation funktion für den DUE

Hallo!

Ich würde mir gerne eine Direct Port Manipulation Funktion für den DUE schreiben, leider steige ich da nicht ganz durch :(.

Vorgestellt habe ich mir das in etwa so void directDigital( Port, State){}

Gibt es soetwas zufällig schon? Ich baue mir gerade meine eigene PCB und möchte Ports benutzen die nicht in der Arduino umgebung vorgesehen sind bspw PC11.

Oder gibt es eine einfache Möglichkeit die Pins zu remappen?

Prinzipiell kannst Du auch beim DUE die I/O Pots direkt ansprechen. Lies Dir mal das Datenblatt des Controllers durch.

Grüße Uwe

Okay, soweit ich verstanden habe geht es so:

bspw für Arduino Pin 13: Dieser liegt auf Port B und Pin 27.
SODR für Set Pin und CODR um den Pin zu clearen

REG_PIOB_SODR = 0x1 << 27;
REG_PIOB_CODR = 0x1 << 27;

Wie kann ich nun den Portnamen noch in die Funktion packen?
Mir fallen da gerade switch oder If abfragen ein, geht es noch einfacher?
Gibt es einen weg die funktionsaufruf REG_PIO[X]_SODR mit einem bestimmten X aufzurufen?

Hier mit meinem switch ansatz:

void directDigitalWrite(char Port, char Pin, boolean state) {
  switch (Port) {
    case 'A': {
        if (state) REG_PIOA_SODR = 0x1 << Pin;
        else       REG_PIOA_CODR = 0x1 << Pin;
      }
      break;
    case 'B': {
        if (state) REG_PIOB_SODR = 0x1 << Pin;
        else       REG_PIOB_CODR = 0x1 << Pin;
      }
      break;
    case 'C': {
        if (state) REG_PIOC_SODR = 0x1 << Pin;
        else       REG_PIOC_CODR = 0x1 << Pin;
      }
      break;
    case 'D': {
        if (state) REG_PIOD_SODR = 0x1 << Pin;
        else       REG_PIOD_CODR = 0x1 << Pin;
      }
      break;
  }
}

Alternativ müsste ich mir dafür eine eigene Library schreiben in der die PinNamen so deklariert sind wie man sie braucht.

Nun directDigitalRead

boolean directDigitalRead(char Port, char Pin) {
  switch (Port) {
    case 'A': return !!(PIOA->PIO_PDSR & (1 << Pin));
      break;
    case 'B': return !!(PIOB->PIO_PDSR & (1 << Pin));
      break;
    case 'C':  return !!(PIOC->PIO_PDSR & (1 << Pin));
      break;
    case 'D': return !!(PIOD->PIO_PDSR & (1 << Pin));
      break;
  }
}}

Wie sieht es denn mit Analog read und Write aus? Hat da jemand vorschläge? :smiley:
EDIT: Wobei wohl alle Analog Ports von Arduino belegt sind, daher funktioniert auch AnalogRead und Write. Wobei ein "direct Acces" für schnellere zugriffe nicht schlecht wären.

tsaG:
Wie sieht es denn mit Analog read und Write aus? Hat da jemand vorschläge? :smiley:

Die Arduino Core Library ist für alle unterstützten Plattformen "Open Source", einschließlich der SAM3X-Plattform und wird jeweils mitgeliefert. Da brauchst Du nur reinzuschauen, wie die Arduino-Komfortfunktionen es mit der direkten Hardwareprogrammierung machen, wenn Du Anregungen suchst.