🇩🇪
-toppic, aber mit Bezug zu einem Beitrag von mir weiter oben:
Zitat von: picass in 24.10.2022, 17:24:36 CESTIch werde die fruchtlose Debatte hier beenden.Gut
Zitat von: picass in 24.10.2022, 17:24:36 CESTAnhand von Beispielen konnte nachgewiesen werden...Nö
Zitat von: picass in 24.10.2022, 17:24:36 CESTDiese Fehlverhalten – oder wie man das auch immer benennen mag – sind System-FehlerWelche? (nein, bitte nicht antworten;-))
Zitat von: picass in 24.10.2022, 17:24:36 CESTDas sind Beweise genug.Ich habe keinen einzigen gesehen
Zitat von: picass in 24.10.2022, 17:24:36 CESTJeder, welcher über die programm-technischen Voraussetzungen verfügt, kann die einfachen Beispiele auf seinem Computer nach vollziehen...... und wird keinerlei Systemfehler finden
Zitat von: picass in 21.10.2022, 17:42:46 CESTDazu gibt es mindestens zwei Ansätze, die beide auf eine Vermeidungs-Taktik raus laufen. Man kann schlicht die Sprungbefehle, welche das N-Flag nutzen, vermeiden
#include <xc.inc>
PSECT udata_acs
adcL: DS 1 ;variable für daten aus analog-eingang
adcH: DS 1
hunderter: DS 1 ; für decode
zehner: DS 1
einer: DS 1 ; auch fuer temp!
PSECT resetVec,class=CODE,reloc=2
resetVec:
goto main
PSECT code
main:
movlw 00000010B ;set cpu clock speed of 31KHz
movwf OSCCON,A ;move contents of working register into OSCCON
clrf OSCTUNE,A ;
clrf LATA,A
clrf TRISA,A ;port a ausgang
clrf LATB,A ;
clrf TRISB,A ;port b ausgang
clrf LATC,A ;
clrf TRISC,A ;port c Configure as output
; für rechenprobe adc füllen (mit irgendwas)
_MainLoop:
nop ;adc = wert nach auslesen des analogen eingangs
movlw 0x67 ;adcL
movwf adcL,A ;
movlw 0x02 ;adcH
movwf adcH,A
call indezimal ;zerlegen in hunderter, zehner, einer
bra _MainLoop ;zurück zum anfang
indezimal: ;adc wert in dezimalstellen
; - analogmesswert in adcL & adcH
; - d'100' oder d'10' in WREG
;-------------------
_hun: ;hunderter stelle ermitteln
clrf hunderter,A
_hunLoop: ;
movff adcL,einer ;sichern u wiederherstellen,wenn negativ war
movlw 100 ;WREG mit h'64' = d'100' füllen
subwf adcL,F,A ;ergebnis wieder in adcL
bc _hunInc ;wenn ergebnis positiv, hundert++
decf adcH,A ; sonst adcH--
bnc _hunEnd ;wenn adcH negativ wird, ab zu zehner und einer
_hunInc:
incf hunderter,A ;ist noch hunderter
bra _hunLoop ; weiter hunderter zählen
_hunEnd: ;ausgang: hunderter in hunderter, rest in einer (temp)
movff einer,adcL ;erst adcL wiederherstellen einer (temp) -> adcL
clrf adcH,A ; das aber auch !!!
;----------------
_zehn: ;eingang: zehner und einer
clrf zehner,A
_zehnLoop:
movff adcL,einer ;sichern u wiederherstellen,wenn negativ war
movlw 10 ;wieviel zehner stecken in adcL ?
subwf adcL,F,A ;minus zehn, der rest in adcL
btfss CARRY ;keiner Zehner mehr?
return ; fertig - Einer sind schon in einer!
incf zehner,A ; sonst zehner++
bra _zehnLoop ; und weiter zehner zaehlen
END
Zitat von: picass in 10.10.2022, 18:43:15 CESTIn der Subraktionsschleife hattest du was Schlimm-Verbessert, indem die Bearbeitung des High-Bytes übersehen wurde.Nö, Tausender berechnest du ja auch nicht. Das passt so ;-)
...
indezimal: ;adc minus bit
; - analogmeßwert in adcL & adcH
; - d'100' oder d'10' in bitl & bith
; für rechenprobe adc füllen mit h'0118' = d'280'
movlw h'67' ;adcL
movwf adcL ;
movlw h'02' ;adcH
movwf adcH
nop
;-------------------
_hun: ;adc minus bit, ergebnis wieder in adc
clrf hundert
_hunLoop: ;
movff adcL,einer ;sichern u wiederherstellen,wenn negativ war
movlw D'100' ;bitl & bith mit h'64' = d'100' füllen
; call subtract ;adc minus bit
subwf adcL,F,A ;ergebnis wieder in adcL
btfss STATUS,C ;ergebnis positiv, dann dec überspringen
decf adcH
bnc _hunEnd ;wenn negativ, ab zu zehner
incf hundert ;ist noch hunderter
bra _hunLoop ;weiter hunderter zählen
_hunEnd: ;ausgang:hunderter in hundert,zehnerrest in temp
movff einer,adcL ;erst adcL wiederherstellen temp,adcL
clrf adcH ; das aber auch !!!
;----------------
_zehn: ;eingang: zehner u einer
clrf zehner
_zehnLoop:
movff adcL,einer ;vorsorglich umspeichern in einer
movlw D'10' ;wieviel zehner stecken in adcL ?
subwf adcL,F,A ;minus zehn, der rest in adcL
; bnc _zehnEnd ;keiner zehner mehr,ab zum einer-zählen
btfss STATUS,C
return
incf zehner ;ist noch zehner
bra _zehnLoop ;weiter zehner zählen
end