Forum: Mikrocontroller und Digitale Elektronik SFR Adress-Pointer


von dspicler (Gast)


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.

von dspicler (Gast)


Angehängte Dateien:

Lesenswert?

Habe es jetz mal so wie im Code im Anhanh zu sehen realisiert.
Funktioniert einwandfrei für den UART2. Falls jemand den "Stil" 
beanstandet oder eine bessere Art und Weise für wenig 
Speicherplatzbedarf kennt bitte posten. Danke!

von dspicler (Gast)


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?

von dspicler (Gast)


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!

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.