Hallo liebe Forengemeinde,
durch Google bin ich auf diese Seite gekommen um mein Problem zu lösen.
Nun habe ich hier auch schon hin und her gelesen Threads und auch
Tutorial und komme einfach nicht weiter. ADC und Assembler ist wohl
nicht so einfach. Ich bekomme über den ADC einen Wert von 0 bis 1023 das
ist schon mal in trockenen Tüchern.
0=0Volt
1023=5Volt
Somit ist
V=ADC_Wert/204,6
auch gut so.
Nun sollte ich in Assembler wohl
ADC_Wert/2046 nehmen und danach durch 10 teilen.
Also
1023/2046=0,5*10=5
Aber wie mach ich das?
Warum ich nicht durch 204,6 teile? Damit ich nur mit Ganzzahlen rechen
muss!
Oder denke ich da falsch?
Kann mir das Forum weiter helfen?
Heike L. schrieb:> 1023/2046=0,5*10=5Heike L. schrieb:> Warum ich nicht durch 204,6 teile? Damit ich nur mit Ganzzahlen rechen> muss!> Oder denke ich da falsch?ja,
1023/2046 = 0 0*10 = 0
Wozu brauchst du diesen Spannungswert? Willst du den anzeigen?
Dir ist klar, dass eine "normale" Ganzzahl mit deiner Berechnung nur die
Werte 0,1,2,3,4 und 5 annehmen können wird?
> Nun sollte ich in Assembler wohl> ADC_Wert/2046 nehmen
Was gibt 1023/2046?
Richtig: 0
> Oder denke ich da falsch?
Ja.
Ein Tipp: rechne in mV oder in 1/10mV
Also z.B.: ADC-Wert * 489 = hundertstel mV
Heike L. schrieb:> Ich wollte 5,00Volt (1,87Volt) ausgeben keine 5000mV (1870mv)
Besteht da nicht eine gewisse Ähnlichkeit?
Auf jeden Fall mehr als zwischen 5,00V (1,87V) und 5V (1V)
Also die Schritt für Schritt-Anleitung:
1. Berechne die Spannung mit ausreichend hoher Genauigkeit.
2. Und dann gib von dieser Spannung die Stellen aus, die dich
interessieren.
3. Platziere bei der Ausgabe ein Komma dort, wo es hübsch aussieht und
passt.
Festkommaarithmetik
Wenn du die Ziffern 5 0 0 0 hast und weisst, dass diese Millivolt
darstellen, ist es easy ein paar Ziffern plus ein Komma plus ein V als
Einheitszeichen so auszugeben, dass 5,00V auf der Anzeige erscheint.
Erstmal den Denkfehler hier:
Heike L. schrieb:> 0=0Volt> 1023=5Volt
beseitigen.
1023 im ADCW bedeutet nicht 5V, sondern "Spannung größer als 4,9951...
V".
d.H. für deine Rechnung nimmst du "1024 == 5V". Und Dividieren durch
1024 ist auch in ASM recht einfach, dafür reicht ein wenig
Bit-Schieberrei.
Heike L. schrieb:> Wie berechne ich in Assembler x/2.046
Überhaupt nicht.
Sondern du rechnest x*(1000000/2046) und ignorierst die unnötigen
Dezimalstellen.
10000000/2046 = 488,758 = 489
Kommt dir diese Zahl bekannt vor?
Heike L. schrieb:> Hättet Ihr auch Assembler Code?
Also ich habe das mal so gemacht. Ist durch den Faktor 49 nicht sehr
genau aber mir ging es nur ums verstehen.
Heike L. schrieb:> Nun habe ich hier auch schon hin und her gelesen Threads und auch>> Tutorial und komme einfach nicht weiter.
Najahier ist z.b. folgendes zu finden. Darüber habe ich mich schlau
gemacht. http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
Also so habe ich es gemacht, wobei meine Werte normal nicht im x liegen:
1
; in Spannung umrechnen
2
clr Dummy1
3
clr Dummy2
4
5
ldi Dummy3,49 ; Faktor 49
6
7
mul xl, Dummy3 ; Multiplikation
8
add Dummy1, r0 ; und akkumulieren
9
adc Dummy2, r1
10
11
mul xh, Dummy3
12
add Dummy2, r0
13
14
movw x,Dummy1 ; Kopiert Registerpaar
15
16
ldi Dummy1,'0'-1 ; Ziffernzähler direkt als ASCII Code
17
18
Volt:
19
inc Dummy1
20
subi xl, low(10000) ; Wie oft geht die 10000 in X
21
sbci xh, high(10000)
22
brcc Volt
23
24
rcall lcd_data
25
ldi Dummy1,',' ; , setzen
26
rcall lcd_data
27
28
subi xl, low(-10000)
29
sbci xh, high(-10000)
30
31
ldi Dummy1, '0'-1 ; Ziffernzähler direkt als ASCII Code
32
Volt_H:
33
inc Dummy1
34
subi xl, low(1000) ; Wie oft geht die 1000 in X
35
sbci xh, high(1000)
36
brcc Volt_H
37
38
rcall lcd_data
39
subi xl, low(-1000)
40
sbci xh, high(-1000)
41
42
ldi Dummy1, '0'-1 ; Ziffernzähler direkt als ASCII Code