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=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
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.
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?
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? Beitrag "Re: Spannungsmesserbau mit XMega128" ...
Heike L. schrieb: > Beitrag "Re: ADC Werte berechnen, nur wie?" Ja nun, ein wenig solltest du schon noch selber machen...
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 |
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.