www.mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe Dein Problem nicht.

Autor: Stephan (Gast)
Datum:

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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ps.: das Komma existiert nur auf dem LCD, sonst nirgends !

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Marius S. (lupin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gor Na Kosh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


   ldi     ZL, low(Puffer+3)
    ldi     ZH, high(Puffer+3)
    ldi     temp1, 1
    rcall   sende_zeichen       ; eine Vorkommastelle ausgeben
 
    ldi     zeichen, ','        ; Komma ausgeben
    rcall   sende_einzelzeichen
 
    ldi     temp1, 3            ; Drei Nachkommastellen ausgeben
    rcall   sende_zeichen
 
    ldi     zeichen, 'V'        ; Volt Zeichen ausgeben
    rcall   sende_einzelzeichen
 
    ldi     zeichen, 10         ; New Line Steuerzeichen
    rcall   sende_einzelzeichen
 
    ldi     zeichen, 13         ; Carrige Return Steuerzeichen
    rcall   sende_einzelzeichen
 
    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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Gor Na Kosh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.