Forum: Mikrocontroller und Digitale Elektronik definieren von Portpins mit #define


von Kenia (Gast)


Lesenswert?

Veruch mich grad im Programmieren und will in C die Portpins als 
eingänge mit #define im AVR Studio definieren.

Dies kann doch auf diesem Weg umgestzt werden:

#define INPUT_A PINB0

: Verschoben durch Moderator
von Peter II (Gast)


Lesenswert?

Kenia schrieb:
> Dies kann doch auf diesem Weg umgestzt werden:
>
> #define INPUT_A PINB0

nö, weil du damit überhaupt kein code erzeugst.

von Karl H. (kbuchegg)


Lesenswert?


von Falk B. (falk)


Lesenswert?


von Kenia (Gast)


Lesenswert?

Es geht darum später in der while schleife mit diesen  neuen Ausdrücken 
anstatt PINA0 PINA1 PINA2.. zu arbeiten

#define LaserA_Input PINA0
#define Messergebnis PORTB0


Also
statt
...
while
{
if (PINA0 ==1)
PORTB0 ==1;
}


will ich schreiben

while
{
if (LaserA_Input== 1)
Messergebnis ==1;
}

von troll (Gast)


Lesenswert?

Die Grundidee ist richtig, allerdings kann zu mindestens der GCC nicht 
direkt auf Pins zugreifen. Du musst also eher sowas machen:
1
#define PortTaster PINB
2
#define PinTaster PINB0 //oder wie das auch definiert sein mag, eben die Bitnummer
3
4
if(PortTaster&(1<<PinTaster))
5
{
6
tu_was_sinnvolles
7
}

Oder hier gucken: Beitrag "Re: "Syntaxbefehl" erstellen"

von troll (Gast)


Lesenswert?

Kenia schrieb:
> if (PINA0 ==1)
> PORTB0 ==1;
Uhhh, Vorsicht!
Vergleiche: ==
Zuweisungen: =

(Der Compiler sollte aber ne Warnung ausspucken.)

von ..... (Gast)


Lesenswert?

Oh Gott... :P

von Fabian O. (xfr)


Lesenswert?

Definiere Dir lieber Inline-Funktionen mit klaren Namen, das ist 
lesbarer und auf jeden Mikrocontroller portabel:
1
static inline bool laser_is_on(void) {
2
  return PINB & (1 << PINB0);
3
}
4
5
static inline void set_result_pin(void) {
6
  PORTA |= (1 << PA0);
7
}
8
9
static inline void clear_result_pin(void) {
10
  PORTA &= ~(1 << PA0);
11
}
12
13
[...]
14
15
if (laser_is_on()) {
16
  set_result_pin();
17
}

von Falk B. (falk)


Lesenswert?

Man kann es auch mit einem einfachen #define machen, etwa so
1
#define LASER_ON (PIND & (1<<PD4))    // #defines immer GROSS
2
#define RELAY_ON (PORTD |= (1<<PD3));
3
#define RELAY_OFF (PORTD &= ~(1<<PD3));
4
5
if (LASER_ON) {
6
  RELAY_ON
7
} else {
8
  RELAY_OFF
9
}

Einfach lesbar und selbsterklärend. Und wenn sich mal die Pinzuordung 
ändert, muss man nur EINMAL die defines ändern, der Rest vom Quelltext 
bleibt wie er ist.

von Bastler (Gast)


Lesenswert?

Ich kann Falk Brunner nur zustimmen!

Irgendwann steigt man auf einen anderen Controller um.
Dann kann man den Code problemlos übernehmen und muss nur ein paar 
#defines ändern.

Ich hatte es so gemacht, der Umzug einer GLCD Ansteuerung dauerte nur 2 
Stunden.

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.