C Programmieren, 10er und 1er getrennt speichern

Gast #4221665
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?
Angehängte Dateien:
Gast #4221695
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
Moderator Persönliche Seite #4221697
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?
#4221699
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.
Gast #4221715
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;
Gast #4221736
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
}
#4221740
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.
#4221748
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 ;-)"
Gast #4221756
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
Gast #4221770
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
}
Gast #4221842
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.
Gast #4221846
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?
#4221859
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 ?
Gast #4221909
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
#4221916
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 ;-)
Gast #4221921
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?
#4221965
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren