Register Auslesen

OP #3225014
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!
#3226816
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
#3226849
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?
#3226896
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.
OP #3233512
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.