Forum: Mikrocontroller und Digitale Elektronik [C] Tiny 44 - ein Rechenproblem?


von Marko (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich habe ein Problem mit meinem Code, das ich nicht verstehe.

Ich messe an ACD0 und ADC1 eine Spannung, wandle sie im Programm um und 
gebe sie auf dem LCD aus.
An ADC0 hängt ein ACS712 Stromsensor, die gemessenene Werte passen 
soweit. Wenn ich 4A durch den ACS schicke zeigt mir das Display auch 
4000mA an.

Allerdings stimmt etwas mit ADC1 nicht und ich weiß nicht was.
An diesem möchte ich Spannungen bis 35V über einen 82K/13K 
Spannungsteiler messen. Zur Zeit hängen das 12V dran, was zwischen den 
Widerständen 1,66V ergibt, umgerechnet in einen ADC Wert entspicht das 
340 UND diese 340 kann ich mir auch auf dem LCD direkt anzeigen lassen. 
Das LCD zeigt 340 wenn ich volt_adc ausgeben lasse. Das passt soweit.

Will ich mir allerdings volt_u (diese Variable soll die Spannung an ADC1 
ausgeben) direkt in mV anzeigen lassen, bekomme ich 4294967293 
angezeigt.
Und genau das ist der Punkt den ich nicht verstehe. Meine Rechnung ist 
doch richtig, oder?
Was mache ich falsch? Ich dachte das mir die Spannungsmessung weitaus 
weniger Probleme bereiten würde, aber scheinbar ist dem nicht so.

Oder bin ich einfach nur betriebsblind? Kann man bitte jemand drüber 
schauen?

Viele Grüße
Marko

von Marko (Gast)


Lesenswert?

OK, ich habe gerade den Fehler gefunden! volt_u muss natürlich ebenfalls 
long sein und nicht int.

Trotzdem Danke für die Hilfe, die ich sicherlich bekommen hätte!

von Frank (Gast)


Lesenswert?

Unter anderem deshalb wird in den anderen Funktionen
uint32_t
verwendet.

Es ist sofort ersichtlich wie groß der Datentyp ist!

von Karl H. (kbuchegg)


Lesenswert?

Marko schrieb:
> OK, ich habe gerade den Fehler gefunden! volt_u muss natürlich ebenfalls
> long sein und nicht int.

Du musst überhaupt ein wenig mehr auf deine Datentypen aufpassen. Die 
sind nicht nur Dekoration
1
long amp_real = 0;
2
...
3
ultoa( amp_real, s, 10 );

Der Prefix 'ul' in 'ultoa' wiesst darauf hin, dass diese Funktion für 
'unsigned long' gedacht ist. Deine Variable ist aber (signed) long. Das 
ist ein Unterschied! Spätestens dann, wenn du einmal negative Zahlen 
hast, wirkt sich das aus.
Wie, bei dir kommen keine negativen Zahlen vor?
Warum ist die Variable dann long und nicht unsigned long?

Die Dinge müssen schon zusammenpassen:
Hast du einen long, dann ist die korrekte Funktion dafür ltoa.
Hast du einen unsigned long, dann ist die korrekte Funktion dafür ultoa.
Und natürlich auch in der anderen Richtung: jede Funktion hat einen 
Datentyp für den sie gedacht ist und der für sie korrekt ist.

Etwas mehr Sorgfalt.

(Respektive natürlich int32_t bzw uint32_t)

: Bearbeitet durch User
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.