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
Hallo Andreas Vielen Dank. Würdest du mir bitte mal ein Beispiel aufzeigen, wie das aussehen könnte. Freundliche Grüsse
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.
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 | }
|
Fast. volatile unsigned long* LED_REG_ON; LED_REG_ON = (volatile unsigned long *) 0x3FFFC018; *LED_REG_ON = LED_MASK;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.