Hallo ich suche die Vereinfachung für folgende 2 Befehlzeilen zu einem Befehl: ... PORTA &= ~(1 << PINA1); PORTA |= MP.mp.MPTA & (1 << PIN1); ... Ich möchte also in Abhängigkeit von bit1 in der uint8_t MP.mp.MPTA Struktur den PIN1 in PORTA auf LOW oder HIGH setzen. Danke!
1 | |
Stefan Ernst schrieb: > PORTA = (PORTA & ~(1 << PIN1)) | (MP.mp.MPTA & (1 << PIN1)); Ist sogar noch ein Takt schneller als der Zweizeiler des TO.
Luk4s K. schrieb: > Stefan Ernst schrieb: >> PORTA = (PORTA & ~(1 << PIN1)) | (MP.mp.MPTA & (1 << PIN1)); > Ist sogar noch ein Takt schneller als der Zweizeiler des TO. Danke. Verstehe, weil der PORT erst nach der Ermittlung des Endergebnisses gesetzt wird, während er vorher immer erst einmal auf LOW gesetzt wird - oder ?
Hendrik L. schrieb: > Luk4s K. schrieb: >> Stefan Ernst schrieb: >>> PORTA = (PORTA & ~(1 << PIN1)) | (MP.mp.MPTA & (1 << PIN1)); >> Ist sogar noch ein Takt schneller als der Zweizeiler des TO. > > Danke. > > Verstehe, weil der PORT erst nach der Ermittlung des Endergebnisses > gesetzt wird, während er vorher immer erst einmal auf LOW gesetzt wird - > oder ? Ich hab's durch den Complier geschoben:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Beides sind 5 Instruktionen, aber das cbi braucht 2 Takte; in, andi, or, out nur je einen.
Gast
#2138555
Hendrik L. schrieb: > Verstehe, weil der PORT erst nach der Ermittlung des Endergebnisses > gesetzt wird, während er vorher immer erst einmal auf LOW gesetzt wird - > oder ? PORTA ist als IO-Register volatile, das heißt, der Compiler muss genauso viele Lese- und Schreibzugriffe in der selben Reihenfolge durchführen, wie es im Programm steht. Im Beispiel mit zwei Zeilen wird PORTA zweimal modifiziert, was zweimal lesen-modifizieren-schreiben heißt. In diesem Spezialfall konnte eine der Operationen in einem einzigen cbi Befehl abgehandelt werden. Die Version in einer Zeile liest PORTA einmal und schreibt einmal. Den selben Effekt könnte man auch mit einer temporären Variable erzeugen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Das sollte dasselbe Ergebnis wie der Einzeiler ergeben.
Danke an Alle, habe viel gelernt! Grüße
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.