www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Werte berechnen, nur wie?


Autor: Heike L. (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heike L. schrieb:
> 1023/2046=0,5*10=5

Heike 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Heike L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte 5,00Volt (1,87Volt) ausgeben keine 5000mV (1870mv)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Helfer (Gast)
Datum:

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

Autor: Heike L. (Gast)
Datum:

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

Autor: MicroSD (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Heike L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hättet Ihr auch Assembler Code?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heike L. schrieb:
> Hättet Ihr auch Assembler Code?

Beitrag "Re: Spannungsmesserbau mit XMega128"

...

Autor: Heike L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beratungsresistent?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heike L. schrieb:
> Beitrag "Re: ADC Werte berechnen, nur wie?"
Ja nun, ein wenig solltest du schon noch selber machen...

Autor: Holger P. (holg_i)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
; in Spannung umrechnen
   clr     Dummy1             
   clr     Dummy2

   ldi     Dummy3,49          ; Faktor 49 
 
   mul     xl, Dummy3         ; Multiplikation
   add     Dummy1, r0         ; und akkumulieren
   adc     Dummy2, r1
 
   mul     xh, Dummy3         
   add     Dummy2, r0         

   movw    x,Dummy1         ; Kopiert Registerpaar
    
   ldi     Dummy1,'0'-1     ; Ziffernzähler direkt als ASCII Code
    
Volt:
   inc     Dummy1
   subi    xl, low(10000)   ; Wie oft geht die 10000 in X
   sbci    xh, high(10000)  
   brcc    Volt
                                    
   rcall   lcd_data
   ldi     Dummy1,','       ; , setzen
   rcall   lcd_data

   subi    xl, low(-10000)  
   sbci    xh, high(-10000) 

   ldi     Dummy1, '0'-1    ; Ziffernzähler direkt als ASCII Code
Volt_H:
   inc     Dummy1
   subi    xl, low(1000)    ; Wie oft geht die 1000 in X   
   sbci    xh, high(1000)   
   brcc    Volt_H
                                    
   rcall   lcd_data
   subi    xl, low(-1000)   
   sbci    xh, high(-1000)  

   ldi     Dummy1, '0'-1    ; Ziffernzähler direkt als ASCII Code
Volt_Z:
   inc     Dummy1
   subi    xl, low(100)     ; Wie oft geht die 1000 in X
   sbci    xh, high(100)    
   brcc    Volt_Z
                                    
   rcall   lcd_data
   ldi     Dummy1,'V'       ; V setzen
   rcall   lcd_data

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.