Ich muß um verschiedene register anzusteuern öfters eine high->low oder
low->high Flanke auslösen.
Dazu habe ich verschiedene bit_operationen selbst geschrieben (der
Übersicht halber) und unter anderem eine toggle-funktion.
Ich würde mal sagen mit der Zuweisung
byte = set_bit(byte, bit, 1);
im toggle_bit_up_down überschreibst Du dir Deine Eingangsvariable
"byte", die Du in der nächsten Zeile aber wieder verwenden willst.
Gruss
Phillip Hommel wrote:
> Wenn ich die Funktionen allerdings im Program benutzen möchte, dann> funktioniert diese allerdings nicht.
Du übergibst die Kopie der Variable "byte", machst damit etwas und
schmeißt das Ergebnis weg.
Daher ist der Compiler so schlau, es komplett wegzuoptimieren.
Aber selbst wenn er es macht, bewirkt es nicht das von Dir Gewünschte,
sondern verbraucht nur Zeit.
Gehen würde es nur mit Pointern auf volatile.
Dabei wird der Code aber sehr aufwendig.
Hier mal ein Tutorial, wie man Bits übersichtlich definiert und
verwendet:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67368
Das hat außerdem den Vorteil, daß der Code effizient ist, d.h. die
Bitbefehle benutzt.
Das Rumgewusele mit Pointern auf IO-Ports kostet dagegen mächtig Code
und Zeit.
Peter
Geht so nicht. Denn in der toggle-Funktion wird nicht der Port
getoggelt, sondern nur die lokale Variable.
Dü müsstest dazu die Adresse des Ports and die toggle-Funktion
übergeben, nicht dessen Inhalt. Ist aber umständlich.
Tip nebenbei: Shifts deren Anzahl dem Compiler nicht bekannt sind werden
bei AVRs recht ineffizient implementiert. Was hier solange kein Problem
ist, bis der Compiler meinst, für übliche inlining wären die Funktionen
zu gross.
Die funktion hat ja auch keinen Rückgabewert sondern soll in sich den
übergebenen wert (der mit #define direkt dem port und pin enspricht)
zweimal die funktion set_bit ausführen die ja direkt aufgerufen auch
funktioniert.
ich fasse in toggle eigentlich ja nur zwei zeilen zusammen.
Du willst also direkt den Pin am Port toggeln, und nicht nur ein Bit in
einem Datenbyte?
Dann musst du einen Pointer auf den Port übergeben.
Und du musst daran denken, die Interrupts währenddessen zu sperren.
Phillip Hommel wrote:
> Die funktion hat ja auch keinen Rückgabewert
Und genau das ist der Unterschied, daß sie nicht das tut, was Du gerne
hättest.
Sie tut natürlich genau das, was Du hingeschrieben hast.
> ich fasse in toggle eigentlich ja nur zwei zeilen zusammen.
Nein, tust Du nicht.
Es ist ein großer Unterschied, ob Du einen Returnwert einer globalen
Variable oder einer lokalen zuweist.
Die lokale ist nach dem Verlassen der Funktion ungültig und damit die
Zuweisung ohne Effekt.
Und deshalb passiert auch nichts mit dem Port, ihm wurde ja nichts
zugewiesen.
Peter
Aaaaah ok, jetzt raff ich das.
Ich übergebe der funktion den WERT des ports, der wurschtelt damit was
und speichert es aber nirgends?
Dh ich müßte das ganze wieder mit rückgabewert machen im sinne von
1
port_control=toggle_blabla
was aber keinen sinn macht da ich ja hoch- und wieder runter-togglen
will.
Dh die beste methode ist, zweimal set_bit auszuführen, einmal mit 1 und
einmal mit 0.
Vielen dank
Die Macros sind in diesem Fall erst noch viel effizienter und schneller
als Funktionsaufrufe. Falls die "bit"-Werte Konstanten sind, wird
nämmlich der C-Präprozessor des Compilers die Shift-operationen
erledigen und die CPU hat zu Runtime nichts mehr damit zu tun.