| freebus.org http://freebus.org/phpBB3/ |
|
| IO_GET und IO_SET mit Variablen? http://freebus.org/phpBB3/viewtopic.php?f=25&t=2094 |
Seite 1 von 1 |
| Autor: | uwe223 [ 6. April 2013 15:46 ] |
| Betreff des Beitrags: | IO_GET und IO_SET mit Variablen? |
Hallo, nachdem dass mit dem Analogeingang so gut geklappt hat, hab ich mich mal darangesetzt und die Handbetätigungsfunktion für den Schaltaktor realisiert. Funktioniert auch soweit schon mal. Um den Taster abfragen zu können muss ja der entspr. Ausgang kurz getoggelt werden. Das habe ich jetzt mit direktem Zugriff auf den Port also so: Code: PORTC ^= (1<<commObjectNumber); //Ausgang toggeln uint8_t inputState = BUTTON_INPUT_PIN; //Eingang abfragen PORTC ^= (1<<commObjectNumber); //Ausgang wieder "zurücktoggeln" Ist jetzt nicht wirklich schön und funktioniert nur für die Ausgänge 1-6 weil 7-8 ja auf PortD liegen. 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? 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? Gruß Uwe |
|
| Autor: | do13 [ 6. April 2013 16:25 ] |
| Betreff des Beitrags: | Re: IO_GET und IO_SET mit Variablen? |
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 |
|
| Seite 1 von 1 | Alle Zeiten sind UTC + 2 Stunden |
| Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |
|