eine funktion für verschiedene Register

Gast #4134989
Lesenswert?
• ▲
▼
Hi,
ich möchte gerne eine Funktion schreiben, mit der ich die Bits in den 
Identifier-Register für CAN beschreiben kann.
jetzt ist es so, dass ihc neben CAN1 auch CAN2 habe.

die Priorität im Identifier beschreibe ich momentan so
1
void C1PRIO(int value)
2
{
3
    C1TX0SIDbits.SID10 = (value & 0x10)>>4;
4
    C1TX0SIDbits.SID9  = (value & 0x08)>>3;
5
    C1TX0SIDbits.SID8  = (value & 0x04)>>2;
6
    C1TX0SIDbits.SID7  = (value & 0x02)>>1;
7
    C1TX0SIDbits.SID6  = (value & 0x01)>>0;
8
}

nur für einen CAN.
muss ich für den zweiten CAN die selbe Funktion noch einmal schreiben? 
oder gibt es eine möglichkeit, dass wenn ich C2PRIO(0x00) alle bits für 
das CAN2 register beschrieben werden?

Johannes
#4135032
Lesenswert?
• ▲
▼
Statt der vorgefertigten Registerbeschreibungen aus dem Header kann man 
auch pointer für den Zugriff auf den sfr Bereich nutzen.

Ich würde dann aber auch gleich statt des Zugriffs auf einzelne Bits mit 
aufwändigen shifts direkt mit dem gesamten Register arbeiten.

irgendwas in dieser Richtung:

volatile C1TX0SIDBITS * ptr = 0x360;

ptr->SID10_6 = value & 0x1F;

Oder gleich
*ptr = ((*ptr) & 0xF800) | ((value << 11) & 0xF800)

ptr kannst du dann wahlweise eine Adresse auch CAN1 oder CAN2 zuweisen.

Richtig Sinn macht es, den Pointer an den Anfang des CAN Bereichs zeigen 
zu lassen und dann jeweils den Registeroffset hinzuzunehmen.

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