AVR Portpins

Gast #1294473
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
Gast #1294567
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.
Gast #1294586
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.
Gast #1295462
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren