www.mikrocontroller.net

Forum: Compiler & IDEs C Anfänger


Autor: Stefan Dreger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann ich einen kompletten Port ansteuern ?

cbi (PORTC,PC0);

Alles klar nur wie der ganze Port ?

µC ist ein 2313

MfG Stefan

Danke !

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Port kann direkt über das Register angesprochen werden, also:

PORTA=0x0f;

setzt die untern 4 bit auf 1, den Rest auf Null.

PORTA=PORTA| 0x01;
oder gleichwertig
PORTA|=0x01;

setzt dir das Bit 0 und lässt den Rest unverändert.
In dem Fall macht der gcc beim Optimieren aber wieder ein sbi draus :-)

Autor: Stefan Dreger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank !!!!

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cbi/sbi usw sind deprecated, solltest Du Dir als Anfänger gar nicht erst
angewöhnen...

...siehe: http://www.nongnu.org/avr-libc/user-manual/deprecated.html

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich eigentlich schon gefragt warum eigentlich?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest habe ich es schon x-mal beantwortet. ;-)

In Kurzfassung: vor allem, um Leute von unsinnigem Code wie solchem
abzuhalten:

sbi(DDRx, 1);
sbi(DDRx, 2);
sbi(DDRx, 4);

wo sie stattdessen gleich

DDRx = _BV(1)|_BV(2)|_BV(4);

schreiben können, wenn sie nur erstmal drüber nachdenken.

Insbesondere aber entspricht die direkte Portein-/-ausgabe der
Notation, die Atmel in den Datenblättern benutzt.  Die alten
cbi/sbi/inp/inb/outp/outb Makros waren nur Krücken, die die Lücke
füllen mußten, bis GCC/avr-libc das so konnten, wie es auch die
anderen AVR-Compiler können.

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, verstehe.

Ich fands nur witzig dass der Compiler dann aus PORTB=0x1 ein sbi in
Assembler macht :-) (zumindest bei -O2)

Ich wusste ja nicht, dass die libc auch erzieherisch wirken sollte :-)

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na moment... PORTB=0x01 bedeutet doch, dass ich PORTB auf 0b00000001
setzen möchte, das ist doch was anderes als PORTB auf 0bXXXXXXX1 zu
setzen, wobei X der bisherige Wert in PORTB war... oder wurde der Port
kurz zuvor initialisiert, so dass der Compiler sich sicher ist, dass
alles andere Nullen sind?

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder meinst du gar nicht PORTB=0x01, sondern PORTB|=0x01? Dann ziehe
ich meinen Kommentar zurück g

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau das meinte ich.

Menno, nimm doch nicht meine Postings um diese frühe Tageszeit so
wörtlich :-)

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Menno, um diese frühe Tageszeit fällt mir sowas eben erst zu spät auf!
sorry ;)

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Habe mit Interesse die Antworten auf Stefans Frage gelasen. Ich denke
mir geht es in etwa wie ihm.

ich habe folgendes mal probiert ...
"In Kurzfassung: vor allem, um Leute von unsinnigem Code wie solchem
abzuhalten:

sbi(DDRx, 1);
sbi(DDRx, 2);
sbi(DDRx, 4);

wo sie stattdessen gleich

DDRx = _BV(1)|_BV(2)|_BV(4);
"

da tut sich aber nichts.
Vielleicht stelle ich mich dumm an ... als Anfänger darf man das !

MfG Benjamin

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht meintest du

PORTA=_BV(1)|_BV(2)|_BV(4);

DDR schaltet nur die Datenrichtung.

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ja, und Atmel kann schreiben was die wollen und ihr könnt auch tuin
was ihr wollt.
Ich jedenfalls werden mich nach wie vor hüten, direkte Zugriffe auf
Hardware zu codieren.
Ich möchte nämlich in der Lage sein, ein Programm bei Bedarf auf einen
anderen Controller portieren zu können, und wenn derselbe dann die
direkte Portadressierung nicht kann, dann bin ich ganz schön a. A....
Sind die jedoch in eine Bibliotheksfunktion verpackt dann muss ich
lediglich die entsprechende Funktion anpassen und schon flutscht es
wieder.

P.S. Ihr könnt mir glauben, ich habe schon viele Portierungen gemacht
und mich schon oft über meine eigene Blödheit gewundert. UNd deswegen
gehören direkte Hardwareadressierungen für mich in's Reich des
Assemblers und nicht in eine Hochsprache.

Gruss
Christian

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist der Unterschied zwischen outb(REG, foo) und REG = foo?

Beides sind Hardwarezugriffe.  Wenn Du wirklich portabel sein willst,
brauchst Du für diese natürlich einen hardware abstraction layer
(HAL), aber das geht in aller Regel mehr oder weniger auf Kosten der
Performance, und ist bei Microcontrollern oft genug ziemlich zwecklos,
da Du deren andere Spezifika meist so weit ausreizen willst, daß eine
Portierung von A nach B sowieso vieles neu haben will.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausserdem macht man dann eben in etwa sowas:

#define OUTPUT PORTA

#define BIT0   0
#define BIT1   1
#define BIT2   2
[..]

[..]
    OUTPUT = _BV(BIT0) | _BV(BIT1);
[..]

Schon hat man eine minimalistische From eines HAL...

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.