Hallo.
Bin gerade dabei einen ASM-Code nach WinGCC zu portieren.
Der ATMega hat die Pin-Toggle-Funktion für Ausgänge.
Hab jetzt ein Verständnisproblem:
PINE = (1<<PINE3); Funktioniert
PINE |= (1<<PINE3); Funktioniert nicht
Wenn ich mir den Disassembler-Code ansehe, ist mir klar, dass
der Compiler bei
Variante 1: SBI PINE... übersetzt
und bei
Variante 2: LDS R24, PINE
ORI R24, ...
STS PINE, R24
draus macht. Ich sehe auch, dass die 2. Variante Probleme
macht. ( Weil ich ja alle gesetzen Pins toggle ).
Aber warum macht der Compiler bei Variant 2 das so bzw. gibt es
da noch mehr solche "Stelle", wo maneigentlich nur schreiben müsste,
der Compiler aber vorher liest.
Danke,
Pepe.
Pepe schrieb: > Aber warum macht der Compiler bei Variant 2 das so Weil Du es so hingeschrieben hast. Daß es Blödsinn ist, weiß der Compiler nicht und es interessiert ihn auch nichtmal. Du sagst, mach ein OR und er macht es. Peter
Pepe schrieb: > Variante 2: LDS R24, PINE > ORI R24, ... > STS PINE, R24 > > draus macht. Ich sehe auch, dass die 2. Variante Probleme > macht. ( Weil ich ja alle gesetzen Pins toggle ). > > Aber warum macht der Compiler bei Variant 2 das so Du hast doch selbst schon rausgefunden, wo der Haken bei Variante 2 liegt. Eben das alle Output-Pins, die momentan auf 1 sind, ebenfalls getoggelt werden. (Werden müssen ... denn genau das hast du ja hingeschrieben) Aber: Woher soll denn der Compiler wissen, welche Pins momentan auf 1 liegen? Und wenn du dir das mal genauer überlegst, was passieren muss, kommst du zum Schluss: er kann es gar nicht anders machen. Dein SBI aus der Variante 1 geht nur deshalb, weil da genau nur 1 Pin zu toggeln ist. Aber diesen 'Luxus' gibt es in Variante 2 nicht.
Und noch zur Info: Das: PINE = (1<<PINE3); Funktioniert und das: PINE |= (1<<PINE3); Funktioniert nicht sind nicht dasselbe und haben auch nichts mit Toggeln zutun.
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.