Forum: Mikrocontroller und Digitale Elektronik Char Array in Integer wandeln für If Schleife


von Draco (Gast)


Lesenswert?

Ich habe eine Temperaturdiode ausgelesen und die Daten in einem Char 
gespeichert in folgendem Format "23.5", nun möchte ich dieses Format als 
integer haben um sie so einfach mit einem vordefinierten Wert zu 
vergleichen zb. 25.

Jedoch bekomme ich die Char nicht ein Integer wert gewandelt mit, auf 
die Kommastelle kommt es mir nicht an, nur die ersten beiden sind 
wichtig :/ Meine Schleife funktioniert auch nicht wirklich.
1
if (temp_akt > 25)
2
   PORTA = 0x80
3
else
4
   PORTA = 0x00

Jemand ein Tipp wie ich dieses Problem sonstwie lösen könnte?!
Sprache ist MicroC.

von oldmax (Gast)


Lesenswert?

Hi
Vermutlich gibt es so einfache Konvertierung wie z.B.
in Pascal x:=StrToInt("123") nicht. Daher die Frage, auf welchem System? 
Im Prinzip geht es auch folgendermaßen:
Eine Zahl als Char ist um 48 größer. Also, der Wert des Bytes - 48 
ergibt die Zahl. Nun nur noch die Stelle bewerten, also einer mal eins, 
Zehner mal 10 etc. Das ganze dann addieren und du hast den Integerwert.
gruß oldmax

von Bernd (Gast)


Lesenswert?

In einem Char 23.5 also steht da 235 ? ansonsten wäre es ja float.

von Karl H. (kbuchegg)


Lesenswert?

Was spricht gegen atoi?
1
#include <stdlib.h>
2
3
int main()
4
{
5
  char tmp[] = "23.5";
6
  int i;
7
8
  i = atoi( tmp );
9
}

atoi hört mit dem Dezimalpunkt zu wandeln auf. Eigentlich hört es an der 
Stelle auf, an der im String nichts mehr kommt, was zu einem int gehören 
kann. Bei dir ist das dann eben der '.'


Und kauf dir ein C-Buch.
Was du da daher radebrechtest, geht ja auf keine Kuhhaut.

von Draco (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Und kauf dir ein C-Buch.
>
> Was du da daher radebrechtest, geht ja auf keine Kuhhaut.



Danke dir :D

Ja werde ich beherzigen, hatte C damals sogar mal sehr gut gekonnt, 
hatte auch zwei, drei Taschenbücher über C von M&T... muß ich echt mal 
wieder raussuchen. Ist leider alles schon ein paar Jahre her.

Übrigens hat es mit atoi wunderbar geklappt.

Übrigens rückwärts geht es mit itoa leider nicht, MicroC gibt den befehl 
leider nicht her :/ Hab es dann mit sprintf gelößt, welches wiederrum 
meine Hex auf über 14kb anschwillen ließ. Dies hab ich wiederrum mit 
sprinti in den Griff bekommen - zwar nicht schön, aber geht.

von Karl H. (kbuchegg)


Lesenswert?

Draco schrieb:

> Übrigens rückwärts geht es mit itoa leider nicht, MicroC gibt den befehl
> leider nicht her :/ Hab es dann mit sprintf gelößt, welches wiederrum
> meine Hex auf über 14kb anschwillen ließ. Dies hab ich wiederrum mit
> sprinti in den Griff bekommen - zwar nicht schön, aber geht.

http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Draco (Gast)


Lesenswert?

Oh man, danke Karl Heinz :D

Manchmal liegt das gute viel zu nah!

von Timmo H. (masterfx)


Lesenswert?

Und wegen des Titels: http://www.if-schleife.de/

von Draco (Gast)


Lesenswert?

-.- Ja sorry :D

Nun hab ich da aber wieder ein blödes Problem was mich ein wenig Nerven 
kostet, er übernimmt einfach nicht den Wert für die Variable 
temp_select, was mache ich da falsch?! Er springt bei Knopfdruck in die 
erste Abfrage, gibt den Stern auch aus, aber überschreibt die Variable 
nicht, somit geht er auch nicht in die zweite Abfrage. :/

Es ist ja nun nicht so das ich nicht lernwillig bin :D Deswegen 
entschuldige ich mich für generve hier!
1
     int temp_select = 1;
2
3
...
4
5
     if (Button(&PINC, 0, 1, 1) && temp_select == 1) {
6
        Lcd_Out(2,3,"*");
7
        Lcd_Out(2,6," ");
8
        temp_select = 2;
9
     }
10
11
     if (Button(&PINC, 0, 1, 1) && temp_select == 2) {
12
        Lcd_Out(2,3," ");
13
        Lcd_Out(2,6,"*");
14
        temp_select = 3;
15
     }
16
17
     if (Button(&PINC, 0, 1, 1) && temp_select == 3) {
18
        Lcd_Out(2,3," ");
19
        Lcd_Out(2,6," ");
20
        temp_select = 1;
21
     }
22
23
...

von Karl H. (kbuchegg)


Lesenswert?

Draco schrieb:

> Nun hab ich da aber wieder ein blödes Problem was mich ein wenig Nerven
> kostet, er übernimmt einfach nicht den Wert für die Variable
> temp_select, was mache ich da falsch?! Er springt bei Knopfdruck in die
> erste Abfrage, gibt den Stern auch aus, aber überschreibt die Variable
> nicht, somit geht er auch nicht in die zweite Abfrage. :/

Ich bin mir ziemlich sicher, dass temp_select korrekterweise den 
richtigen Wert zugewiesen bekommt. Dein Problem muss an einer anderen 
Stelle liegen.
Nur kann man das mit einem kurzen Codeausschnitt nicht weiter eingrenzen

von Andreas K. (derandi)


Lesenswert?

In dem oberen Codeschnipsel mit der Schleife fehlen die ";" hinter den 
Portzuweisungen, und das untere Konstrukt sollte eigentlich 
funktionieren, ich tippe auch mal drauf das der Fehler woanders liegt.

von Draco (Gast)


Lesenswert?

Jep, problem lag woanders. Es war einfach ein Zeitproblem. Mit einem 
Delay von ca. 100ms geht es nun reibungslos.

Er rechnet so schnell die Tastenabfrage durch, das man garnicht gesehen 
hat das sich da was änderte.

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.