Forum: Mikrocontroller und Digitale Elektronik #define 2 Ports auf ein define


von Matthias (Gast)


Lesenswert?

Hallo Community,

ich hab eine Frage, über die ihr euch wahrscheinlich kaputt lacht.

Ich habe ein Controllerboard gebaut. Dazu habe ich mir eine eigene 
Header Datei geschrieben.

In der ersten Variante liegen alle LEDs an PORTD. Das define dazu ist 
einfach:

#define LED_PORT PORTD

Nun möchte ich aber 4 LED an PORTB 0..3 und 4 LED an PORTD 0..3 und 
möchte trotzdem alle über LED_PORT ansprechen. Also sozusagen einen 
"virtuellen" LED_PORT erzeugen um den Code übersichtlicher zu machen. 
Wie definiert man das?

Ich habe

# define LED_PORT PORTD | PORTB

probiert, was im Nachhinein schon völliger Schwachsinn war.

Mir fällt da nichts zu ein ?!

Dank euch

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:

> Nun möchte ich aber 4 LED an PORTB 0..3 und 4 LED an PORTD 0..3 und
> möchte trotzdem alle über LED_PORT ansprechen. Also sozusagen einen
> "virtuellen" LED_PORT erzeugen um den Code übersichtlicher zu machen.
> Wie definiert man das?

So - gar nicht.

Jede Led-einzeln behandeln, mit ihren eigenen #defines, dann gibt es 
kein Problem.

von Achim M. (minifloat)


Lesenswert?

Mach Makros, mit denen du die LEDn einzeln bedienen kannst:
1
#define LED0_PORT PORTD
2
#define LED0_DDR  DDRD
3
#define LED0_PIN  PIND
4
#define LED0_PPIN PIN7
5
6
#define LED1_PORT PORTB
7
#define LED1_DDR  DDRB
8
#define LED1_PIN  PINB
9
#define LED1_PPIN PIN3
10
11
//folgende defines sind bereits "unabhängig"
12
//von den obigen definitionen
13
#define LED0_INIT()   LED0_DDR|=(1<<LED0_PPIN)
14
#define LED0_ON()     LED0_PORT&=~(1<<LED0_PPIN)
15
#define LED0_OFF()    LED0_PORT|=(1<<LED0_PPIN)
16
#define LED0_TOGGLE() LED0_PIN|=(1<<LED0_PPIN)
17
18
#define LED1_INIT()   LED1_DDR|=(1<<LED1_PPIN)
19
#define LED1_ON()     LED1_PORT&=~(1<<LED1_PPIN)
20
#define LED1_OFF()    LED1_PORT|=(1<<LED1_PPIN)
21
#define LED1_TOGGLE() LED1_PIN|=(1<<LED1_PPIN)
22
//...usw...
23
24
//im initcode dann
25
LED0_INIT();
26
LED1_INIT();
27
28
//irgendwo sonst...
29
LED1_ON();
30
LED0_ON();
31
32
//woanders...
33
LED1_TOGGLE();
34
LED0_OFF();

Die Toggler funktionieren so wie gezeigt natürlich nur auf neueren AVRs, 
wo man mit beschreiben des PIN-Registers(!!) die entsprechenden Bits des 
PORT-Registers toggeln kann.

Wenns ein älterer AVR ist(mega8, mega16, ...), dann fürs toggeln:
1
#define LED1_TOGGLE() LED1_PORT^=(1<<LED1_PPIN)
2
#define LED1_TOGGLE() LED1_PORT^=(1<<LED1_PPIN)
Im weiteren Code ändert sich nix.
Weiterer Vorteil: Änderst du die Pinbelegung, musst du nur die 
entsprechenden "#define ..." anpassen.
mfg mf

von (prx) A. K. (prx)


Lesenswert?

Die Bits einzeln ansprechen, nicht alle 8 zusammen:
1
#define LED_ON(n) if ((n) < 4) PORTB |= 1<<(n); else PORTD |= 1<<((n)-4)
Keine Sorge wg. Code, bei konstantem n optimiert der Compiler die 
Abfrage weg.

von Matthias (Gast)


Lesenswert?

danke euch

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.