Forum: Mikrocontroller und Digitale Elektronik Variable für PortPin?


von Marco (Gast)


Lesenswert?

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

von mikki merten (Gast)


Lesenswert?

versuch's mal mit der .set Direktive

von Peter K. (Gast)


Lesenswert?

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

von Marco (Gast)


Lesenswert?

Gibt´s irgendwo eine Übersicht über die Direktiven?
Welche es so gibt und was sie so können?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.