Forum: Mikrocontroller und Digitale Elektronik KTY 81 und negative Temperatur


von TobyTetzi (Gast)


Lesenswert?

Hallo,

ich habe zwei KTY 81-122 mit einem 2,7 K und einem 1K Wiederstand an je
einem AD Pin meines mega16 hängen.

Nun rechne ich mit dieser Formel:

unsigned int get_temp1 (void)
{
    unsigned int t = 0;

    t = read_adc( 0 );
    t = ((t/1.579) - 154 );

    return t;
}

unsigned int get_temp2 (void)
{
    unsigned int t = 0;

    t = read_adc( 1 );
    t = ((t/1.579) - 304 );

    return t;
}

den AD Wert in Grad C um, und lasse es auf einem LCD anzeigen:

void display_temp (void)
{
      temperatur1 = get_temp1();
      temperatur2 = get_temp2();

      lcd_high(2);
      sprintf( &lcd_buffer[0][0], "   Temperatur   ");
      sprintf( &lcd_buffer[1][0], " %3u \xdfC  %3u \xdfC ",
temperatur1, temperatur2);

      ecu_display_lcdbuffer( 2 );

}

Wie errechne ich denn nun eigentlich minus Temperaturen?

Sobald ich unter 0 Grad komme, habe ich einen Überlauf, und habe eine
Temperaturanzeige von 65... !

Danke für Euere Hilfe!

Gruß Toby

von Nobody (Gast)


Lesenswert?

"unsigned"  na, dämmerts?

von TobyTetzi (Gast)


Lesenswert?

Hallo,

nee, noch nicht wirklich.

Auch wenn ich unsigned zu signed ändere, muß ich doch das Vorzeichen
auswerten, nicht?

Gruß Toby

von Stephan H. (stephan-)


Lesenswert?

na dann mach mal ein Koplement aus den 65 und werte das Vorzeichen aus.
Signed !!

von TobyTetzi (Gast)


Lesenswert?

Hallo,

könntet Ihr mir das etwas genauer erklären, evtl. mit einem Beispiel?

Danke,

Toby.

von Marco S (Gast)


Lesenswert?

Probier mal:

1. streiche alle unsigned
2. schreibe bei sprintf anstatt %3u lieber %3d

Gruß
Marco

von Stephan H. (stephan-)


Lesenswert?


von TobyTetzi (Gast)


Lesenswert?

Hallo, und vielen Dank für die schnelle Hilfe !!!

Es sieht nun so aus:

signed int temperatur1 = 0;
signed int temperatur2 = 0;

signed int get_temp1 (void)
{
    signed int t = 0;

    t = read_adc( 0 );
    t = ((t/1.579) - 154 );

    return t;
}

signed int get_temp2 (void)
{
    signed int t = 0;

    t = read_adc( 1 );
    t = ((t/1.579) - 304 );

    return t;
}

void display_temp (void)
{
      temperatur1 = get_temp1();
      temperatur2 = get_temp2();

      lcd_high(2);
      sprintf( &lcd_buffer[0][0], "   Temperatur   ");
      sprintf( &lcd_buffer[1][0], " %3d \xdfC  %3d \xdfC ",
temperatur1, temperatur2);

      ecu_display_lcdbuffer( 2 );

}

@ Marco

Danke für den anstatt %3u lieber %3d Tipp!!!

Habe dazu grade noch dieses gefunden.
Wäre ich echt nicht drauf gekommen!

% - ein Prozent-Zeichen ("%"). Es ist kein Argument erforderlich.
b - das Argument wird als Integer angesehen und als Binär-Wert
ausgegeben.
c - das Argument wird als Integer angesehen und das entsprechende
ASCII-Zeichen wird ausgegeben.
d - das Argument wird als Integer angesehen und ein Dezimalwert
(signed) ausgegeben.
u - das Argument wird als Integer angesehen und ein Dezimalwert
(unsigned) ausgegeben.
f - das Argument wird als float angesehen und eine Fließkomma-Zahl
ausgegeben.
o - das Argument wird als Integer angesehen und und als Oktalzahl
ausgegeben.
s - das Argument wird als String angesehen und auch als solcher
ausgegeben.
x - das Argument wird als Integer angesehen und als Hexadezimal-Wert
ausgegeben (mit Kleinbuchstaben).
X - das Argument wird als Integer angesehen und als Hexadezimal-Wert
ausgegeben (mit Großbuchstaben).


Gruß Toby

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.