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?!
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.
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.
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.