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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karl D. (lochball)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

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]
  • [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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.