Hallo,
ich habe gerade ein Problem beim Umrechnen einer Unix-Zeit in die
normale UTC Zeit (dargestellt im BCD Format für eine RTC).
Problem:
Ich führe den selben Code 7 mal aus, um alle Zeit-Formate zu erhalten,
die ich möchte.
Die ersten 3 mal klappt es perfekt, doch beim 4 mal (manchmal beim 5
mal) bricht der Debugger ab - er bleibt dann bei der Funktion "atoi",
selten aber auch bei "strftime" hängen.
Es macht dabei keinen Unterschied welches Format zu erst ausgelesen wird
(alle durchgetauscht) oder an welche Stelle des uint8_t Array
geschrieben wird - immer beim 4 mal bricht es ab.
Weiß jemand, woran dies liegen kann?
Unten befindet sich noch der benutze Code und die Erklärung zur
Umrechnung.
MC: Dialog Semiconductor DA14680 (ARM M0)
Viele Grüße,
Johannes
------------------------------------------------------------------------
Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
time_t unix_time = 1264343758;
uint8_t RTC_Puffer_w[7] = {0, 0, 0, 0, 0, 0, 0};
struct tm * lt;
char buf_dec[5] = {0, 0, 0, 0, 0} ;
uint8_t temp_RTC_w = 0;
//Umrechnung von Unixzeit zu BCD (Binär)////////////////////////
lt = localtime(&unix_time);
//Sekunde///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%S", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[0] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w %10) );
//Minute///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%M", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[1] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
//Stunde///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%H", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[2] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
//Tag///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%d", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[3] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
//Wochentag///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%w", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[4] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
//Monat///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%m", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[5] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
//Jahr///////////////////
temp_RTC_w = 0;
strftime(buf_dec, 5, "%y", lt);
temp_RTC_w = atoi(buf_dec);
RTC_Puffer_w[6] = ( ((temp_RTC_w/10) << 4) | (temp_RTC_w % 10) );
------------------------------------------------------------------------
Vorgehen der Umrechnung:
Mit Hilfe der Funktion "localtime" wird die Unix-Zeit in die übliche UTC
Zeit umgerechnet und den Struct "lt" gespeichert.
Um daraus das gewünschte Zeitformat zu erhalten, benutzte ich die
"strftime" Funktion, der ich im dritten Argument angeben kann, welchen
Wert ich aus dem Struct möchte (z.B. steht "%M" für Minute als
zweistellige Zahl von 00 bis 59).
Da der gewünschte Zeit Wert-als Char-Array gespeichert wird, muss er
noch mithilfe von "atoi" in ein Int umgewandelt werden.
Umrechnen in BCD-Zahl (Binär):
Die zweistellige Int Zahl wird durch 10 dividiert um nur die vordere
Zahl zu erhalten (zweite Zahl steht hinter dem Komma -> fällt weg bei
Int). Diese wird dann binär um 4 stellen nach links geschoben und bildet
die vordere BCD Zahl.
Die hintere BCD Zahl erhält man durch Modulo mit 10.