www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik effizientes Bit-Setzen beim ARM7


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte beim ARM7, LPC2148 je nach Softwarekonfiguration einen 
digitalen Ausgang active low bzw. active high betreiben.
Aus Geschwindigkeitsgründen möchte ich jedoch nicht laufend die aktuelle 
Konfiguration, welche im Programverlauf geändert werde kann, abfragen

Als z.B. ein Konstrukt wie


if (EnabelPinActiveHigh != 0)
{
  if (EnableOn) FIO1SET = pfENABLE_MASK;
    else  FIOCLR = pfENABLE_MASK;
}
else
{
  if (EnableOn) FIO1CLR = pfENABLE_MASK;
    else  FIOSET = pfENABLE_MASK;
}

gibt es da vielleicht etwas effizienteres?

Vielen Dank

Frank

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell via Pointer mit Portadresse SET/CLR drin?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas

Vielen Dank. Würdest du mir bitte mal ein Beispiel aufzeigen, wie das 
aussehen könnte.

Freundliche Grüsse

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Letztlich wären das 2 Pointer, einen für's einschalten, einen für's 
ausschalten. Und die Frage ob "ein"=1 oder "ein"=0 entscheidet, ob der 
für's einschalten auf das "SET" oder das "CLR" Register zeigt.

Aber du kannst natürlich auch mit den Adressen rechnen. Immerhin 
unterscheiden sich die Adressen von FIOSET und FIOCLR in genau einem 
Bit, so dass du deine EnableXXX Variablen in dieses Bit der Adresse 
rein-exodern kannst.

Fertigen Code werde ich dir nicht liefern, bischen selber denken darfst 
du schon noch.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank

Das könnte dann so klappen:
unsigned long* LED_REG_ON;                   
unsigned long* LED_REG_OFF;

void SetConfig(unsigned char ConfigValue)
{
    if ((ConfigValue & 0x01)!=0)
    {
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0SET
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
    }
    else
    {
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0CLR
    }
}

#define LED_MASK  1 << 10


int main()
{
  SetConfig(0);  // Led is active low
  LED_REG_ON = LED_MASK; // switch on led by clearing bit 10
  LED_REG_OFF = LED_MASK; // switch off led by setting bit 10
}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fast.

volatile unsigned long* LED_REG_ON;
LED_REG_ON = (volatile unsigned long *) 0x3FFFC018;
*LED_REG_ON = LED_MASK;

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas

Kann ich nachvollziehen, vielen Dank für die Richtigstellung!

Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.