Stránka 1 z 1

PIC16F676 a jeho A/D převodník

Napsal: 25 úno 2007, 13:32
od bohuš
Mám opět problém s tímto procesorem a to s nastavením A/D převodníku. Podle datasheetu jsou nastaveny registry správně, ale bohužel stále A/D nefunguje. Analogový vstup je na PA0, referenční napětí je jako Vdd. Prosím o radu s odhalením problému. Děkuji

Napsal: 25 úno 2007, 16:32
od jankop
Pro interní referenci je v příkladu chybně nastaven bit ADCON0 <6> VCFG
Pro spuštění A/D převodu je třeba aktivovat bit ADCON0 <1> GO/DONE (bsf ADCON0,GO), který je pak vhodné testovat na ukončení převodu.

Napsal: 25 úno 2007, 18:06
od bohuš
Nastaveno, ale neúspěšně. Stále nechce převádět. Už jsem to vyzkoušel na dvou kusech PICů, tak předpokládám stále chybu někde v programu :cry:

Napsal: 25 úno 2007, 19:22
od jankop
> Podle datasheetu jsou nastaveny registry správně< Tohle je vcelku dobrý vtip.
Jinak ti nemohu pomoci, protože když pošleš obrázek kousku programu, kde není ani start převodu, ani test jeho dokončení, tak s tím nic nenadělám. Mimochodem, kde ses naučil prezentovat assembler formou JPG? To je fakt hodně ujetý.

Napsal: 25 úno 2007, 20:02
od bohuš
No tak sorry za pěknej obrázek. Takhle to bude tedy asi lepší. Převod je odstartován a čeká se na dokončení. Po převodu by se měla hodnota registrů ADRESH a ADRESL dále zpracovávat.

#define GO_AD ADCON0,1

INIT
bcf STATUS,RP0
movlw 0x01
movwf PORTA ; přednastavení PORTu A
movlw 0x07 ; nastaveni PA 0-2 jako I/O
movwf CMCON
clrf PORTC ; přednastavení PORTu B

; ------------------------
bsf STATUS,RP0 ; nastavení BANKY 1
movlw b'000101' ; portA 2-0, 2vstupy, 1vystupy
movwf TRISA
movlw b'000001' ; PA0 jako analog
movwf ANSEL
movlw b'000000' ; portB 7-0, 0vstupy, 8vystupy
movwf TRISC

movlw b'11010000' ; PULL-UPy OFF, preddelic=1:32 pripojen k TMR0
movwf OPTION_REG ; f:4 :64 :156 = 100,1Hz (100us)

movlw b'00010000'
movwf ADCON1

bcf STATUS,RP0 ; nastavení BANKY 0
; ------------------------
movlw b'10000001' ;
movwf ADCON0


Převod :

bsf GO_AD
btfsc GO_AD
goto $-1
movf ADRESH,F
andlw 0xFF ; zamaskování bitů
movwf op_A+1
bsf STATUS,RP0
movf ADRESL,F
bcf STATUS,RP0

Napsal: 25 úno 2007, 20:22
od jankop
#define GO_AD ADCON0,1 ; použij raději #include <P16F676.INC> processor specific variable definitions
Použitím standardních parametrů si budeme lépe rozumnět.



bsf GO_AD
btfsc GO_AD
goto $-1
movf ADRESH,F ; Tak tohle asi ne ??? !!!
andlw 0xFF ; zamaskování bitů
movwf op_A+1
bsf STATUS,RP0
movf ADRESL,F ; A tohle taky ne !!!
bcf STATUS,RP0

Napsal: 25 úno 2007, 20:53
od tatous
prevod by Ti mel takle chodit

; ADC Start
ADC
BSF GO_AD ; ADC start
ADCgo
BTFSC GO_AD ; je 0?
GOTO ADCgo ; ne zpět
movfw ADRESH ; ano načti a
movwf op_A+1 ; ulož do reg
bsf STATUS,RP0 ; Bank1
movfw ADRESL ; načti a
bcf STATUS,RP0 ; Bank0
movwf op_A+2 ; ulož do reg
return

Napsal: 25 úno 2007, 21:03
od jankop
>movfw ADRESH ; ano načti a<
Tož tohle můj assembler nezná

Napsal: 25 úno 2007, 21:49
od bohuš
No super, už to vidím <movf ADRESH,F>, to je ale ptákovina. Děkuji všem za příspěvky, už to chodí. Tak dlouho jsem hledal chybu v nastavení registrů ADCON0, ADCON1 a ANSEL až jsem úplně přehlídl takovou "MALIČKOST"

Napsal: 26 úno 2007, 05:37
od tatous
pro jankop :
patrně používáš jiný překladač, MPLab přeložit pseudoinstrukce umí. >movfw ADRESH<
je pseudoinstrukce k
>movf ADRESH,w <
Velmi dobře je to popsáno v KTE 8/2002 v "Miniškole programování PIC"
do pana M. Hrona.

Napsal: 26 úno 2007, 08:52
od jankop
Ano, máš pravdu, tato pseudoinstrukce je v základním souboru MPLABu.
Nevěděl jsem to.