www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Portpins


Autor: Markus Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: vlad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct IOPORT{
  unsigned pin0 :1;
  unsigned pin1 :1;
  unsigned pin2 :1;
  unsigned pin3 :1;
  unsigned pin4 :1;
  unsigned pin5 :1;
  unsigned pin6 :1;
  unsigned pin7 :1;
}IOPORT;



#define IOPORTB  (*((volatile IOPORT*)(&PORTB)))

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

Die frage ist, ob das der Compiler richtig umsetzt.

mal ausprobieren.

Autor: vlad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja er macht aus beidem direct ein sbi 18,1

kannst das ganze natürlich dann noch weiter treiben:
#define ON  1
#define OFF 0

#define PORTB_P0 IOPORTB.pin0
#define PORTB_P1 IOPORTB.pin1
#define PORTB_P2 IOPORTB.pin2
#define PORTB_P3 IOPORTB.pin3
#define PORTB_P4 IOPORTB.pin4
#define PORTB_P5 IOPORTB.pin5
#define PORTB_P6 IOPORTB.pin6
#define PORTB_P7 IOPORTB.pin7



PORTB_P0 = ON;
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.

Autor: vlad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung: es soltlen noch klammern um die IOPORTB.pinX

Autor: Markus Jung (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.