ADC Werte berechnen, nur wie?

Gast #2086959
Lesenswert?

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?
Moderator (Firma: Titel) Persönliche Seite #2086988
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #2087047
Lesenswert?

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.
Gast #2087065
Lesenswert?

Jou und genau deshalb stellte ich meine Frage hier.

Wie berechne ich in Assembler x/2.046

ADC_Read:
  push xl
  push xh

  ldi  temp2, (1<<REFS0) | (1<<MUX0)
  tst  temp1
  brne ADC_Start
  ldi  temp2, (1<<REFS0)

ADC_Start:
  sts  ADMUX, temp2
  ldi  temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
  sts  ADCSRA, temp1

  lds  temp1,ADCSRA
  sbr  temp1,1<<ADSC
  sts  ADCSRA, temp1

Wait_ADC:
  lds  temp2, ADCSRA
  sbrc temp2, ADSC
  rjmp Wait_ADC

  lds  xl, ADCL
  lds  xh, ADCH

und wie könnte es ab hier weiter gehen?
Gast #2087079
Lesenswert?

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.
Gast #2088434
Lesenswert?

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
43
Volt_Z:
44
   inc     Dummy1
45
   subi    xl, low(100)     ; Wie oft geht die 1000 in X
46
   sbci    xh, high(100)    
47
   brcc    Volt_Z
48
                                    
49
   rcall   lcd_data
50
   ldi     Dummy1,'V'       ; V setzen
51
   rcall   lcd_data
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren