Opisaću problem, zatim sledi kod, a i prikačene slike.
Radi se o čipu 16LF1554 koji ima CVD modul, pa i dva registra gde se smešta rezultat AD konverzije. Ono što meni treba je razlika ta dva rezultata. Hteo sam statistički da vidim kako se ponaša CVD, pa sam trigerovao modul deset puta (za početak), zabeležio rezultate iz oba registra kao i razliku, na fleš (redom idu umanjenik, umanjilac i razlika). Ispalo je da rezultat (razlika dva broja) nije tačan. Pomislio sam da mi brlja programator pri čitanju, pa sam nakon koda gde iz AD registra prebacujem vrednost u neke radne registre (Al, Ah) i (Bl, Bh), upisao jedan par od spornih brojeva u iste registre. U tom slučaju oduzimanje je tačno! Moje pitanje, je kako je moguće da ima razlike ako u te neke radne registre upišem vrednost iz nekog drugog registra (preko W) i ako upišem direktno broj u W, pa opet prebacim u registar. To ne bi smelo da bude, pa se pitam gde je greška? Čak sam i pre upisa razlike na fleš (nema u ovom kodu) ubacio vrednost registra (razlika) na portove i instrumentom izmerio stanja, koja su bila pogrešna, odnosno ista koja su upisana na fleš. Probao sam i sa 16F1503 (CVD algoritam, ali peške), opet isto.
Al, Ah, Bl, Bh, k imaju takve lokacije da je moguć pristupu iz bilo koje banke. Watchdog je isključen. Algoritam za oduzimanje je krnj, ali radi za vrednosti koje dobijam. Ovo je deo programa, jer prethodno ima drugih stvari.
--------------------------------------------------------------------------------
banksel PMCON1
MOVLW b'00000000'
MOVWF PMADRL
movlw d'10'
movwf k
petlja
clrf Al
clrf Ah
clrf Bl
clrf Bh
movlw D'2' ; pauza od o.1S
movwf CounterC
movlw D'4'
movwf CounterB
movlw D'187'
movwf CounterA
loop3 decfsz CounterA,1
goto loop3
decfsz CounterB,1
goto loop3
decfsz CounterC,1
goto loop3
BANKSEL AD1CON0 ;trigerovanje konverzije
BSF AD1CON0,1
BTFSC AD1CON0,1
GOTO $-1
;RESULTS OF CONVERIONS 1.
banksel AAD1RES0H ;
movfw AAD1RES0H
movwf Ah
movfw AAD1RES0L
movwf Al
;RESULTS OF CONVERIONS 2.
banksel AAD1RES1H ;
movfw AAD1RES1H
movwf Bh
movfw AAD1RES1L
movwf Bl
;movlw 0x3 ;kada se skinu zarezi dobijam slučaj sa direktnim upisivanjem brojeva, druga slika
;movwf Ah
;movlw 0x34
;movwf Al
;movlw 0x0
;movwf Bh
;movlw 0xC1
;movwf Bl
call upis ;upis vrednosti umanjenika
call upis1 ;upis vrednosti umanjioca
movfw Bl
subwf Al,F
btfss STATUS,C
decf Ah,F
movfw Bh
subwf Ah,F
call upis ;upis razlike. Pošto je razlika ostala u Ah i Al
decfsz k,1 ;petlja da ponovim proces deset puta
goto petlja
nista
nop
goto nista
upis
banksel PMCON1
incf PMADRL,f
MOVLW b'00000111'
MOVWF PMADRH
BCF PMCON1,CFGS ; Not configuration space
BSF PMCON1,WREN ; Enable writes
BSF PMCON1,LWLO
movfw Al
MOVWF PMDATL
movfw Ah
MOVWF PMDATH
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ;
banksel PMCON1
BCF PMCON1,LWLO ; No more loading latches - Actually start Flash program; memory write
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ; to program memory.
BCF PMCON1,WREN
return
upis1
banksel PMCON1
incf PMADRL,f
MOVLW b'00000111'
MOVWF PMADRH
BCF PMCON1,CFGS ; Not configuration space
BSF PMCON1,WREN ; Enable writes
BSF PMCON1,LWLO
movfw Bl
MOVWF PMDATL
movfw Bh
MOVWF PMDATH
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ;
banksel PMCON1
BCF PMCON1,LWLO ; No more loading latches - Actually start Flash program; memory write
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ; to program memory.
BCF PMCON1,WREN
return
end
---------------------------------------------------------------
Radi se o čipu 16LF1554 koji ima CVD modul, pa i dva registra gde se smešta rezultat AD konverzije. Ono što meni treba je razlika ta dva rezultata. Hteo sam statistički da vidim kako se ponaša CVD, pa sam trigerovao modul deset puta (za početak), zabeležio rezultate iz oba registra kao i razliku, na fleš (redom idu umanjenik, umanjilac i razlika). Ispalo je da rezultat (razlika dva broja) nije tačan. Pomislio sam da mi brlja programator pri čitanju, pa sam nakon koda gde iz AD registra prebacujem vrednost u neke radne registre (Al, Ah) i (Bl, Bh), upisao jedan par od spornih brojeva u iste registre. U tom slučaju oduzimanje je tačno! Moje pitanje, je kako je moguće da ima razlike ako u te neke radne registre upišem vrednost iz nekog drugog registra (preko W) i ako upišem direktno broj u W, pa opet prebacim u registar. To ne bi smelo da bude, pa se pitam gde je greška? Čak sam i pre upisa razlike na fleš (nema u ovom kodu) ubacio vrednost registra (razlika) na portove i instrumentom izmerio stanja, koja su bila pogrešna, odnosno ista koja su upisana na fleš. Probao sam i sa 16F1503 (CVD algoritam, ali peške), opet isto.
Al, Ah, Bl, Bh, k imaju takve lokacije da je moguć pristupu iz bilo koje banke. Watchdog je isključen. Algoritam za oduzimanje je krnj, ali radi za vrednosti koje dobijam. Ovo je deo programa, jer prethodno ima drugih stvari.
--------------------------------------------------------------------------------
banksel PMCON1
MOVLW b'00000000'
MOVWF PMADRL
movlw d'10'
movwf k
petlja
clrf Al
clrf Ah
clrf Bl
clrf Bh
movlw D'2' ; pauza od o.1S
movwf CounterC
movlw D'4'
movwf CounterB
movlw D'187'
movwf CounterA
loop3 decfsz CounterA,1
goto loop3
decfsz CounterB,1
goto loop3
decfsz CounterC,1
goto loop3
BANKSEL AD1CON0 ;trigerovanje konverzije
BSF AD1CON0,1
BTFSC AD1CON0,1
GOTO $-1
;RESULTS OF CONVERIONS 1.
banksel AAD1RES0H ;
movfw AAD1RES0H
movwf Ah
movfw AAD1RES0L
movwf Al
;RESULTS OF CONVERIONS 2.
banksel AAD1RES1H ;
movfw AAD1RES1H
movwf Bh
movfw AAD1RES1L
movwf Bl
;movlw 0x3 ;kada se skinu zarezi dobijam slučaj sa direktnim upisivanjem brojeva, druga slika
;movwf Ah
;movlw 0x34
;movwf Al
;movlw 0x0
;movwf Bh
;movlw 0xC1
;movwf Bl
call upis ;upis vrednosti umanjenika
call upis1 ;upis vrednosti umanjioca
movfw Bl
subwf Al,F
btfss STATUS,C
decf Ah,F
movfw Bh
subwf Ah,F
call upis ;upis razlike. Pošto je razlika ostala u Ah i Al
decfsz k,1 ;petlja da ponovim proces deset puta
goto petlja
nista
nop
goto nista
upis
banksel PMCON1
incf PMADRL,f
MOVLW b'00000111'
MOVWF PMADRH
BCF PMCON1,CFGS ; Not configuration space
BSF PMCON1,WREN ; Enable writes
BSF PMCON1,LWLO
movfw Al
MOVWF PMDATL
movfw Ah
MOVWF PMDATH
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ;
banksel PMCON1
BCF PMCON1,LWLO ; No more loading latches - Actually start Flash program; memory write
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ; to program memory.
BCF PMCON1,WREN
return
upis1
banksel PMCON1
incf PMADRL,f
MOVLW b'00000111'
MOVWF PMADRH
BCF PMCON1,CFGS ; Not configuration space
BSF PMCON1,WREN ; Enable writes
BSF PMCON1,LWLO
movfw Bl
MOVWF PMDATL
movfw Bh
MOVWF PMDATH
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ;
banksel PMCON1
BCF PMCON1,LWLO ; No more loading latches - Actually start Flash program; memory write
MOVLW 55h ; Start of required write sequence:
MOVWF PMCON2 ; Write 55h
MOVLW 0AAh ;
MOVWF PMCON2 ; Write AAh
BSF PMCON1,WR ; Set WR bit to begin write
NOP ; NOP instructions are forced as processor writes; all the program memory write latches simultaneously
NOP ; to program memory.
BCF PMCON1,WREN
return
end
---------------------------------------------------------------