Hallo,
ich möchte mehrere Werte (davon auch welche dezimal negativ) einlesen (in dem Fall sind beide jeweils ein Byte) und diese zusammenhängend als 16 Bit schreiben bzw erstmal nur ausgeben, das Schreiben erfolgt woanders und klappt auch. Der gesamte Code der jetzt kommt, funktioniert tadellos.
uint32_t setreg(uint32_t upper, uint32_t ustart, uint32_t lower) {
uint32_t data = (upper << ustart) | lower;
return data;
}
void write_HSC() {
int bytes=2;
int hdsc, husc;
printf("\nRegister HSC - Horizontal Scaling Coefficients, 0x08, 2 Byte\n");
while(1) {
printf("HDSC Wert dezimal (-63 bis 0): ");
scanf("%i", &hdsc);
fflush(stdin);
if(hdsc>=-63 && hdsc<=0) break;
printf("Nicht im Bereich von -63 bis 0!\n");
}
while(1) {
printf("HUSC Wert dezimal (0 bis 127): ");
scanf("%i", &husc);
fflush(stdin);
if(husc>=0 && husc<=127) break;
printf("Nicht im Bereich von 0 bis 127!\n");
}
printf("0x%.4x\n", setreg((uint8_t) husc, 8, (uint8_t) hdsc));
//i2c_write(HSC, bytes, setreg((uint8_t) husc, 8, (uint8_t) hdsc));
}
Alles anzeigen
Ausgabe aufm Schirm:
Register HSC - Horizontal Scaling Coefficients, 0x08, 2 Byte
HDSC Wert dezimal (-63 bis 0): -12
HUSC Wert dezimal (0 bis 127): 12
0x0cf4
Also alles wie gewünscht: -12 sind F4 und 12 sind 0C.
Der Code kompiliert auch ohne Warnungen.
Aber warum klappt folgendes NICHT?:
Der Compiler gibt folgende Warnungen:
writefocus.c: In function `write_HSC':
writefocus.c:96: warning: int format, different type arg (arg 2)
writefocus.c:104: warning: int format, different type arg (arg 2)
writefocus.c:106: warning: comparison is always true due to limited range of dat
a type
Raus kommt dann das:
Register HSC - Horizontal Scaling Coefficients, 0x08, 2 Byte
HDSC Wert dezimal (-63 bis 0): -12
HUSC Wert dezimal (0 bis 127): 12
0x0c00
Warum wird F4 dort zu 00?
Und warum beschwert sich der Compiler überhaupt? mit int gehts, mit int8_t nicht, dabei gibts da doch keinen Wert, der da nich reinpassen würde. Ausserdem scheint das mit dem if durchaus zu funktionieren.
Tipp ich -64 ein oder 128 kommt die Abfrage - wie gewünscht - erneut.
Wäre nett, wenn mir das jemand erklären könnte. Momentan isses mir völlig unverständlich, warum int8_t nicht tut.