SFR Adress-Pointer

Gast #2169368
Hallo Leute,
ich beschäftige mich mit dsPics und habe mal ein paar fragen zum Aufbau 
der Device header Files.
Zunächst einmal möchte ich mir beispielsweise eine Funktion zum 
Initialisieren des I2C, eine Funktion zum Lesen und eine Funktion zum 
Schreiben des I2C anlegen.
Da z.B. der dspic33FJ256GP710A zwei I2Cs hat, würde ich gerne 
universelle Funktionen anlegen, die dann wierderum eine Adresse 
übergeben bekommen.
Innerhalb der Funktionen sollen dann die verschieden Register 
beschrieben werden können. Nachfolgend ein Beispiel:
1
void Init_I2C (I2C_SFR* I2C)
2
{
3
   I2C->con = 0xAFFE;
4
}

Soweit so gut. Innerhalb der Funktion soll nun je nach Übergabe entweder 
also I2C1CON oder I2C2CON beschrieben werden (und natürlich die anderen 
entsprechenden Register der Hardware I2C1 ODER I2C2).
Nun stellt sich mir die Frage, in welcher Form ich der Funktion die 
Adresse des I2C1 oder des I2C2 übergebe. In dem Device Header File sind 
ja nur die einzelnen Register definiert und nicht beispielsweise ein 
struct mit den allen Register einer Peripherie.

Könnte ich nun am einfachsten selbst ein struct im (eigenen!) 
Peripherie-Headeranlegen, welches mir dieses abnimmt? Etwa so:
1
typedef struct {
2
   unsigned int i2c_rcv;
3
   unsigned int i2c_trn;
4
   unsigned int i2c_brg;
5
   unsigned int i2c_con;
6
   unsigned int i2c_stat;
7
   unsigned int i2c_add;
8
   unsigned int i2c_msk;
9
}I2C_SFR;
10

11
const I2C_SFR* I2C_1 = (I2C_SFR*)& &I2C1RCV;
12
const I2C_SFR* I2C_2 = (I2C_SFR*)& &I2C2RCV;

Hinweis: I2C1CON und I2C2CON sind die untersten Adressen der jeweilgen 
Peripherie-Adressen. Link: 
ww1.microchip.com/downloads/en/DeviceDoc/70593B.pdf Seite 55.

Danke schonmal.
Gast
Hmm, ich seh grad im Disassembler Listing, dass das ganze codemäßig 
ziemlich aufgebläht wird.

Der Befehl "U1MODEbits.UARTEN = 0;" wird mit einem Assemblerbefehl 
erledigt.
Der Befehl "Uart->uxmode |= UART_Mode_UARTEN_enabled;" braucht ganze 
sechs (!) Assemblerbefehle....

Scheiße irgendwie. Jmd. n Rat parat?
Gast
In Anlehnung an meine bisherigen Posts, was ist wohl "erstrebenswerter"?
Schnell ausführbarer Code, also für jede Peripherie eine eigene FUnktion 
fürs Initialisieren, Öffnen, Schließen, etc. oder kompakter Code, also 
für alle Peripherien jeweils eine einzige Funktion?

Stehe grade am Scheideweg der Implementierung... Bitte sagt mal eure 
Meinung und Anichten, speziell die "alten" und "erfahrenen" Hasen^^

Danke!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.