Forum: Mikrocontroller und Digitale Elektronik Funktionen aus libATSAM7S256.h


von Max (Gast)


Lesenswert?

Moin.
Habe da so eine Verständnisfrage.
Manche Funktionen aus libATSAM7S256.h erscheinen mir nicht ganz 
richtig(oder mache ich einen Denkfehler?). So z.B.
1
__inline void AT91F_PIO_SetOutput(
2
  AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
3
  unsigned int flag) // \arg  output to be set
4
{
5
  pPio->PIO_SODR = flag;
6
}
Mit AT91F_PIO_SetOutput(AT91C_PIO_PA28) wir PA28 HIGH gesetzt. 
AT91C_PIO_PA28 ist ja (1<<28), d.h. (1<<28)=0x10000000. Was wiederum 
heist,  dass alle zuvor gesetzten Pins LOW werden(?). Muss es nicht so
1
 pPio->PIO_SODR | = flag;
 sein?

Oder in
1
__inline void AT91F_PIO_CfgPeriph(
2
  AT91PS_PIO pPio,             // \arg pointer to a PIO controller
3
  unsigned int periphAEnable,  // \arg PERIPH A to enable
4
  unsigned int periphBEnable)  // \arg PERIPH B to enable
5
6
{
7
  pPio->PIO_ASR = periphAEnable;
8
  pPio->PIO_BSR = periphBEnable;
9
  pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode
10
}
wird hier nicht auch die zuvor eingestellte Peräpherie deaktiviert?

von Daniel J. (deejay)


Lesenswert?

Hi,

nein, es muss kein |= sein. Beim dem ARM gibt es jeweils extra ein 
Register zum Setzen und ein Register zum Zurücksetzen (SODR = Set output 
data register oder so, das Gegenstück wäre CODR = clear output data 
register). Schreibst Du ein Bit in SODR, geht der Ausgang auf high, 
schreibst Du das entsprechende Bit in CODR, geht der Ausgang auf Low. 
Nullen schreiben ändert nix...
Ist bei vielen Peripherie-Registern so...

MfG
 Deejay

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.