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ß
Du hast das Problem selber erfasst. Mit ganzen rechnen und das Komma selber setzen. Ist der übliche Weg.
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....
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.
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ß
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.
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ß
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.
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?
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.