Forum: Compiler & IDEs toggle PORT durch schreiben von PIN


von Fritz (Gast)


Lesenswert?

Hallo

Ich hab unlängst in meinem ATTINY2313 Datenblatt gelesen, dass das 
togglen der PORTx Register ganz einfach durch schreiben der zugehörigen 
PINx Registers möglich ist. (S. 51 ganz oben)

Weiß jemand mehr darüber? Warum wird das nicht häufiger verwendet 
sondern immer nur die XOR Methode?

Das könnte man doch auch ins AVR-GCC-Tutorial aufnehmen, was meint ihr?

mfg Fritz

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Fritz schrieb:

> Weiß jemand mehr darüber?

Welche Information fehlt dir denn noch darüber?

> Warum wird das nicht häufiger verwendet
> sondern immer nur die XOR Methode?

Weil es nur bei neueren AVRs funktioniert.

von Fritz (Gast)


Lesenswert?

Also zb. fehlte mir bis vor 5min die Information, dass man nicht 
PINx|=... schreiben soll, sondern PINx=... wenn man togglen will. Warum 
weiß ich aber immer noch nicht so ganz.

mfg Fritz

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

Fritz schrieb:
> Weiß jemand mehr darüber?

Nein. Der von dir gefundene Absatz beinhaltet alles was man wissen muss:

| Writing a logic one to PINxn toggles the value of PORTxn,
| independent on the value of DDRxn. Note that the SBI instruction
| can be used to toggle one single bit in a port.

> Warum wird das nicht häufiger verwendet sondern immer nur die XOR Methode?

Ich nehme an weil mit der XOR-Methode direkt aus dem Code hervorgeht was 
gemacht wird.
Mit der Methode PINxn zu beschrieben benoetigt es implizites Wissen zu 
der Plattform fuer die der Code geschrieben ist; ohne zusaetzlichen 
erklaerenden Kommentar ist dieser Code dann nur mehr schwer 
verstaendlich.

Sollte der Code einmal auf eine andere Prozessorfamilie portiert werden, 
dann ist das eine Stelle die sehr leicht bei der Portierung uebersehen 
wird und dann unnoetiges Debugging verursacht.

Kurz: wenn man weiss was man tut und unbedingt 2 Takte oder 4 Bytes 
einsparen muss, dann kann man getrost die PINxn-Methode verwenden. 
Meiner Erfahrung nach sind diese Bedingungen aber aeusserst selten 
gegeben.

IMHO der einzige Grund diese Methode zu verwenden ist wenn man ein 
atomares Toggeln eines Bits braucht.

> Das könnte man doch auch ins AVR-GCC-Tutorial aufnehmen, was meint ihr?

Hmm, ich denke gerade Anfaenger sollten die XOR-Methode verwenden, wo 
explizit da steht was getan werden soll.

von Justus S. (jussa)


Lesenswert?

Fritz schrieb:
> Also zb. fehlte mir bis vor 5min die Information, dass man nicht
> PINx|=... schreiben soll, sondern PINx=... wenn man togglen will. Warum
> weiß ich aber immer noch nicht so ganz.
>
> mfg Fritz

weil du sonst erst PINx ausliest...

von Fritz (Gast)


Lesenswert?

> Hmm, ich denke gerade Anfaenger sollten die XOR-Methode verwenden, wo
> explizit da steht was getan werden soll.

Ich denke es würde auch schon genügen, wenn man hineinschreiben würde, 
dass es die Methode gibt, aber dass man sie aus oben genannten Gründen, 
die mir jetzt sehr verständlich erscheinen, nur selten verwenden sollte.

> weil du sonst erst PINx ausliest...

Hmm, ja stimmt natürlich, daran hatte ich gar nicht gedacht, PIN hat ja 
dann beim lesen eine völlig andere Bedeutung als beim schreiben.

Vielen Dank an alle.

mfg Fritz

von (prx) A. K. (prx)


Lesenswert?

Der entscheidene Punkt dabei ist m.E. nicht so sehr die Möglichkeit, 
Pins toggeln zu können. Vielmehr ist man nur so in der Lage, mehrere 
Pins eines Ports atomar und gleichzeitig auf einen bestimmten Wert zu 
setzen, ohne die Interrupts abschalten zu müssen.

http://www.mikrocontroller.net/articles/Interrupt#Atomarer_Datenzugriff

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.