Forum: Compiler & IDEs C Anfänger


von Stefan Dreger (Gast)


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 !

von Fritz Ganter (Gast)


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 :-)

von Stefan Dreger (Gast)


Lesenswert?

Vielen Dank !!!!

von OldBug (Gast)


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

von Fritz Ganter (Gast)


Lesenswert?

Hab ich eigentlich schon gefragt warum eigentlich?

von Jörg Wunsch (Gast)


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.

von Fritz Ganter (Gast)


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 :-)

von Christof Krüger (Gast)


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?

von Christof Krüger (Gast)


Lesenswert?

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

von Fritz Ganter (Gast)


Lesenswert?

Ja, genau das meinte ich.

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

von Christof Krüger (Gast)


Lesenswert?

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

von Benjamin (Gast)


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

von Fritz Ganter (Gast)


Lesenswert?

Vielleicht meintest du

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

DDR schaltet nur die Datenrichtung.

von Christian Schifferle (Gast)


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

von Jörg Wunsch (Gast)


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.

von OldBug (Gast)


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...

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.