PIC12F675 a AD prevodník

Dobry den, mam poslednich par dni problem s funkcnosti AD prevodniku u 675ky. Podle rady jednoho programatora z UK jsem nejspis spravne nastavil AD prevodnik. Potrebuji aby program vzdy kdyz je hodnota mensi nebo vetsi nez UPPER_LIMIT a LOWER_LIMIT tak se spusti SIRENA, jinac to skoci na ARMED2.
Prikladam kod, doufam ze bude k necemu a snad mi pomuzete.
Jsem uz pekne zoufaly :frowning:

Pri realizaci nez program dojde k b Cidla vse funguje v poradku, potom uz prestane pracovat a chova se stale jako ARMED2
main.asm (6.43 KB)

VOLTY_hi EQU 0x33

#define VOLTY_MAX .522 ;2.55 V

Nastaveni AD prevodniku:

        movlw	b'10001'        ;AN0 analog input,conversion clock Fosc/8
movwf	ANSEL

movlw	b'00000001'	;ADC on, right justified ;razeni zleva
movwf	ADCON0

Cidla:
;ctu z AD prevodniku a nastavuju ho
banksel ADCON0
bsf ADCON0,1 ;start conversion

movlw 	.200	
movwf 	pocitadlo5

WaitADC:
; banksel ADCON0
; btfsc ADCON0,GO ;tady se to zacyklilo tak jsem to udelal odecitanim

decfsz 	pocitadlo5  
b 		WaitADC    ;wait for ADC to finish
b		GetADC1

GetADC1:
movf ADRESH, W ;get high byte
movwf VOLTY_hi
banksel PIR1
bcf PIR1,ADIF ;clear conversion flag

;porovnavam hodnoty
banksel GPIO
movf VOLTY_hi,W
subwf VOLTY_MAX
btfss STATUS,C
b ALARM_off
b ALARM_on

ALARM_on:
b Sirena
ALARM_off:
b ZaCidla

Chci aby, kdyz hodnota VOLTY_hi bude mensi nez VOLTY_MAX se spustila sirena, jinac to preskoci na ALARM_off.

mam to spravne, nebo mi tam neco chybi? Vse z kodu co mam ohledne AD mam zde. Nic vic nemam k AD v kodu.

Diky moc za pomoc

Podprogram Cidla používáš na co? Mě se to na něj ani nedostane

A máš tam chybu v nastavení registrů. Buď dej CBLOCK a nebo EQU, ale ne oboje naráz od adresy 0x021.

A někde máš špatně nastavenou banku, přepisují se registry v BANK1 0xA0 - 0xA8

V příloze máš datasheet CZ
12f675.zip (2.17 MB)

Podprogram cidla slouzi k tomu abych ze zabezpeceneho stavu(ARMED2) kontroloval jestli neni napeti vetsi nez referencni.
Musi byt nastaveny dvere na (GP5)0, klic na (GP3)0 a okna na (GP4)1. Pak to skoci na cidla. Zjistuje jestli nahodou nejsou okna zavreny, ale netece v tom obvodu vyssi napeti-cili premostene snimace. Na to bych chtel pouzit ten AD.

  1. Ten cblock 0x20 je od 20ky. a EQU mam od 21, ale asi se spatne koukam , jsem fakt zacatecnik :frowning:

3)Banka byla spatne nastavena u ADCON, byla tam stale PAGE1 a on je na PAGE0.

V priloze dodavam kod.

Tak uz to prekvapive dela co ma, jen musim nastavit v pripade ze misto premosteni dratkem se pouzije neco jako odpor presnejsi hodnotu v binaru a je to snad vse :slight_smile:

DIKY MOC !!!
Ja to fakt ty blbosti nevidel
main.asm (5.98 KB)

Smaž ten CBLOCK a ENDC, nebo si do něj dej registry. A můžeš od 0x20

Aha diky, to jsem nevedel. Vis zkousim programovat ve skole a moc mi to nejde a takoveto veci ziskavam postupem casu do hlavy. Diky moc za vsechny rady.

Tak se snazim upravit ten domaci alarm tak, ze k hodnote co namerim udelam limity kde muze byt napeti na AD aby nezacal alarm rvat. Hodnotu z AD jsem si nameril a ulozil do EEPROM pro kontrolu. To funguje tak jak ma. Pote v teto funkci k hodnote co mam namerenou(VOLTY_hi) prictu limit 100mV a odectu pro urceni rozmezi tolerance.

        banksel	GPIO	
movfw	VOLTY_hi    	
addwf 	MEZ_R,W		;pricteni k hodnote 100mV
movwf	LIMIT_hi
movfw	MEZ_R   		
subwf	VOLTY_hi,W		;odecet od hodnoty 100mV
movwf	LIMIT_lo
b		Armed2

To podle simulace funguje…
Jenze ted se snazim zhodnotit jestli hodnota VOLTY_hi(namerena) je vetsi jak hodnota LIMIT_hi a pokud ano tak se spusti ALARM(ALARM_on) a pokud hodnota VOLTY_hi je mensi jak hodnota LIMIT_lo tak se spusti ALARM(ALARM_on). Jinak bude alarm vypnuty.

Cidla:
banksel STATUS
bcf STATUS,C
bcf STATUS,C

banksel	GPIO
movf	VOLTY_hi,W
subwf	LIMIT_hi
btfss	STATUS,C
b	ALARM_on
banksel	GPIO
movwf	LIMIT_lo
subwf	VOLTY_hi,W
btfss	STATUS,C
b	ALARM_on
b	ALARM_off

Porad resim jestli mam ten kod nastaven dobre, nebo ne.

Ted me napadla takova vec, ja nacitam hodnotu z AD jen kdyz k ni pricitam hodnoty a odecitam. Asi bych mel tesne pred timto vyhodnocenim udelat jeste jednou nacteni hodnot z AD prevodniku, jinak to asi nema zadny smysl…

Pokud to funguje?!?

Pokud je to alarm, tak by jsi to měl občas změřit. Třeba 1x za vteřinu.

To mi prave dela psi kusy…proto jsem to sem dal jestli nahodou v tom nevidite Vy co delate s PICem casto nejakou botu.

Teda resim jen navesti Cidla, ostatni by melo byt oukey

Uz se pred tim nez zjistuju cidla odvolavam na funkci ktera zmeri hodnotu napeti…

Dej sem program. A to platí i pro příště, když se na něco ptáš ohledně programu. Já si ten program nepamatuju jak byl původně a nemůžu vědět, jaké jsi udělal úpravy :smiley: A nevykej mi, jsi na foru!!

Uz to funguje jak ma, doufam ze to bude hotovy. Jsem prepisoval hodnotu VOLTY_hi vysledkem z odecitani…v CIDLA. Ted uz to funguje presne s tou referenci jak ma…

Pro kontrolu to sem davam.

Nevykam Ti, neboj. Heh vyznelo to tak, ja myslel Vy jako komunita :wink:
main.asm (6.72 KB)