PIC16F676, konfigurace A/D převodníku
Moderátor: Moderátoři
PIC16F676, konfigurace A/D převodníku
Prosím o radu, podle seriálu v Praktické elektronice zkouším měření analogových hodnot, konkrétně podle dílu 44, tab. 56. Tam je konfigurace pro 16F88, upravil jsem nastavení portů na PORTA a PORTC a nastavení ADCON0 a ADCON1 pro 16F676. Přesto mi nejde A/D převodník, nevíte, co je třeba ještě upravit? Když pošlu hodnotu z registru W, místo vyčtení z ADRESL či ADRESH, tak mi ostatní procedutry běžej v pořádku. Jak je možno nahradit příkaz SLEEP, jak případně nastavit SAMPLE_DELAY, viz např. v tab 53, 54, 55. Děkuji za radu.
Takto je to přepsáno z časopisu Praktická elektronika, to co je tučně je pozměněno dle rady v předchozích článcích a už to funguje. Na PORTC jsou zapojeny LEDky a posílám na ně hodnotu pouze z ADRESL. Jde pouze o zkušební zapojení a prográmek. Ted když už to převádí, začnu implementovat do jiného programu, s implementací nastavení Uref a měření dvou analogových hodnot napětí a proudu + teplota z čidla DS18B20 (to už funguje). Snad už se bude dařit.
list p=16f676 ; list directive to define processor
#include <p16F676.inc> ; processor specific variable definitions
ORG 0x2007 ; processor reset vector
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;
;***** VARIABLE DEFINITIONS
;-----nastavení pro inicializaci a zobrazení na displeji-------------------------
RAM equ 0x20
d1 equ 0x21
d2 equ 0x22
; -------------------------------------------------------------------------------
org 0x000 ; zacatek programu
;-----------------------
INIT CLRF PORTA
CLRF PORTC
BSF STATUS,RP0
MOVLW b'00000001'
MOVWF ANSEL
MOVWF TRISA
CLRF TRISC
;
MOVLW b'11010000'
MOVWF OPTION_REG
;
BSF PIE1,ADIE
BSF INTCON,PEIE
MOVLW b'00010000'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW b'10000001'
MOVWF ADCON0
;-------------------------
MAIN BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF PORTC
CALL DELAY
GOTO MAIN
;------------------------
DELAY MOVLW 0x25
MOVWF d2
DELAY1 DECFSZ d1,f
GOTO DELAY1
DECFSZ d2,f
GOTO DELAY1
RETURN
;------------------------
END
list p=16f676 ; list directive to define processor
#include <p16F676.inc> ; processor specific variable definitions
ORG 0x2007 ; processor reset vector
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;
;***** VARIABLE DEFINITIONS
;-----nastavení pro inicializaci a zobrazení na displeji-------------------------
RAM equ 0x20
d1 equ 0x21
d2 equ 0x22
; -------------------------------------------------------------------------------
org 0x000 ; zacatek programu
;-----------------------
INIT CLRF PORTA
CLRF PORTC
BSF STATUS,RP0
MOVLW b'00000001'
MOVWF ANSEL
MOVWF TRISA
CLRF TRISC
;
MOVLW b'11010000'
MOVWF OPTION_REG
;
BSF PIE1,ADIE
BSF INTCON,PEIE
MOVLW b'00010000'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW b'10000001'
MOVWF ADCON0
;-------------------------
MAIN BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF PORTC
CALL DELAY
GOTO MAIN
;------------------------
DELAY MOVLW 0x25
MOVWF d2
DELAY1 DECFSZ d1,f
GOTO DELAY1
DECFSZ d2,f
GOTO DELAY1
RETURN
;------------------------
END
pred MOVF ADRESL,W ti chýba BSF STATUS,RP0
Ešte pred MAIN by som dal CALL DELAY (stačí 20us)
"Podle seriálu v Praktické elektronice" nepoznám. Ak sa jedná o kontrolery fy Microchip, tak info čerpám z ich stránok a najmä z dokumentácie ku konkrétnemu typu a info k prekladaču. V tomto prípade MPASM.
Spravidla je to postačujúce.
Poznámka:
použi "code" a "code*" ...potom je zdrojový text čitateľný ako v bežnom editore
Ešte pred MAIN by som dal CALL DELAY (stačí 20us)
"Podle seriálu v Praktické elektronice" nepoznám. Ak sa jedná o kontrolery fy Microchip, tak info čerpám z ich stránok a najmä z dokumentácie ku konkrétnemu typu a info k prekladaču. V tomto prípade MPASM.
Spravidla je to postačujúce.
Poznámka:
použi "code" a "code*" ...potom je zdrojový text čitateľný ako v bežnom editore
Kód: Vybrat vše
;--------------
MAIN:
CALL DELAY
;..........
RETURN
;--------
Děkuji za radu, už měřím dvě hodnoty napětí se stejným potenciálem. Chodí to pěkně. Ted ještě řeším jednu věc a to, že bych vypočítával ze dvou naměřených hodnot třetí a otázka je, zda se instrukcí MOVF f,d smaže hodnota z registru f, nebo pouze přenese do jiného registru f či W a v tom původním zůstane zachována? Např. pro výpočet další procedurou?
Předělal jsem program pro 16F88 z důvodu potřeby více vstupů. MPLAB SIM hlásí tyto hlášky:
ADC-W0001: Tad time is less than 1.60us
ADC-W0008: No stimulus file attached to ADRESL for A/D.
Nevíte co je příčinou hlášky ADC-W0008? Jak by měla vypadat časová procedura pro zpoždění, když používám krystal 4MHz a případně i nastavení ADCON1 a ADCON1?
Mám to takto:
MOVLW b'10100000'
MOVWF ADCON1
MOVLW b'01000001'
MOVWF ADCON0
Děkuji za radu.
ADC-W0001: Tad time is less than 1.60us
ADC-W0008: No stimulus file attached to ADRESL for A/D.
Nevíte co je příčinou hlášky ADC-W0008? Jak by měla vypadat časová procedura pro zpoždění, když používám krystal 4MHz a případně i nastavení ADCON1 a ADCON1?
Mám to takto:
MOVLW b'10100000'
MOVWF ADCON1
MOVLW b'01000001'
MOVWF ADCON0
Děkuji za radu.
K "Tad"...
Ak sú dobre nastavené ADCON0 a 1 treba v SIMe nastaviť frekvenciu. Asi bude nastavená oveľa vyššia (môže byť aj 20 000kHz).
Niektoré periférie sa zložitejšie simulujú. Niektoré cykly sú otravne dlhé.
V takýchto prípadoch v programe použijem "podmienený preklad" pri ladení.
alebo konštrukciu if.....else....endif
Ak sú dobre nastavené ADCON0 a 1 treba v SIMe nastaviť frekvenciu. Asi bude nastavená oveľa vyššia (môže byť aj 20 000kHz).
Niektoré periférie sa zložitejšie simulujú. Niektoré cykly sú otravne dlhé.
V takýchto prípadoch v programe použijem "podmienený preklad" pri ladení.
Kód: Vybrat vše
if LADENIE == 1
; časť programu pre ladenie
...
...
endif
Tak jsem provedl doprogramování celého programu, tak jak si myslím, že by to mělo fungovat. Mám to v *.asm pro 16F88. Měřím čtyři analogové hodnoty a jeden vstup pro čidlo DS18B20. Analogové hodnoty mě to ve zkušebním provedení měřilo, vyčítání z čidla fungovalo s 16F676, s 16F88 to nejde. Zhlédl by mi někdo výpis programu? Smyčka v MPLAB běhá. Bohužel asi umřel PIC tak nemohu otestovat, nevím kdy a proč, najednou ho programátor odmítá, identifikuje ho, ale při čtení, mazání a zápisu nahlásí chybu Vdd.
PIC16F88 programuji mimo zapojení přímo v programátoru PICkit2, ostaní PICy jdou číst a zapisovat v pohodě. Co se týká zapojení obvodu s PICem, tam mám popsány piny přímo v asm souboru. Asi jsem udělal někde chybu, v jednom kroku jsem si všiml, že stále dokola spouštím čtení AD převodníku, tak jestli se to nějak nepřetížilo a neodešel tím. nevím. PIC koupím novej, spíše bych potřeboval zhlédnout vypis programu a najít chybku pro vyčítání z čidlla DS18B20, s 16F676 a 16F628 to šlo a s 16F88 to nejde, procedury jsou stejné, snad, spíše to bude v přiřazení registrů či co. Možná jiné časové prodlevy (délky pulzů apod.), nevím.