Forum: Mikrocontroller und Digitale Elektronik Mehrere PortPins ändern ohne andere zu beeinträchtigen..


von Rene K. (draconix)


Lesenswert?

Hiho,

ich möchte mehrere Portpins an einem Mega8 PortB (Pin 1,2,3,4) mit einem 
Rutsch ändern, ohne die anderen zu beeinflussen.

Im Regelfall mache ich das so: PORTB = 0x16 - oder halt jeden einzelnen 
Pin seperat. Wie mache ich das nun das ich z.b. die 0x16 einfach setze 
ohne die restlichen Pins, welche manche auf Eingang sitzen, zu ändern?!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
PORTB = (PORTB & 0b11100001) | (wert << 1);

Wobei zu beachten ist, daß das nicht IRQ-sicher ist. D.h. wenn auch in 
der IRQ ports von B verändert werden, muss man die obiger Zeile 
atomar machen.

von Rene K. (draconix)


Lesenswert?

Johann L. schrieb:
> PORTB = (PORTB & 0b11100001) | (wert << 1);
> Wobei zu beachten ist, daß das nicht IRQ-sicher ist. D.h. wenn auch in
> der IRQ ports von B verändert werden, muss man die obiger Zeile
> atomar machen.

Danke für den Tipp!

Dein Code hat mir sehr viel weiter geholfen. Jedoch benötige ich das 
schieben nicht bzw. funktioniert dies nicht. er schiebt die Zahlen immer 
um eines nach rechts.

Mit:
1
PORTB = (PORTB & 0xe1) | wert;
2
3
//bzw...
4
5
PORTB = (PORTB & 0b11100001) | wert;

funktioniert es jedoch tadellos.

Das ganze wird zum Multiplexen in einer ISR aufgerufen. Also wird ein 
atomarer zugriff nicht von nöten sein, da ja während einer isr keine 
weitere dazwischen funken kann.

von Achim M. (minifloat)


Lesenswert?

Rene K. schrieb:
> Das ganze wird zum Multiplexen in einer ISR aufgerufen. Also wird ein
> atomarer zugriff nicht von nöten sein, da ja während einer isr keine
> weitere dazwischen funken kann.

Höherpriore Interrupts können dir sehr wohl dazwischenfunken.
mf

von Dussel (Gast)


Lesenswert?

>Höherpriore Interrupts können dir sehr wohl dazwischenfunken.
Wie kommst du auf die Idee? Beim Sprung in den Interrupt wird das I-Bit 
gelöscht und damit kein Interrupt mehr zugelassen. Erst nach manuellem 
Setzen oder reti wird das Bit wieder gesetzt. Dann ist die Bearbeitung 
der Anweisung aber beendet.

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.