Forum: Mikrocontroller und Digitale Elektronik Register Auslesen


von Bend G. (frankyfarell0)


Lesenswert?

Hallo,

ich möchte einen 16 bit HW register auslesen uzw. 8bit nach 8 bit. Das 
Register sieht so aus:
1
NECNTxL ---------------------------------
2
        !   TEC         !      REC      !
3
        ---------------------------------
4
TEC (8 bit 0..7):  Transmit Error Counter   and
5
REC (8 bit 8..15):  Receive Error Counter
kann mir bitte jemand helfen auszulesen?
1
uInt8 varRec, varTec;
2
3
varRec = (uInt8)(CAN_NECNTxL&0xff) ;  // REC wert wird in varRec abgespeichert
4
varTec = (uInt8)((CAN_NECNTxL >> 8)& 0xff) ;  // TEC wert wird in varTec abgespeichert
Stimmt das so ?

Danke!

von Karl H. (kbuchegg)


Lesenswert?

Bend Guet schrieb:

> Stimmt das so ?

Hast du es ausprobiert?
Gab es dabei Probleme?
Hast du ein Ergebnis erhalten, welches dir unplausibel vorkommt?

von Stefan W. (dl6dx)


Lesenswert?

Bend Guet schrieb:
> ich möchte ein 16 bit HW register auslesen

Bei Zugriffen auf Statusregister etc. muss man immer im Datenblatt 
prüfen, ob ein Lesezugriff Werte verändert (z.B. Flags löscht).

In deinem Codebeispiel wird der Wert des TEC beim ersten Lesen 
"weggeworfen". Löscht der Lesezugriff die Bits, bekommst du beim zweiten 
Lesezugriff einen falschen Wert.

Im Zweifelsfall das komplette Register erst zwischenspeichern und dann 
aufteilen.
1
uint16_t temp;
2
uint8_t Rx_EC, Tx_EC;
3
4
temp = CAN_NECNTxL; // Register nur EINMAL lesen
5
6
Rx_EC = tmp & 0xFF; // Rx error count im low byte
7
Tx_EC = tmp >> 8;   // Tx error count im high byte

Grüße

Stefan

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wie ist denn CAN_NECNTxL definiert?

von Stefan W. (dl6dx)


Lesenswert?

Bend Guet schrieb:
> NECNTxL ---------------------------------
>         !   TEC         !      REC      !
>         ---------------------------------
> TEC (8 bit 0..7):  Transmit Error Counter   and
> REC (8 bit 8..15):  Receive Error Counter

Mir fällt gerade auf, dass das nicht zu deinem Code passt und, wenn die 
Angaben der Bitnummern stimmen, auch unüblich gezeichnet ist.

Analog zur Schreibweise von Zahlen (höchstwertigste Stelle links) 
zeichnet man solche Registerbelegungen ebenfalls mit dem 
höchstwertigsten Bit links und dem niedrigwertigsten Bit rechts.

Wenn deine Zeichnung stimmt, ist der REC in Bit 0..7 und der TEC in Bit 
8..15. Das passt auch zu deinem Code.

Stimmt die Bitnummerierung, ist sowohl die Zeichnung missdeutbar als 
auch dein Code falsch.

Was ist denn nun richtig?

Grüße

Stefan

Edit: In Beitrag "Register einlesen" hast du das 
Register anders belegt.
Dann bitte: Welcher Controller, wie ist das Register wirklich definiert?

von Stefan W. (dl6dx)


Lesenswert?

Johann L. schrieb:
> Wie ist denn CAN_NECNTxL definiert?

Hallo Johann,

wenn meine Glaskugel stimmt, geht es um einen Infineon XE166n (siehe 
Beitrag "CRC-Prüfsumme" ).

Nach dem dort verlinkten Datenblatt ist das Register mehrfach auslesbar 
und müsste beim Keil-Compiler auch als volatile definiert sein, da seine 
Inhalte ausschließlich durch den CAN-Nodecontroller gesetzt werden (S. 
14-11 und 14-72, alle Bits rwh).

Ach ja: Bit 0-7 ist der REC, 8-15 der TEC. Der Code in 
Beitrag "Re: Register Auslesen" passt also.

Grüße

Stefan

PS: An den TO: Da du immer wieder neue Threads aufmachst, verzettelt 
sich die Diskussion. Und damit man dir ohne zuvorigen Einsatz der 
Glaskugel helfen kann, nenne bitte "Ross und Reiter", sprich: Controller 
und Compiler.

von Bend G. (frankyfarell0)


Lesenswert?

Stefan Wagner schrieb:
> Bend Guet schrieb:
>> ich möchte ein 16 bit HW register auslesen
>
> Bei Zugriffen auf Statusregister etc. muss man immer im Datenblatt
> prüfen, ob ein Lesezugriff Werte verändert (z.B. Flags löscht).
>
> In deinem Codebeispiel wird der Wert des TEC beim ersten Lesen
> "weggeworfen". Löscht der Lesezugriff die Bits, bekommst du beim zweiten
> Lesezugriff einen falschen Wert.
>
> Im Zweifelsfall das komplette Register erst zwischenspeichern und dann
> aufteilen.
>
>
1
> uint16_t temp;
2
> uint8_t Rx_EC, Tx_EC;
3
> 
4
> temp = CAN_NECNTxL; // Register nur EINMAL lesen
5
> 
6
> Rx_EC = tmp & 0xFF; // Rx error count im low byte
7
> Tx_EC = tmp >> 8;   // Tx error count im high byte
8
>
>
> Grüße
>
> Stefan

Hi Stefan Wagner,

vielen Dank Deine Antwort hat mir sehr geholfen zum ziel zu kommen.

Grüße
Bend

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.