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


von Frank (Gast)


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

von Andreas K. (a-k)


Lesenswert?

Eventuell via Pointer mit Portadresse SET/CLR drin?

von Frank (Gast)


Lesenswert?

Hallo Andreas

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

Freundliche Grüsse

von Andreas K. (a-k)


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.

von Frank (Gast)


Lesenswert?

Vielen Dank

Das könnte dann so klappen:
1
unsigned long* LED_REG_ON;                   
2
unsigned long* LED_REG_OFF;
3
4
void SetConfig(unsigned char ConfigValue)
5
{
6
    if ((ConfigValue & 0x01)!=0)
7
    {
8
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0SET
9
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
10
    }
11
    else
12
    {
13
        LED_REG_ON = (*((volatile unsigned long *) 0x3FFFC01C)); //FIO0CLR
14
        LED_REG_OFF = (*((volatile unsigned long *) 0x3FFFC018)); //FIO0CLR
15
    }
16
}
17
18
#define LED_MASK  1 << 10
19
20
21
int main()
22
{
23
  SetConfig(0);  // Led is active low
24
  LED_REG_ON = LED_MASK; // switch on led by clearing bit 10
25
  LED_REG_OFF = LED_MASK; // switch off led by setting bit 10
26
}

von Andreas K. (a-k)


Lesenswert?

Fast.

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

von Frank (Gast)


Lesenswert?

Hallo Andreas

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

Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.