C Programmieren, 10er und 1er getrennt speichern

Gast #4221665
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
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)
Gast
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
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?
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
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.
Gast
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
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.
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
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
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
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
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?
Gast
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 ?
Gast
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 ;-)
Gast
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?
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.