Frage: Wie bekomme ich die 10er und 1er Stellen getrennt voneinander? Ich möchte bei Microchip die interne rtccTime zum externen MCP7941 RTCC kopieren. Leider verwendet (siehe Bild) der externe RTCC ein Format das 10er und 1er stellen trennt. z.B. 25 Minuten müsste ich aufteilen auf 20 und auf 5 Gibt es hier einen simplen weg?
Simon schrieb: > Gibt es hier einen simplen weg? Grundschulmathematik. Teilen mit Rest. In C nennt sind das die Operatoren Division '/' und Modulo '%' https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Ja. Stichworte sind Integer-Division und Modulo. 25 durch 10 ist 2 mit einem Rest von 5. So hast du die Zehner und die Einerstelle getrennt.
Simon schrieb: > Ich möchte bei Microchip die interne rtccTime zum externen MCP7941 RTCC > kopieren. Was meinst du mit "interne rtccTime" ? zB. beim PIC18F27J11 wird auch intern mit dem BCD Code gearbeitet. Am besten du speicherst und verarbeitest die Zeit auch "intern" in BCD und sparst dir die ganze Umrechnerei. Die haben das Format ABSICHTLICH so gewählt ...
Peter II schrieb: > x1 = 25 % 10; > x2 = 25 / 10; funzt perfekt. Jetzt knobel ich natürlich am Weg wieder zurück also von 2 und 5 auf die 25, am besten ohne multiplikation
Volker S. schrieb: > Am besten du speicherst und verarbeitest die Zeit auch "intern" in BCD > und sparst dir die ganze Umrechnerei. Die haben das Format ABSICHTLICH > so gewählt ... Ich weiß nicht wie das beim PIC18 ist, aber beim PIC32MX695 hat die interne uhr das rtccTime Format, da sind die Zahlen direkt so hinterlegt (denke ich)
Simon schrieb: > Peter II schrieb: >> x1 = 25 % 10; >> x2 = 25 / 10; > > funzt perfekt. > > Jetzt knobel ich natürlich am Weg wieder zurück also von 2 und 5 auf die > 25, am besten ohne multiplikation ROFL. QPeterII: jetzt siehst du mal was passiert wenn man jemandem die Lösung serviert statt ihm nur eine Anregung zu geben selbstständig zu denken und die Lösung selbst herauszufinden. Beim nächsten noch einfacheren Problem stellt er die nächste Frage, warum soll er selber denken, er findet doch wieder einen Dummen. Viel Spass beim Vorkauen :-) @Simon: Meinst du nicht du solltest die Grundschule nochmal wiederholen? Zumindest in Mathe? SCNR
Simon schrieb: > (denke ich) Wenn das Nachschauen so einfach ist wie in diesem Fall, dann sollte man besser nicht zu viel denken ...
Simon schrieb: > Peter II schrieb: >> x1 = 25 % 10; >> x2 = 25 / 10; > > funzt perfekt. > > > Jetzt knobel ich natürlich am Weg wieder zurück also von 2 und 5 auf die > 25, am besten ohne multiplikation Du musst entweder mit 10 multiplizieren oder mal ein wenig nachdenken, aus welchen Zweierpotenzen sich die 10 zusammensetzt: 10 = 8 + 2. Also:
1 | mm = 10 * x2 + x1; |
2 | <==> mm = (8 + 2) * x2 + x1; |
3 | <==> mm = 8 * x2 + 2 * x2 + x1; |
4 | <==> mm = (x2 << 3) + (x2 << 1) + x1; |
War das so schwierig?
Leute, bevor ihr euch hier weiter einen abrechnet: Auch für den PIC32.. gilt: BCD format for smaller firmware overhead -> Lass es einfach in diesem Format!
:
Bearbeitet durch User
Volker S. schrieb: > Die haben das Format ABSICHTLICH > so gewählt ... Nö, das Format ist historisch entstanden und wurde nur immer weiter mitgeschleppt. Damit werden Vergleiche auf >,< zum Albtraum. Auch muß man alle Zugriffe atomar kapseln, sonst hat man alte und neue Digits gemischt. Heutzutage hat sich das 32Bit bzw. 64Bit Sekunden Format durchgesetzt. Die CPU liest einmalig nach dem Reset diese vergurkte alte Format aus dem RTC-Chip und wandelt es in Sekunden um. Einige neuere RTCs können sogar direkt 32Bit Sekunden zählen. Damit werden Rechnungen viel einfacher, bzw. eine 32Bit-CPU muß nichtmal mehr das Zeit auslesen/setzen atomar kapseln. Nur zur Anzeige wird wieder zurück gewandelt. Da der Mensch eh nur sehr langsam lesen kann (aus CPU-Sicht), kostet das kaum Rechenzeit.
Peter D. schrieb: > Heutzutage hat sich das 32Bit bzw. 64Bit Sekunden Format durchgesetzt. > Die CPU liest einmalig nach dem Reset diese vergurkte alte Format aus > dem RTC-Chip und wandelt es in Sekunden um. Bei dem PIC32 anscheinend nicht ...
Volker S. schrieb: > -> Lass es einfach in diesem Format! Würde ich gerne geht jedoch nicht. Weil du nicht einfach die 25 ins register vom externen MCP7941 schreiben kannst. oder momemnt mal... 25 wäre bei dem MCP7941 in hex 0x25, da frage ich mich die das bei der Internen RTCC vom PIC32 gehandhabt wird. ich dachte immer da ist das format was bei raus kommt direkt die Minuten.
Simon schrieb: > ich dachte immer da ist das > format was bei raus kommt direkt die Minuten Wo raus kommt ?
Volker S. schrieb: > Wo raus kommt ? Aus dem PIC32, der internen RTCC
1 | typedef union |
2 | {
|
3 | struct
|
4 | {
|
5 | unsigned char rsvd; // reserved for future use. should be 0 |
6 | unsigned char sec; // BCD codification for seconds, 00-59 |
7 | unsigned char min; // BCD codification for minutes, 00-59 |
8 | unsigned char hour; // BCD codification for hours, 00-24 |
9 | }; // field access |
10 | unsigned char b[4]; // byte access |
11 | unsigned short w[2]; // 16 bits access |
12 | unsigned long l; // 32 bits access |
13 | }rtccTime; |
Da kommt aber ganz schön oft "BCD" vor, in den Kommentaren ;-)
1 | uint8_t bin2bcd( uint8_t val ) |
2 | {
|
3 | return val / 10 | val % 10 * 16; |
4 | }
|
1 | uint8_t bcd2bin( uint8_t val ) |
2 | {
|
3 | return val % 16 | val / 16 * 10; |
4 | }
|
1 | So sieht das bisher aus und funzt schonmal bestens |
2 | |
3 | ob "<<4" das selbe ist wie "*16" ? (ich meine nach dem compilen) |
4 | |
5 | |
6 | static UINT8 convert_rtcc_mcp7941(UINT8 x) { |
7 | UINT8 m; |
8 | UINT8 h; |
9 | m = x % 10; |
10 | h = x / 10; |
11 | x = (h << 4); |
12 | x |= m; |
13 | return x; |
14 | }
|
Volker S. schrieb: > Bei dem PIC32 anscheinend nicht ... Wenn Du viel mit Zeiten rechnen mußt, lohnt sich die einmalige Umrechnung nach dem Reset auch beim PIC32. Ja, es fällt den Menschen schwer, alte Zöpfe abzuschneiden. Mich ärgert es z.B. auch, daß bei den ARM-Cortex immer diese grottenalte 16550 UART vom PC übernommen wird, die nichtmal den 9-Bit Mode kann. Es wird leider oft dem bekannteren gegenüber dem leistungsfähigerem der Vorzug gegeben.
Schrehbfeiler gefunden:
1 | uint8_t bcd2bin( uint8_t val ) |
2 | {
|
3 | return val % 16 + val / 16 * 10; |
4 | }
|
Peter D. schrieb: > Volker S. schrieb: >> Bei dem PIC32 anscheinend nicht ... > > Wenn Du viel mit Zeiten rechnen mußt, lohnt sich die einmalige > Umrechnung nach dem Reset auch beim PIC32. Ja, wenn ... Ich hatte erst einmal das Vergnügen mit der internen RTCC und da musste ich eigentlich nur vergleichen. Habe dann die Vergleiche einfach in BCD gemacht. Simon schrieb: > So sieht das bisher aus und funzt schonmal bestens > > ob "<<4" das selbe ist wie "*16" ? (ich meine nach dem compilen) > ... 4 mal shiften (4 mal mit 2 multiplizieren oder 2^4) = 16 aber was deine Funktion anbelangt: "Verstehe ich nicht ;-)"
:
Bearbeitet durch User
Peter D. schrieb: > uint8_t bin2bcd( uint8_t val ) > { > return val / 10 | val % 10 * 16; > } > uint8_t bcd2bin( uint8_t val ) > { > return val % 16 | val / 16 * 10; > } Das sah zwar super aus, funktioniert jedoch nicht wirklich. y = bin2bcd(31); // 0x13 bzw 19 z = bcd2bin(0x26); // 0x16 bzw 22
Simon schrieb: > Das sah zwar super aus, funktioniert jedoch nicht wirklich. So ist das mit Schnellschüssen. Aber das Prinzip sollte erkennbar sein, kann jeder also leicht korrigieren.
> uint8_t bin2bcd( uint8_t val ) > { > return val / 10 | val % 10 * 16; > } uint8_t bin2bcd( uint8_t val ) { return val / 10 *16 | val % 10; } <edit> ääähhh, zu spät ;-)
:
Bearbeitet durch User
Ich würde sagen geht :-)
1 | static UINT8 convert_rtcc_mcp7941(UINT8 x) { |
2 | UINT8 m; |
3 | UINT8 h; |
4 | m = x % 10; |
5 | h = x / 10; |
6 | x = (h << 4); |
7 | x |= m; |
8 | return x; |
9 | }
|
10 | |
11 | static UINT8 convert_mcp7941_rtcc(UINT8 x) { |
12 | UINT8 mz; |
13 | UINT8 hz; |
14 | mz = x & 0x0F; |
15 | hz = (x >> 4); |
16 | hz = hz * 10; |
17 | x = hz+mz; |
18 | return x; |
19 | }
|
Karl M. schrieb: > Volker, > was fehlt noch zu deinem Verständnis ? Von den Variablen-Namen (h für stunden m für minuten alles in einem byte) in der Funktion mal abgesehen, verstehe ich den Sinn der Umwandlung nicht, da eigentlich beide RTCCs BCD Formate verwenden.
:
Bearbeitet durch User
Hallo Volker, die Funktionen dienen der BCD zu Dezimalwandlung und zurück, wenn der µC mit den BCD Zahlen auch etwas anfangen soll, also verrechnen oder ausgeben. Zum Grundverständnis gehört es alt dazu, dass es verschiedene Darstellung von Zahlen, hier der Zeit, gibt. Von Zahlen zur Basis 8 Oktalzahlen hast Du bestimmt auch noch nichts gehört ? Bevor die Anmerkungen kommen, das ist hier überhaupt nicht wichtig. Wenn es immer nur BCD-Zahlen sind, dann kann man diese auch wie Eins betrachten.
Volker S. schrieb: > Karl M. schrieb: >> Volker, >> was fehlt noch zu deinem Verständnis ? > > Von den Variablen-Namen (h für stunden m für minuten alles in einem > byte) in der Funktion mal abgesehen, verstehe ich den Sinn der > Umwandlung nicht, da eigentlich beide RTCCs BCD Formate verwenden. Wenn man aber mit den Zeiten rechnen will/muß, dann ist das BCD-Format nicht so gut geeignet. Hat Peter Dannegger weiter oben schon ausführlich erklärt. Ist es das, was du meinst?
Wenn man bedenkt das dieses ganze Theather hier ansich nur entsteht wegen dem fehlenden VBAT pin am PIC32 .... da könnte ich mir die ganze externe RTCC kacke sparen.
Volker, man muss aber im Datenblatt der MCP79410/MCP79411/MCP79412 genau die Tabelle 5-1: DETAILED RTCC REGISTER MAP lesen. Die Speicherstellen enthalten auch noch weitere "Steuerbit". Z.B. an Adr. 02h.
npn schrieb: > Volker S. schrieb: >> Karl M. schrieb: >>> Volker, >>> was fehlt noch zu deinem Verständnis ? >> >> Von den Variablen-Namen (h für stunden m für minuten alles in einem >> byte) in der Funktion mal abgesehen, verstehe ich den Sinn der >> Umwandlung nicht, da eigentlich beide RTCCs BCD Formate verwenden. > > Wenn man aber mit den Zeiten rechnen will/muß, dann ist das BCD-Format > nicht so gut geeignet. Hat Peter Dannegger weiter oben schon ausführlich > erklärt. Ist es das, was du meinst? Nein, von rechnen war doch nie die Rede ! Simon schrieb: > Ich möchte bei Microchip die interne rtccTime zum externen MCP7941 RTCC > kopieren. Also wenn wir die "zusätzlichen Steuerbits" mal vorerst beiseite lassen, weil das ein anders Problem ist. Was soll die Konvertierung ?
:
Bearbeitet durch User
Simon schrieb: > Ich möchte bei Microchip die interne rtccTime zum externen MCP7941 RTCC > kopieren. Volker S. schrieb: > Was soll die Konvertierung ?
:
Bearbeitet durch User
Volker, ich glaube du hast recht, wenn ich ins Datenblatt sehe dann sind die Register tatsächlich identisch, sprich ich kann die direkt so kopieren. jetzt bleibt nur noch zu klären welches format dann die rtccTime und rtccDate structure enthällt. dann müste ich ja jedesmal die zeit erst umwandeln, bah ist das ecklig
Simon schrieb: > jetzt bleibt nur noch zu klären welches format dann die rtccTime und > rtccDate structure enthällt. Was glaubst du soll das BCD in den Kommentaren bedeuten ??? Umrechnen musst du vielleicht schon, weil es in deinem Programm dann "möglicherweise" einfacher wird mit irgendwelchen Berechnungen. (Darum ging es bisher aber nicht ;-)
Machen wir doch mal nen simples Beispiel. du willst ein Datum/Uhrzeit per UART ausgeben. Dann wird man das umrechnen müssen, da führt doch kein weg mehr daran vorbei. Aber das muß doch auch anderen hier schon aufegafllen sein dei mit der PIC32 RTCC schonmal was gemacht haben. Hat Microchip da fertige funktionen für?
Simon schrieb: > Machen wir doch mal nen simples Beispiel. du willst ein Datum/Uhrzeit > per UART ausgeben. Dann wird man das umrechnen müssen, da führt doch > kein weg mehr daran vorbei. Eben nicht ;-) Es ist doch viel einfacher, wenn du die Ziffern schon separiert (BCD) vorliegen hast.
Simon schrieb: > Machen wir doch mal nen simples Beispiel. du willst ein Datum/Uhrzeit > per UART ausgeben. Dann wird man das umrechnen müssen, da führt doch > kein weg mehr daran vorbei. Kommt drauf an. Bei reiner Ausgabe (und keiner Rechnung) reicht einfach die Ausgabe in Hex - welche auf vielen µCs einfacher als in Dez ist.
Stimmt bei einer Ausgabe könnte man das einfach nur mit "0x0F" bzw mit einem ">>4" verschieben und durch hinzuzählen von 48 den ascii wert haben.
Sag ich doch. Viel einfacher ;-) Also es hat schon einen Grund, warum das Format so ist wie es ist. Auch wenn das wie Peter D. anmerkte vielleicht nicht so "modern" ist. Ganz schlecht ist es auch nicht. Sonst gäbe es nur noch RTCC die Sekunden-Formate von einem best. Zeitpunkt aus verwenden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.