Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PIC se čudno ponaša
#1
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
---------------------------------------------------------------


Attached Files Thumbnail(s)

Reply
#2
Da nije poravnanje rezultata AD konverzije na levo ili desno pogresno?
Reply
#3
Mislim da to ne igra ulogu u ovom problemu. Ja sam već dobio neke brojeve iz dve konverzije u dva registra. To što sam dobio sam prebacio u neke radne registre (može da im se pristupi iz svake banke, pa mi je lakše za rad), pitanje je šta je tu pogrešno (sa moje strane verovatno), pa ne dobijam tačnu razliku ta dva broja, a dobijam kada upišem direktno brojeve u te registre, pa onda oduzmem.
Reply
#4
Daj onaj deo koda gde se vide podešavanja ADC i CVD modula. Ovaj deo sa upisom u flash možeš izostaviti radi preglednosti a i to ti je verovatno dobro.
Reply
#5
Ti radis razliku B - A. U tvom primeru gde si rucno upisivao bajtove si racunao 0x0334 - 0x00C1. Umanjenik je veci od umanjioca i dobija dobre rezultate. Oduzimanje se racuna u drugom komplementu.
Pogledaj PDF
http://ww1.microchip.com/downloads/en/De...01761E.pdf strana 281.
Probaj da rucno upises brojeve tako da je umanjenik manji od umanjioca i vidis da li to radi. Takodje obrati paznju da SUBWF radi sa sedmobitnim podacima + znak. To je problem kod tvojih podataka, pogotovo ako nizi bajt AD-a ima vrednost preko 80h. Instrukcija to tumaci kao negativan broj.
Reply
#6
Ako ti je na slikama prikazan flash nakon upisa onda ispada da si ti pisao po BANK 14 a tu su ti registri AADxxx !?
Reply
#7
Pre nego ga stavim (najmanji problem, ali da ne prenatrpavam, ako nema razloga), ako možemo da prodiskutujemo o 'fenomenu', odnosno delu koda.
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
ako dodam ovaj upis brojeva (ako skinem tačku i zarez), dobijam tačno, ako izostavim brlja. Ti brojevi (bilo koji brojevi) su već u Ah, Al i Bh, Bl, pa me zanima kako postoji razlika? Ovde u programu nema mehanizam da ako slučajno u međuvremenu nešto trigeruje ponovo ADC da iz AAD1RES0H...AAD1RES1L, to prebaci u Ah... Bl.
Reply
#8
@Goran
Mislim da falš triger nema mehanizam da ubaci u taj moj registar (fali movfw i movwf), već u njegov, a ja ga više ne diram
@Vojin
Namerno sam upisao ručno ali iste brojeve 334 i C1, da vidim da li grešim (pošto mi je digitron pokazivao drugačije).
Pod pretpostavkom da sam u konverziji dobio 334 i C1 (prvi broj na flešu je taj par brojeva, namerno sam hteo da upišem umanjenik i umanjilac i razliku da ručno proverim), zašto u toj verziji sa brojevima iz konverzije dobijem grešku, a kad upišem iste brojeve (pregazim konverziju) dobijem dobro. Priznajem da negde grešim, ali iskreno ne dolazi mi do mozga, barem ne ovim putem.
Reply
#9
Zameni vrednosti za A i B, th. neki ti A bude vece od B i tako oduzimaj. Nihe ti dobar test program za oduzimanje. Testirao si samo sa jednom vrednoscu, a ne sa vise, npr. Oduzmi 0x01ff - 0x200?
Reply
#10
Mislim da se ne kapiramo. Naveo sam na početku da mi je program za oduzimanje krnj. Svestan sam nekih stvari (nisam svih, naravno, zato i grešim negde). Trenutna priroda merenja je da je A veće od B. Pogledaj sliku, ide kolona za A, B, pa rezultat (A-B, rezultat ostaje u A, pa se poziva rutina za upis A). Ako je na fleš upisano dobro sadržaj iz A i B, 334 i C1, kako sam dobio 274 (umanjenik je veći od umanjioca). Ne vidim razliku iz ručnog upisivanja u A i B i kad iz registra prebacim u A i B.
Ako izuzmemo da mi program nije dobar (stoji da je krnj), gde je problem sa konkretnim vrednostima, odnosno specijalnim slučajem?
Reply
#11
Tek sad kapiram šta te muči ali nažalost ne mogu da objasnim. Ti čak za dva uzastopna oduzimanja kad radiš čitanje iz AADxRESxx  (prva slika) registara imaš različite rezultate
334 i C1 -> 274
334 i C1 -> 273
Reply
#12
Probaj pre bilo lalvog oduzimanja da obrises prvo carry flag, pa onda da radis oduzimanje.
Reply
#13
DAAAA!
Ne bih se ni ja obratio ovde da mi nije zona sumraka (u bukvalnom smislu).
Problem je što ne mogu iz spoljnjeg (mog sveta) da proverim da li tačno oduzima, kao i da izvršim neku statistiku. Najlakše mi je upisom u fleš pa da pregledam kakva mi je konverzija, kasnije kako utiču smetnje iz okoline... Mada ja to mogu da proverim na osnovu upisa samo tih para vrednosti (koliko lutaju), ali džaba kad posle moram u samom mikrokontroleru da napravim razliku da bih sa tim brojem nešto radio...
Vojine, pomišljao sam carry flag, evo sad ću da uradim.
Reply
#14
Vidi samo da li treba da se ocisti ili setuje. Kako radi borrow. Zaboravio sam. Dsvno je bilo
Reply
#15
Isto se ponaša. Kad bolje razmislim, meni greši u oduzimanju low bitova, tako taj carry flag nema uticaja.
Reply
#16
Probaj da prvo izvršiš oduzimanje (u Ch i Cl) pa onda radi upis sva tri broja.
Reply
#17
(04-23-2017, 12:20 PM)mp3police Wrote: Isto se ponaša. Kad bolje razmislim, meni greši u oduzimanju low bitova, tako taj carry flag nema uticaja.

Pogledaj ovo:

http://www.talkingelectronics.com/projec...e_A_11.pdf
Reply
#18
Tebi upis i upis1 ne valjaju.
Treba da:
upišeš PMADRH PMADRL
upišeš PMDATH PMDATL
uvećaš PMADRH PMADRL za jedan
upišeš PMDATH PMDATL

Ti na početku obe funkcije uvećaš PMADRH PMADRL upišeš jedan bajt a onda sledeći prepišeš preko njega.
I zašto dve funkcije za istu stvar?
Reply
#19
Vojine,
Pogledaću...
Gorane,
Hteo sam da ubacim u neke registre Ch i Cl, ali u implementaciji mi je to čisto gubljenje vremena, a treba da je brzo, pa sam onda rekao sebi što to da radimSmile  Jedino da probam u svrhu da vidim gde je problem.
Što se tiče upisa, jeste malo primitivan i ne bi bilo dobro za neki veći upis. Lakše mi je bilo da imam poseban upis za Ax i Bx i da svaki pozovem 10 puta.
Ne može ništa da pregazi ćeliju dok se ne izvrši brisanje ćelije, a to ovde nije rađeno.
Mislim da nema nikakav problem, jer adresa vrste je ista, a to je definisano sa (to ne inkrementiram):
MOVLW b'00000111'
MOVWF PMADRH
Svaki put upišem istu vrstu, a u koju kolonu smeštam regulišem sa
incf PMADRL,f
Zbog inkrementiranja ne počinje od nulte kolone, već od prve. Ne vidim problem sa inkrementiranjem, jer svaki put kad pozovem call upis ili call upis1, pomeri mi za jednu kolonu.
E, sad sam stavio sam jednom i dobio isto (nema mogućnost gaženja, barem mislim).
p.s
ponaša se isto i kad prebacim u Cx


Attached Files Thumbnail(s)

Reply
#20
Da li si probao neki In Circuit Debugger da vidis kako radi A/D konverzija ( tj. koliki je rezultat sukcesivnih konverzija na svakom od kanala)?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)