Forum: Compiler & IDEs z.B. <util/twi.h> für ATmege328PB


von Carl Mikael B. (Firma: Held der Arbeit) (lochball)


Lesenswert?

Moin,

der ATmega328PB hat ja bekanntlich doppelte Ressourcen, z.B. für I2C 
bzw. TWI, UART, etc. In dem obigen File <util/twi.h> werden ja Makros 
speziell für TWI definiert, die allerdings nicht für eine 
Mehrfachverwendung in einer MCU geeignet sind, z.B.

#define TW_STATUS (TWSR & TW_STATUS_MASK) // kann aus naheliegenden 
Gründen so nicht für TWI0 oder TWI1 verwendet werden

Für den m328PB müsste an dieser Stelle z.B. für den TWI0 folgendes 
Konstrukt zu erwarten erwarten sein:

#define TW0_STATUS (TWSR0 & TW0_STATUS_MASK) // sinn gemäß auch für TWI1

D.h. es müsste ggf. für den m328pb eine eigene <util/twi_m328pb> mit den 
Besonderheiten dieser MCU angelegt werden. Das könnte ich hier händisch 
für meine Verhältnisse im Manhattan-Style so machen und entsprechend für 
mich so ablegen. Aber vielleicht gibt es dieses File ja bereits 
irgendwo...

Frage: Ist dieser Gedankengang überhaupt so grundsätzlich richtig? Gibt 
es bereits hierzu eine Lösung mit Fallunterscheidung bzgl. MCU oder 
Ressourcen der jeweiligen MCU?

Da ich faul bin, würde ich mir diese Extraarbeit verkneifen, sollte es 
bereits eine fertige Lösung irgendwo geben.

Mit freundlichen Grüßen.

von Oliver S. (oliverso)


Lesenswert?

Karl D. schrieb:
> Für den m328PB müsste an dieser Stelle z.B. für den TWI0 folgendes
> Konstrukt zu erwarten erwarten sein:
>
> #define TW0_STATUS (TWSR0 & TW0_STATUS_MASK) //

Das headerfile enthält genau dieses eine define, das für den Mega328PB 
angepasst werden müsste.

Nur Mut, du schaffst das ;)

Oliver

von c-hater (Gast)


Lesenswert?

Oliver S. schrieb:

> Das headerfile enthält genau dieses eine define, das für den Mega328PB
> angepasst werden müsste.
>
> Nur Mut, du schaffst das ;)

Du hast das Problem des TO nicht erkannt. Es ist natürlich ziemlich 
leicht, den Scheiß statt über SPI0 über SPI1 laufen zu lassen.

Es ist aber (jedenfalls für Anfänger) sehr viel schwieriger, BEIDE 
SPI-Schnittstellen gleichzeitig zu nutzen, denn dafür ist der Macro-Rotz 
einfach nicht geschrieben und auch die Header des Mega328P (im Gegensatz 
zu den XMega und -Abkömmlingen) nicht wirklich...

Wenn man das mit Macros hinkriegen will, muss man in C (bzw. im Wahnsinn 
des Präprozessors) schon einigermaßen sattelfest sein...

von Oliver S. (oliverso)


Lesenswert?

c-hater schrieb:
> Wenn man das mit Macros hinkriegen will, muss man in C (bzw. im Wahnsinn
> des Präprozessors) schon einigermaßen sattelfest sein...

Warum sollte man das auch tun?

Außer dem (ziemlich nutzlosen) Header mit ein paar define-Konstanten für 
den twi gibts in der avrlibc überhaupt keine Macros zur Ansteuerung von 
Spi, Usart, Twi, oder sonstwas. Es gibt ein paar Makros für die 
zeitkritischen Registerzugriffe beim Flash und beim Watchdog, dazu ein 
paar zur Baudratenberechnung der Usarts. Mehr nicht.
Was die sonst noch zur Verfügung stellt, sind die Register- und 
Pinnamen. Damit lässt sich mehrere SPIs in C genauso einfach oder 
kompliziert programmieren wie in Assembler.

Keine Ahnung, wegen was du da wieder rumblökst.

Oliver

von c-hater (Gast)


Lesenswert?

Oliver S. schrieb:

> Außer dem (ziemlich nutzlosen) Header mit ein paar define-Konstanten für
> den twi gibts in der avrlibc

Aber genau um die geht es nunmal. Dass die nutzlos werden, sobald es 
mehr als eine Unit gibt, ist eben das Problem...

Du bist geistig nicht so ganz auf der Höhe, oder?

> Was die sonst noch zur Verfügung stellt, sind die Register- und
> Pinnamen. Damit lässt sich mehrere SPIs in C genauso einfach oder
> kompliziert programmieren wie in Assembler.

Natürlich. Das war allerdings überhaupt nicht das Problem des TO. Der 
kann's weder in Assembler noch in C, verläßt sich aber offensichtlich 
darauf, dass es in C einfacher ist. Weil es grenzdebile Vollidioten wie 
du ihm immer wieder als Axiom vorbeten, das es so WÄRE...

von Veit D. (devil-elec)


Lesenswert?

Hallo Karl,

im Headerfile vom ATmega328PB sind
TWSR0 und TWSR1
definiert.

Es sind auch die Statusbits für diese beiden Register getrennt 
definiert. Das ist aber doppelt gemoppelt.
Es ist ausreichend wenn du TWS3 ... TWS7 verwendest.
Damit kannst du die Definition von TW_STATUS_MASK aus der twi.h ohne 
Änderung verwenden.

Du musst dir jetzt nur in deinem Code 2 neue TWn_STATUS definieren.
So ähnlich wie du schon gedacht hast.
1
#define TW0_STATUS (TWSR0 & TW_STATUS_MASK)
2
#define TW1_STATUS (TWSR1 & TW_STATUS_MASK)
Mehr musst du nicht machen.

Da ich jedoch kein Freund von defines bin, außer es lässt sich nicht 
vermeiden, kannst dir auch eine Funktion mit Parameter und Rückgabewert 
schreiben. Wie du magst.

von Oliver S. (oliverso)


Lesenswert?

Veit D. schrieb:
> Da ich jedoch kein Freund von defines bin, außer es lässt sich nicht
> vermeiden, kannst dir auch eine Funktion mit Parameter und Rückgabewert
> schreiben. Wie du magst.

Brauchen tut man weder das eine noch das andere. Diese defines sind 
eigentlich völlig zweckfrei.

Oliver

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ganz so krass würde ich das nicht beschreiben. Die defines im Controller 
Headerfile sind  nicht zweckfrei. Das ist eine gemeinsame Basis für 
alle. Wenn man diese nicht nutzt, müßte ja jeder jedes einzelne Bit für 
alle Register selbst rausfischen und dann unleserlich in seinem Code dem 
gewünschten Register zuweisen. Verwendet man die definierten Namen liest 
man schon was jemand in seinem Code machen möchte. Da muss man nicht 
erst immer und immer wieder das Manual rausholen und die Bits abzählen.

von Oliver S. (oliverso)


Lesenswert?

Veit D. schrieb:
> ganz so krass würde ich das nicht beschreiben. Die defines im Controller
> Headerfile sind  nicht zweckfrei. Das ist eine gemeinsame Basis für
> alle. Wenn man diese nicht nutzt, müßte ja jeder jedes einzelne Bit für
> alle Register selbst rausfischen und dann unleserlich in seinem Code dem
> gewünschten Register zuweisen.

Die defines in dem headerfile  <util/twi.h>, um das es hier geht, sind 
zweckfrei. Die darin definierten defines sollte vermutlich mal die 
Nutzung des TWI vereinfachen, helfen aber niemandem weiter.

Mit Bitnamen oder Registernamen aus dem Datenblatt haben die nichts zu 
tun.

Oliver

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ja okay, dass hatte ich in Gedanken vermischt, weil ich gerade mit einem 
Controller Headerfile arbeite. Alles gut.

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.