PIC16F676, konfigurace A/D převodníku

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

PIC16F676, konfigurace A/D převodníku

#1 Příspěvek od fikes »

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.

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#2 Příspěvek od procesor »

Vlož tu svoje dielo, inak nie je o čom radiť.

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#3 Příspěvek od fikes »

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

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#4 Příspěvek od procesor »

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

Kód: Vybrat vše

;--------------
MAIN:
           CALL  DELAY
           ;..........
           RETURN
;--------


Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#5 Příspěvek od fikes »

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?

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#6 Příspěvek od forbidden »

Zkopíruje se, v původním registru zůstane.

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#7 Příspěvek od fikes »

Díky, jdu to zkusit naprogramovat.

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#8 Příspěvek od fikes »

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.

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#9 Příspěvek od forbidden »

Hodnoty Tad pro různý taktovací frekvence jsou v datasheetu. Nastav to podle něj.
A pokud používáš ten simulátor, tak asi musíš nějak simulovat vstupní hodnoty pro ten AD převodník. Tohle jsem ještě nepotřeboval, tak nevím jak přesně to nastavit.

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#10 Příspěvek od MiloPS3 »

toto by mel bejt funkcni program od uzivatele z jineho fora,
Tad time is less than 1.60us / co to asi znamena ?
neuskodil by tvuj komplet kod
Přílohy
AD.asm
(1.62 KiB) Staženo 132 x

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#11 Příspěvek od procesor »

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í.

Kód: Vybrat vše

      if LADENIE == 1
; časť programu pre ladenie
...
...
    endif
    
alebo konštrukciu if.....else....endif

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#12 Příspěvek od fikes »

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.

Uživatelský avatar
strg
Příspěvky: 26
Registrován: 14 říj 2004, 02:00

#13 Příspěvek od strg »

Daj sem schému ako to máš zapojené pri programovaní a tiež aj program čo tam láduješ. Ak programátor správne detekuje ten PIC, tak mu pravdepodobne nič nieje.

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#14 Příspěvek od fikes »

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.

Uživatelský avatar
strg
Příspěvky: 26
Registrován: 14 říj 2004, 02:00

#15 Příspěvek od strg »

Možno by to aj niekto "zhlédnul" keby si to už konečne sem dal. :o)

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“