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 !
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 :-)
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
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.
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 :-)
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?
... oder meinst du gar nicht PORTB=0x01, sondern PORTB|=0x01? Dann ziehe ich meinen Kommentar zurück g
Ja, genau das meinte ich. Menno, nimm doch nicht meine Postings um diese frühe Tageszeit so wörtlich :-)
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
Vielleicht meintest du PORTA=_BV(1)|_BV(2)|_BV(4); DDR schaltet nur die Datenrichtung.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.