So, bin schon wieder da
Nichts tragisches ...!
@avr_racer,
ich hab mir deine Zeitenrechnung genauer angesehen und bin zur Ansicht gekommen, dass sie nicht stimmt.
Jetzt gibt es zwei Möglichkeiten:
1. sie stimmt wirklich nicht oder
2. meine Rechnung stimmt nicht!
Dein Beispiel aus text3: (cc = cpu clock cycle = 1µs)
wait25us:
ldi r20,$20 ;1cc
wait25us1:
dec r20 ;1cc
brne wait25us1 ;1/2cc
ret
Nehmen wir brne mit 1cc an (=1µs), dann ergibt das folgende Rechnung:
$20 sind dezimal 32. Also 32 Durchgänge/Schleifen.
32 mal 2 (dec + brne á 1µs) ergibt 64µs und keine 25.
Wo liegt nun der Gedanken-Fehler?
Bei mir oder bei dir?
@alle:
Übrigens stehe ich schon länger auf der Leitung und komm nicht weiter.
Ich will/muss einen ADC-Wert (8Bit ADLAR genügt) in Volt umrechnen (Akkuspannung 12V, max. 13,7 Ladeschlussspannung).
Folgende ADC-Beschaltung: 15V-68k-ADC-50kPot-GND.
Bei exakt 15V wird mit einem Spindelpoti der ADC-Maximalwert genau auf 5V eingestellt.
Somit hab ich eine Reserve, sollte die Spannung mal über 13,7V ansteigen.
Zudem dient eine 5V Z-Diode als Schutz.
Bei 15V liegen nun 5V am ADC. Das ergibt einen ADC-Wert von 255 (ADCH).
Das ist Basis für die weiteren Berechnungen.
Nehmen wir nun als zu messende Spannung 10,4V an.
Das ergibt folgende Schlussrechnung:
15V.....255
10,4V....?
10,4*255/15=177 gerundet.
Umgekehrt:
255.....15V
177......?
15/255=0,0558 Und da haperts schon! Wie rechne ich mit 0,0588?
177*0,0588=10,4
Auch hab ich nachstehende Divisions-Routine im Netz gefunden.
Allerdings rechnet die nicht richtig.
Da steht im Rest (=Nachkommastelle) bei einer Rechnung 177/17, statt 4 eine 8!
Wo liegt hier der Fehler, bzw. wie/wo kann man das berichtigen?
Ich möchte bei den Zehntel-Volt schon relativ genau sein.
Sonst schaut bisher alles gut aus ...
Code:
; 8Bit Division mit Rest; Laufzeitverhalten im schlechtesten Fall (255/1) 103 Taktzyklen
; Achtung:
; Divison durch 0 wird nicht abgefangen und führt zu einer Endlosschleife
; Dieser Algorithmus funktioniert nur für vorzeichenlose 8Bit-Werte
; Nach Division steht das Ergebnis in r18 und der Rest in r16
.def divident = r16
.def divisor = r17
.def ergebnis = r18
.def zw = r19
ldi divident,177 ; Berechnet 177/17 !
ldi divisor,17
division:
clr ergebnis ; Ergebnis initialisieren
ldi zw,1 ; Teilbarkeit durch 1 annehmen
tst divisor
loop:
brmi div_loop ; Den Divisor linksbündig ? -> JA
lsl zw ; Zwischenergebnis und
lsl divisor ; Divisor einen Schritt nach links
rjmp loop ; ... und nochmal prüfen
div_loop:
cp divident,divisor ; divident >= divisor
brlo division_weiter ; -> nein
add ergebnis,zw ; Ergebnis vergrößern und
sub divident,divisor ; Dividenten verkleinern
division_weiter:
lsr divisor ; Divisor und Zwischenergebnis
lsr zw ; einen Schritt nach rechts
brne div_loop ; zw!=0 ? ->JA
nop ; Ergebnis in ergebnis
; Rest in divident !
end: rjmp end
Lesezeichen