Vyhodí ti to reálné číslo co jsi chtěl. Někde tady na foru je kod v asm.
Njn, ale ja bych se radeji drzel C-ecka
Ted to mam udelane jen pro cele stupne a to takto:
signed char t1;
byte1 = oneWireReadByte();
byte2 = oneWireReadByte();
if (byte2 & 0x80) {
t1 = -1 * (~((byte2 << 4) | (byte1 >> 4)) + 1);
} else {
t1 = ((byte2 << 4) & 0x70) | (byte1 >> 4);
}
sprintf(string,"T: %d C",t1);
lcdPrintString(2,string);
Tohle jsem zkusil napsat, zkoušel jsem to jen v simulaci. V procesoru to zabere :
Flash 48,3%
RAM 18,3%
LCD_HD44780_DS18S20.hex (5.47 KB)
LCD_HD44780_DS18S20.c (5.52 KB)
Zajimave reseni, ale take je to pouzitelne. Ja jsem dnes zapremyslel a vzniklo neco takoveho pro prepocet, je to funkcni.
Program: 43.6%
Data: 17%
#define TEXT4 "T: %d.%d C"
#define TEXT5 "T: -%d.%d C"
char string], t1, t2, byte1, byte2;
if (byte2 & 0x80) {
if (byte1 & 0x0F) {
t1 = ~((byte2 << 4) | (byte1 >> 4));
t2 = (10000 - ((byte1 & 0x0F) * 625)) / 1000;
} else {
t1 = ~((byte2 << 4) | (byte1 >> 4)) + 1;
t2 = 0;
}
if (t1 == 0 && t2 == 0) {
sprintf(string,TEXT4,t1,t2);
} else {
sprintf(string,TEXT5,t1,t2);
}
} else {
t1 = ((byte2 << 4) & 0x70) | (byte1 >> 4);
t2 = ((byte1 & 0x0F) * 625) / 1000;
sprintf(string,TEXT4,t1,t2);
}
lcdPrintString(2,string);
kde, byte1 je dolni byte teploty, byte2 je horni byte teploty, t1 je celociselna hodnota teploty pred desetinnou carkou, t2 je celociselna hodnota teploty za desetinnou carkou.
Ted resim problem jak toto yakomponovat do funkce, ktera by mela 2 vstupni parametry (byte1 a byte2) a vracela by promennou string, kde by byl retezec. Poradi mi nekde jak ji napsat? Me se to nejak nedari
char fce(char byte1, char byte2) {
char string];
// kod vyse
return string;
}
.
.
.
void main() {
char string],byte1,byte2;
.
.
.
string = fce(byte1,byte2);
lcdPrintString(2,string);
}