Forum: Mikrocontroller und Digitale Elektronik AVR Portpins


von Markus Jung (Gast)


Lesenswert?

gibt es eine möglichkeit beim programmieren in c (ATmega48) einen 
portpin auf diese art und weise anzusprechen?
     ....
     uint16_t test=0;

     ....
     PORTC_P0=1;

     DDC_P0=1;


Ich sehe im Zusammenhang mit AVR controller sehr oft schiftoperatoren in 
c.

Die Controller die ich bis jetzt in den fingern hatte, haben oft einen 
riesenheader in dem eine union bestehnd aus einen 8 bit wert und einem 
8*1 bittigen feld für jeden port vorhanden sind, dies scheint es für die 
atmels in der form nicht zu geben, oder?

ich habe mir die datei portpin.h und die datei iomx8.h angesehen, da 
scheint der grundstein gelegt zu werden.

meine frage:

-gibts diesen header evtl. doch, also um es schon pingerecht zu machen.
-gibts evtl hier im forum eine gute informationsquelle dazu oder thread.
-warum nutzt man den schift operator? (klar wird dann automatisch 
ausgerechnet...)
mann könnte doch aber auch DDC|=0x01 schreiben, wird hier nur nicht sehr 
häufig praktiziert, oder- warum? gibt doch noch unterschiede oder 
weitere hintergünde?

vielen dank an euch,
Markus

von Benedikt K. (benedikt)


Angehängte Dateien:

Lesenswert?

Versuchs mal damit.
Das ganze basiert auf irgendeinem Thread hier aus dem Forum, irgendwo im 
GCC Forum.

von Peter D. (peda)


Lesenswert?

Besser ist es aber, statt einer Pinnummer dem Pin einen der Funktion 
entsprechenden Namen zu geben.
Damit wird der Code gleich viel besser verstehbar und man kann die 
Verdrahtung auch leicht ändern.
Es interessiert ja nicht der Pin, sondern die Funktion, die er hat.
Hier ein Beispiel:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

von vlad (Gast)


Lesenswert?

1
typedef struct IOPORT{
2
  unsigned pin0 :1;
3
  unsigned pin1 :1;
4
  unsigned pin2 :1;
5
  unsigned pin3 :1;
6
  unsigned pin4 :1;
7
  unsigned pin5 :1;
8
  unsigned pin6 :1;
9
  unsigned pin7 :1;
10
}IOPORT;
11
12
13
14
#define IOPORTB  (*((volatile IOPORT*)(&PORTB)))

dann müsste man schreiben können
1
IOPORTB.pin1 = 1;

Die frage ist, ob das der Compiler richtig umsetzt.

mal ausprobieren.

von vlad (Gast)


Lesenswert?

ja er macht aus beidem direct ein sbi 18,1

kannst das ganze natürlich dann noch weiter treiben:
1
#define ON  1
2
#define OFF 0
3
4
#define PORTB_P0 IOPORTB.pin0
5
#define PORTB_P1 IOPORTB.pin1
6
#define PORTB_P2 IOPORTB.pin2
7
#define PORTB_P3 IOPORTB.pin3
8
#define PORTB_P4 IOPORTB.pin4
9
#define PORTB_P5 IOPORTB.pin5
10
#define PORTB_P6 IOPORTB.pin6
11
#define PORTB_P7 IOPORTB.pin7
12
13
14
15
PORTB_P0 = ON;
16
PORTB_P3 = OFF;

wenn du mehrere Pins einschaltne willst, gehts aber
PORTB |= (1<<PIN1) | (1<<PIN2) | (1<<PIN5);
schneller als mit
PORTB_P1 = ON;
PORTB_P2 = ON;
PORTB_P5 = ON;

Dafür ist die erste Variante Fehlerträchtiger.

von vlad (Gast)


Lesenswert?

Anmerkung: es soltlen noch klammern um die IOPORTB.pinX

von Markus Jung (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die rege Rückmeldung.

Danke auch für die Header Datei, das ist ein einfacher aber effektiver 
Ansatz. Den Antworten entnehme ich, das es die Möglichkeit ohne 
Hilfmittel nicht gibt, also von haus aus im Studio ist, meine ich.

Danke auch für den Hinweis an Peter, die Portpins behandle ich schon 
seit eh her getrennt (siehe Anhang). Ich war und bin mir nur nicht 
sicher was alles beim Studio dabei ist, und was man noch selbst 
hinzuerfinden muss.

Zumal die schreibweise mit schift operatoren den vorteil hat, das man 
nicht so viel denken muss. Ich habe auch noch irgentwo das _BV makro 
gesehen. Letztendlich gibt es wohl tausend möglichkeiten.

Die nummer mit den Bitfeldern und einer union wird sehr gern vermieden, 
warum auch immer.

Gruß.
Markus Jung

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.