Hallo, ich möchte einen 16 bit HW register auslesen uzw. 8bit nach 8 bit. Das Register sieht so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
kann mir bitte jemand helfen auszulesen?
1 | |
2 | |
3 | |
4 | |
Stimmt das so ? Danke!
|
Anzeige
|
Register AuslesenHallo, ich möchte einen 16 bit HW register auslesen uzw. 8bit nach 8 bit. Das Register sieht so aus:
kann mir bitte jemand helfen auszulesen?
Stimmt das so ? Danke! Bend Guet schrieb: > Stimmt das so ? Hast du es ausprobiert? Gab es dabei Probleme? Hast du ein Ergebnis erhalten, welches dir unplausibel vorkommt? 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.
Grüße Stefan Wie ist denn CAN_NECNTxL definiert? 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? 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. 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. > >
> > Grüße > > Stefan Hi Stefan Wagner, vielen Dank Deine Antwort hat mir sehr geholfen zum ziel zu kommen. Grüße Bend Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|