Hallo, Hab folgendes Problem mit meinem AVR: Ich hab eine Funktion, die auf einen PortPin (PortC, 0) zugreift und dort Daten liest bzw. schreibt. Nun soll die gleiche Funktion auf den nächsten Pin (PortC, 1) zugreifen und die nächsten Daten auslesen. Die ganze Funktion kopieren und nur den Pin-Parameter ändern ist etwas unelegant (abgesehen von der Speicherverschwendung). Einfach eine Variable (.def) für den Pin zu definieren, die ich dann hochzählen lasse, erlaubt mir das AVRstudio nicht. Das geht nur mit einer Konstanten (.equ), die ich ja aber nicht verändern kann (ist halt ne Konstante :-) ). Gibt es da nicht irgend ne elegante Lösung? Achso, ich verwende ausschließlich ASM. MfG marco
Hi Marco, ich denke mal .SET hilft nicht. Du wirst wohl deiner Funktion einen extra Parameter geben müssen (eine Bitmaske, die Bitnummer oder ähnlich). .SET Pin=1 CALL superFkt .SET Pin=2 CALL superFkt wird nicht funktionieren weil Assemblerdirektiven zur Übersetzungszeit ausgewertet werden. Du kannst höchstens das Kopieren der Funktion mit einem Macro erledigen. Peter
Gibt´s irgendwo eine Übersicht über die Direktiven? Welche es so gibt und was sie so können?
Du kannst den Port in ein Register einlesen, den Wert des Registers bearbeiten und das Register dann zurück an den Port ausgeben. Anders geht's nicht, weil sbis, sbi, cbi usw. nur mit Konstanten funktionieren.
Ich hab mir mal Funktionen zum indirekten Bitzugriff geschrieben: http://www.specs.de/~danni/appl/soft/setibit/setibit.c51 Da es C ist, sollte es einfach an den AVR anzupassen sein. Bzw. für einen etwas C-bewanderten sollte daraus auch der entsprechende Assemblercode zu zimmern sein. Peter
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.