Forum: Mikrocontroller und Digitale Elektronik Assembler, messen von 0-20V


von Bernd (Gast)


Lesenswert?

Hi,

wenn ich mit dem AVR-ADC (Ref.Spannung 5V) von 0-20V messen möchte, habe 
ich ja die Möglichkeit einen Spannungsteiler davor zu schalten.

Aber wie löse ich das programmiertechnisch mit dem Komma?
Da man das Komma ja manuell setzen muss, würde es statt 12V 1,2V oder 
statt 13V 1,3V anzeigen. Hat da jemand eine Lösung parat?

Gruß

von Gast (Gast)


Lesenswert?

Ich verstehe Dein Problem nicht.

von Stephan (Gast)


Lesenswert?

Du hast das Problem selber erfasst.
Mit ganzen rechnen und das Komma selber setzen.
Ist der übliche Weg.

von Stephan (Gast)


Lesenswert?

ps.: das Komma existiert nur auf dem LCD, sonst nirgends !

von Bensch (Gast)


Lesenswert?

Du könntest ja auch 1:4 teilen, dann hast du 0...5V.
Wie man programmtechnisch dann das Ergebnis wieder mit 4 multipliziert, 
solltest du eigentlich wissen....

von Marius S. (lupin) Benutzerseite


Lesenswert?

C und kein ASM benutzen. Dann kannst ganz einfach mit Nachkommastellen 
rechnen.

In ASM gehen Berechnungen mit Nachkommastellen zwar auch, aber das 
Ausgeben als ASCII Zeichenkette ist aufwendiger.

von Falk B. (falk)


Lesenswert?


von Bernd (Gast)


Lesenswert?

Oh oh, das sieht aus als hätte ich mich falsch oder schlecht 
ausgedrückt.
Erstmal, ich programmiere in Assembler.

Ich benutze natürlich Festkommaarithmetik, aber ich muss dann das Komma 
ja manuell setzen.

Beispiel:
Ich lasse eine Zahl ausgeben, dann kommt das Komma und danach lasse ich 
noch 3 Stellen ausgeben.
1. Annahme: Die zu messende Spannung beträgt 3,5V.
Ausgabe am LCD: 3,500V. Perfekt
2. Annahme: Die zu messende Spannung beträgt 12,45V
Ausgabe am LCD: 1,245V (Komma an der 2. Stelle)

Das ist das Problem. Wie löse ich das mit der 'Kommaverschiebung'?

Gruß

von Timmo H. (masterfx)


Lesenswert?

Du kannst natürlich nicht einfach sagen: "Setze das Komma nach der 
ersten Stelle". Du musst vorher schon gucken, ob die gemessene Spannung 
bzw. eben der ADC-Wert "10V" überschreitet und dann ggf. das Komma eine 
Stelle später setzen.

von Jean P. (fubu1000)


Lesenswert?

Hi,
weiß nit welches Teiler-Verhältnis dein Spannungsteiler hat. Aber nehmen 
wir mal an, der ist 1:4. Dann prüfste einfach , ob der ADC-Wert größer 
als 2,5 Volt ist (ADC-WERT >= 512). Falls die Bedingung erfüllt ist, 
setzt du die Nachkommastelle erst nach der zweiten Zahl, anderfalls nach 
der ersten.
In ASM  bei 1:4 Teiler und ADLAR = 0, schauste im ADCH Register ob 
grösser als 0x02.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Festkomma bedeutet im übrigen ja auch nicht, dass du eine fixe Anzahl an 
Vorkommastellen hast, sondern dass die Anzahl der Nachkommastellen 
fixiert ist.

Der Fall:
> 1. Annahme: Die zu messende Spannung beträgt 3,5V.
> Ausgabe am LCD: 3,500V. Perfekt
> 2. Annahme: Die zu messende Spannung beträgt 12,45V
> Ausgabe am LCD: 1,245V (Komma an der 2. Stelle)

kann daher gar nicht auftreten, denn im einen Fall hättest du 3 
Nachkommastellen und im anderen Fall nur 2. Wenn bei deiner ganzen
Umrechnerei sich für 3,5 Volt intern ein Zahlenwert von 3500 ergibt,
dann muss bei 12,45 Volt sich ein interner Wert von 12450 ergben.
Und egal wie du es drehst und wendest, das Komma ist (vom rechten
Rand weg gezählt) immer vor der dritten Ziffer.

von Gor Na Kosh (Gast)


Lesenswert?

Das wär ja super, dann hätte sich das Problem erledigt!

Allerdings versteh ich dann das Beispiel 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC) hier auf 
dieser Seite nicht.


1
   ldi     ZL, low(Puffer+3)
2
    ldi     ZH, high(Puffer+3)
3
    ldi     temp1, 1
4
    rcall   sende_zeichen       ; eine Vorkommastelle ausgeben
5
 
6
    ldi     zeichen, ','        ; Komma ausgeben
7
    rcall   sende_einzelzeichen
8
 
9
    ldi     temp1, 3            ; Drei Nachkommastellen ausgeben
10
    rcall   sende_zeichen
11
 
12
    ldi     zeichen, 'V'        ; Volt Zeichen ausgeben
13
    rcall   sende_einzelzeichen
14
 
15
    ldi     zeichen, 10         ; New Line Steuerzeichen
16
    rcall   sende_einzelzeichen
17
 
18
    ldi     zeichen, 13         ; Carrige Return Steuerzeichen
19
    rcall   sende_einzelzeichen
20
 
21
    rjmp    Hauptschleife

Da kann man durch ändern der Zahl eigentlich auch beliebig viele 
Vorkomma und Nachkommastellen ausgeben lassen.
Ich hätte das nun so verstanden, dass der interne Zahlenwert viel größer 
ist, und man halt nur einen Teil von der Zahl ausgibt.
Also so z.B. interner Wert: 123654789
Ausgabe eine Vorkommastelle, drei Nachkommastellen ergibt: 1,236

Oder habe ich das falsch verstanden?

von Karl H. (kbuchegg)


Lesenswert?

Gor Na Kosh wrote:

> Allerdings versteh ich dann das Beispiel
> (http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC) hier auf
> dieser Seite nicht.

Tja.
Hier hat es sich der Autor billig gemacht.
Da er weiß, dass der Vorkommaanzeil sich nie in den Bereich über 10 
bewegen wird, setzt er einfach das Komma nach der ersten Stelle von 
links.
In dem Fall (und nur in dem Fall) ist das gleichbedeutend mit: "Setze 
das Komma vor der dritten Stelle von rechts"


> Also so z.B. interner Wert: 123654789
> Ausgabe eine Vorkommastelle, drei Nachkommastellen ergibt: 1,236

Der interne Wert 123654789 mit 3 Nachkommastellen ausgegeben müsste
auf der Anzeige 123654,789 ergeben. Alles andere ist Pfusch :-)


Warum hat es sich der Autor einfach gemacht?
Relativ simpel: Wenn ich das Komma während der Ausgabe einflechten kann, 
braucht man nichts zwischenzuspeichern. Im korrekten Fall, muss ich aber 
wissen wieviele Stellen insgesamt ausgegeben werden, damit ich vor der 
dritt-letzten Ziffer das Komma einflechten kann.

Oder aber ich sorge wieder dafür, dass die Gesamtzahl an auszugebenden 
Stellen immer gleich ist. Notfalls müssen halt ein paar führende Nullen 
eingeplant werden.

Zahlenwert:  3500    ->   Ausgabe 03,500
Zahlenwert: 12450    ->   Ausgabe 12,450


Jetzt ist die Anzahl der Vorkommastellen wieder in beiden Fällen 
identisch, nämlich 2 (weil die Zahl immer aus 5 Ziffern besteht). Und 
damit ist es wiederrum egal, ob ich das Komma vor der dritt-letzten 
Ziffer oder nach der zweiten einfüge. Im Endeffekt kommt wieder beides 
aufs gleiche raus.

(Und führende Nullen kann man bei der Ausgabe wiederrum prima 
unterdrücken)

von Gor Na Kosh (Gast)


Lesenswert?

Hi,

danke erstmal für die ausführliche Antwort.

>Oder aber ich sorge wieder dafür, dass die Gesamtzahl an auszugebenden
>Stellen immer gleich ist.

Das hört sich einfacher an, als immer im ADCH Register nachzuschauen, ob 
die Zahl >=512 ist. Wie könnte man das bewerkstelligen?

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.