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.
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
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...
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
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...
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.