SFR Adress-Pointer

Gast #2169368
Lesenswert?

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 #2171208
Lesenswert?

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 #2171297
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren