11-06-2012, 10:17 AM
(Seda postitust muudeti viimati: 03-07-2012, 11:03 AM ja muutjaks oli tvtv.)
Mikronkontrolleri jaoks on sprintf vb. liiga ressursinõudlik, kui sul seda funktsiooni just palju tarvis pole. Selline tähelepanek ka veel, et DS1337 hoiab suuremaid numbreid BCD formaadis. Võrreldes kümnendnendsüsteemiga on neid tunduvalt lihtsam ja odavam stringiks teisendada. Võrdlemiseks ja tehte tegemiseks on samas vaja eraldi funktsioone. Microchip-i teek <math.h> peaks sisaldama ka mingeid funktsioone BCD formaadis numbritega manipuleerimiseks, aga ka nende ise kirjutamine pole eriti keeruline. Sinu juhul vb. mingi järgmine lahendus oleks mõistlikum (eeldusel, et tm_year, tm_month ja tm_day on BCD formaadis):
Loomulikult makrode ja funktsioonide kasutamine on alati lubatud, tulemus oleks igatahes loetavam. Ja mul endiselt pole C-kompilaatorit käepärast, niiet ei tea, kas toodud näida ka copy-paste meetodis toimib.
Kood:
// ...
char[15] fileName = "2000-00-00.csv";
// See siin on kahtlane rida. Ma ei tea, kas niivisi saab antud
// C-versioonis stringi algväärtustada. Asja mõte on see, et teed
// kõigepealt tõmmisest koopia mällu ja siis asendad seal vajalikel
// postisioonidel olevad sümbolid, nagu allpool tehakse
char[2] = 0x30 + ((DS_Aeg->tm_year) >> 4);
// "10 Year" -> Ascii char (+ 0x30 ehk '0')
char[3] = 0x30 + ((DS_Aeg->tm_year) & 0xF);
// "Year" -> Ascii char (+ 0x30 ehk '0')
char[5] = 0x30 + ((DS_Aeg->tm_month) >> 4);
// "10 Month" -> Ascii char (+ 0x30 ehk '0')
char[6] = 0x30 + ((DS_Aeg->tm_month) & 0xF);
// "Month" -> Ascii char (+ 0x30 ehk '0')
// ... Edasi jätka siit ise
Loomulikult makrode ja funktsioonide kasutamine on alati lubatud, tulemus oleks igatahes loetavam. Ja mul endiselt pole C-kompilaatorit käepärast, niiet ei tea, kas toodud näida ka copy-paste meetodis toimib.