Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC-Umrechnung bei Attiny24


von Paul Baumann (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe gerade ein Programm geschrieben, was mir eine an ADC-Kanal 0 
anliegende Spannung auf einer dreistelligen Siebensegmentanzeige 
darstellen soll. Bei der Simulation stellte ich fest, daß offenbar meine
Formel zur Umrechnung nicht das ausgibt, was ich erwarte. Ich verwende 
die Betriebsspannung als Referenz und muß daraufhin rechnen lassen:
XVOLT= (5 Volt / 1024)*Messwert.

Messwert läßt sich auch schön mittels Schieberegler im Simulator 
zwischen
0 und 1023 einstellen, aber XVOLT gibt mir Null aus. Offenbar schmeckt 
ihm
das "5 /1024" nicht.

Ich glaube, heute ist nicht mein Tag.... ;-(

MfG Paul

von Johannes M. (johnny-m)


Lesenswert?

Tja, ich vermute mal, dass BASCOM genau wie C standardmäßig in 
Ganzzahlen rechnet (was aus Ressourcengründen ja auch das einzig 
Sinnvolle ist). Und jetzt rechne bitte mal selber aus, was bei einer 
Ganzzahldivision von 5/1024 rauskommt...

von Matthias L. (Gast)


Lesenswert?

Versuchs doch mal so:

Xvolt = Messwert * 5 / 1024

oder besser so:
Xvolt = Messwert * 5000 /1024



Faktor = 5 / 1024
Xvolt = Messwert * Faktor



PS:
Das Verfahren geht auch:
Beitrag "Re: 16-Bit-Zahl ausgeben, nur wie?"

von Paul Baumann (Gast)


Lesenswert?

Danke erstmal an Euch. Es haut trotzdem nicht hin.
Die erste Variante liefert bei 1023    XVOLT von 4.
Die 2. liefert bei 1023    XVOLT von 3192.
Die 3. liefert immer Null.

Es kann natürlich auch sein, daß es in Natura funktioniert und mich bloß 
der Simulator zum Narren hält.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Wie wäre es damit (ASM)?

- Messwert 10-bittig (rechtsbündig) in 2 Register einlesen
- Messwert mit 125 multiplizieren (es entstehen 3 Bytes)
- unteres Byte wegwerfen (durch 256 teilen) (jetzt sind es noch 2 Bytes)
- Durch Subtraktionsmethode in 5 Ziffern zerlegen, wobei die beiden
  oberen (linken) Ziffern aufgrund des begrenzten Wertevorrates immer
  0 sind, es entstehen also 3 (nutzbare) Ziffern
- Ziffern ausgeben, erste Ziffer mit Dezimalpunkt

Dazu solltest Du aber auf den Tiny24 verzichten und den billigeren Mega8 
benutzen, dann hast Du Hardware-Multiplikation und genügend Pins, um 
auch den Dezimalpunkt mit auszugeben.

...

von Andreas W. (Gast)


Lesenswert?

ber der ersten variente ist das ergebniss tatsächlich 4.
bei der zweiten müsste es 4995 sein (siehe unten).
die dritte ist das selbe wie du gemacht hast das ergebniss ist immer 0.

der grund warum die zweite methode falsch ist müsste ein überlauf sein. 
1023*5000 ist schließlich deutlich über 32000. caste das auf uint32_t 
dann sollte es funktionieren.

von Paul Baumann (Gast)


Lesenswert?

Die Idee von Hannes war der zündende Gedanke. Das habe ich jetzt so 
eingebaut und er bringt mir bei 1023 499 und bei 511 250.

Ich bin entzückt! ;-)))

MfG Paul

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.