uwe223 hat geschrieben:
Also habe ich mir so was in der Art vorgestellt:
Code:
uint8_t portState = (uint8_t)IO_GET(commObjectNumber+1);
IO_SET(commObjectNumber+1, (portState ^0x01));
Das funktioniert aber wohl nicht mit Variablen oder?
Muss ich das ganze mit einem select case Konstrukt bearbeiten oder weiß jemand eine elegantere Möglichkeit?
Leider ja. IO_SET und IO_GET sind Makros die zur Compilezeit entsprechend ausgewertet werden. Dadurch wird schnellerer Code erzeugt. In deinem Fall passt das aber nicht.
Dir bleibt jetzt nichts anderes übrig als eine Funktion zu schreiben in der du mit einem select case die entsprechenden IO_SET oder IO_GET Routine aufrufst.
Das steht auch noch auf meiner TODO Liste etwas weiter hinteran. Langfristig sollte das dann in die Lib wandern. Aber du kannst es gerne implementieren und wir übernehmen es dann in die Lib. Kleiner Tipp: Mit __builtin_constant_p() könnte man erkennen ob der Parameter eine Konstante oder eine Variable ist und dann das Makro oder die entsprechende Routine aufrufen.
Du solltest auf jeden Fall IO_SET und IO_GET in einer Applikation benutzen. Wenn du die Ports direkt ansprichst ist es evtl. nicht mehr kompatibel mit anderen Boardversionen.
uwe223 hat geschrieben:
p.s. Für den Tastereingang würde ich den Pin PD2 mit auf den freien Pin10 von JP1 auf dem RF-Board routen und gegenüber von JP1 noch zwei Stützpins vorsehen, damit eine Led/Tasterplatine aufgesteckt werden kann, OK?
Dazu kann ich auf die Schnelle nichts sagen. Muss ich genauer schauen.
PS: (1<<commObjectNumber) ist auf dem AVR ungünstig, denn er kennt keinen variablen Schiebebefehl. Besser ist so etwas in der Art:
Code:
mask = 0x1;
for (..) {
do_something(mask);
mask<<=1;
}
Gruß
Dirk