Forum: Mikrocontroller und Digitale Elektronik C Programmieren, 10er und 1er getrennt speichern


von Simon (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Gibt es hier einen simplen weg?
1
x1 = 25 % 10;
2
x2 = 25 / 10;

von Der Andere (Gast)


Lesenswert?

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

von Rupert (Gast)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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 ...

von Simon (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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)

von hääää (Gast)


Lesenswert?

Simon schrieb:
> am besten ohne Multiplikation
warum?

von Der Andere (Gast)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

Simon schrieb:
> (denke ich)

Wenn das Nachschauen so einfach ist wie in diesem Fall, dann sollte man 
besser nicht zu viel denken ...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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 ...

von Simon (Gast)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

Simon schrieb:
> ich dachte immer da ist das
> format was bei raus kommt direkt die Minuten

Wo raus kommt ?

von Simon (Gast)


Lesenswert?

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;

von Volker S. (vloki)


Lesenswert?

Da kommt aber ganz schön oft "BCD" vor, in den Kommentaren ;-)

von Peter D. (peda)


Lesenswert?

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
}

von Simon (Gast)


Lesenswert?

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
}

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Schrehbfeiler gefunden:
1
uint8_t bcd2bin( uint8_t val )
2
{
3
  return val % 16 + val / 16 * 10;
4
}

von Volker S. (vloki)


Lesenswert?

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
von Simon (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

> 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
von Simon (Gast)


Lesenswert?

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
}

von Volker S. (vloki)


Lesenswert?

Ich verstehe es immer noch nicht ;-)

von Karl M. (Gast)


Lesenswert?

Volker,
was fehlt noch zu deinem Verständnis ?

von Volker S. (vloki)


Lesenswert?

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
von Karl M. (Gast)


Lesenswert?

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.

von npn (Gast)


Lesenswert?

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?

von Simon (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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
von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

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
von Simon (Gast)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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 ;-)

von Simon (Gast)


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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
Noch kein Account? Hier anmelden.