16F627A jako časovač-některé časované úseky jsou nepřesné

Zdravím všechny,
nejprve musím upozornit, že jsem strojař, elektroniku dělám pouze okrajově, ale poslední dobou dost často :confused: Nějaké věci už jsem s PICem dělal, jde to sice pomalu, někdy to je metoda pokus omyl, ale většinou se povede…
No ale k věci. Dělám takový jednoduchý časovač, zapne se trafo, z něho leze 12V, udělám si 5V pro PIC. Ten začne odpočítavat čas nastavený 8bitovým kódovým spínačem (tedy nastavitelné 0-255sekund) pak zapne první relé, pak odpočítává čas nastavený 4 bitovým kódovým spínačem (0-6s po 0,4sec) a zapne druhé relé. V simulátoru vše funguje OK, v praxi skoro taky. Když ale nastavím ten první časovač na 64+16 tak to prostě není 80sec ale něco kolem 125s… Nevím proč, když dám 64 samostatně, nebo 16 samostatně tak to funguje… když dám 255 taky funguje. jiné kombinace jsem moc nezkoumal, protože jsem z toho dost rozhozený… Navíc budu potřebovat zrovna něco mezi 80-90s a to je prostor kde to nefunguje :frowning:
Spínání druhého relé funguje v pořádku. Četl jsem už o Power-on-reset Brown-on reset, zkoušek jsem různé nastavení, ale výsledek pořád stejný.
Zatím to zkouším na zdroji 12V s proudovým omezením 90mA, 12V trafo, které bude potom ještě nemám hotové.
Schéma zapojení je v příloze. Odhaduju, že bude problém někde v nastavení těch vstupních pinů a uvedu PIC do nějakého stavu, kdy dělá něco jinak… Ale pak mi nejde do hlavy, proč to neudělá při nastavení 255 nebo samostných 64 nebo 16.
Díky moc za rady. Honza

[code] LIST P=16F627
INCLUDE<P16F627.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_ON & _LVP_OFF & _HS_OSC
errorlevel -302, -207

START equ 20h ; prirazeni nazvu registrum
PAUZA equ 21h
TMP0 equ 25h
TMP1 equ 26h
TMP2 equ 27h

#DEFINE RELE1 PORTA,1
#DEFINE RELE2 PORTA,0

org 00h		
GOTO	INIT					; skok na zacatek programu (Init CPU)

INIT:
MOVLW B’00000111’ ; typ komparatoru (off)
MOVWF CMCON
BSF STATUS,RP0
MOVLW B’11111111’
MOVWF TRISB
MOVLW B’00111100’
MOVWF TRISA
BCF STATUS,RP0
BCF RELE1
BCF RELE2
CLRF START
CLRF PAUZA
MOVF PORTB,W ; nacteni nastavenych hodnot START
SUBLW D’255’
MOVWF START
BTFSC PORTA,2 ; nacitani nastavenych hodnot PAUZY
BSF PAUZA,0
BTFSC PORTA,3
BSF PAUZA,1
BTFSC PORTA,4
BSF PAUZA,2
BTFSC PORTA,5
BSF PAUZA,3
MOVF PAUZA,W
SUBLW D’15’
MOVWF PAUZA

MOVF	PORTB,W		; nacteni nastavenych hodnot START
SUBLW	D'255'		
BTFSC	STATUS,Z   ; test jestli neni prvni sepnuti ihned, pokud ano skok na druhe rele
GOTO	ODSTUP	 

ZACATEK:
;Delay 999997 cycles
MOVLW 0x0A7 ;167 DEC
MOVWF TMP2
MOVLW 0x08 ;8 DEC
MOVWF TMP1
MOVLW 0x0F8 ;248 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
DECFSZ START
GOTO $-0x0D ; 13 DEC

ODSTUP BSF RELE1
MOVF PAUZA,W ; nacteni nastavenych hodnot PAUZA
ADDLW D’16’
SUBLW D’16’
BTFSC STATUS,Z
GOTO KONEC

;Delay 399991 cycles
MOVLW 0x0A ;10 DEC
MOVWF TMP2
MOVLW 0x5F ;95 DEC
MOVWF TMP1
MOVLW 0x8B ;139 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
DECFSZ PAUZA
GOTO $-0x0D ; 13 DEC

KONEC:
BSF RELE2

SLEEP
END

[/code]

:arrow_right: administrator: přejmenováno z "16F627A jako časovač"
schema.jpg

Cau, jen tak zbezne
jak zabezpecujes logicky jednicky na S1 pri vypnutem vypinaci ?
to co prectu z portu (hodnoty z S1 a S2) bych uz nijak neupravoval mas prectenou primo hodnotu v pripade S1, S2 staci zamaskovat a prerotovat

k cemu tam vyuzivas instrukce “SUBLW” ? zda se my to trosku nesikovny , mozna to dela i neplechu

Na portu B mám zapnuté vnitřní pull-up odpory, tak předpokládám, že to stačí.
No je to tam trošku kostrbatě řešené, protože tím, že sepnutím spínače dostanu na vstupu log.0 tak proto to odečítám od 255 a pak od 16, abych dostal hodnotu ve vteřinách, jinak by mi ty spínače fungovaly opačně a když bych měl všechny OFF tak by bylo 255 vteřin.
Program si myslím že je v pořádku, protože simulátoru funguje všechno jak má, časy jsou v pořádku… Ale po nahrání do PICu je problém…

jen pro kontrolu , a kde ? mozna sem to nekde prehlid

odpoledne na to jeste kouknu

Jo moje blbost… Vložil jsem tady první program z domu, ale v dílně už jsem měl upravený s pull-upy… Nicméně fungují oba dva stejně. Zajímavé je, že po zapnutí pull-up naměřím na pinech 0,15V.

Program co je níže jsem teďka nahrál do PICu a zkoušel. 1,2,4,8,32,128 a 255 vteřin funguje dobře. 16 jelo 240 vteřin, nastavení 64 zaplo relé po 195 vteřinách. Což vypadá, jako by to byl ten dopočet do 255.
Navíc to teď funguje jinak než minule a dokonce 64+16 funguje dobře. Takže jsem z toho jelen :cry:


	LIST P=16F627
	INCLUDE<P16F627.INC>
	__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_ON & _LVP_OFF & _HS_OSC
	errorlevel -302, -207

	

START	equ	20h		; prirazeni nazvu registrum
PAUZA	equ	21h
TMP0	equ 25h
TMP1	equ 26h
TMP2	equ 27h

#DEFINE	RELE1	PORTA,1	
#DEFINE RELE2	PORTA,0

	org 00h		
	GOTO	INIT					; skok na zacatek programu (Init CPU)

INIT:
	MOVLW	B'00000111'			; typ komparatoru (off)
	MOVWF	CMCON
	BSF		STATUS,RP0
	MOVLW 	B'11111111'
	MOVWF 	TRISB
	MOVLW	B'00111100'
	MOVWF	TRISA
	BCF		STATUS,RP0
	BCF   OPTION_REG,7     ; zapnutí pull-up odporů na portu B
	BCF		RELE1
	BCF		RELE2
	CLRF	START
	CLRF	PAUZA
	MOVF	PORTB,W		; nacteni nastavenych hodnot START
	SUBLW	D'255'	
	MOVWF	START
	BTFSC	PORTA,2		; nacitani nastavenych hodnot PAUZY
	BSF		PAUZA,0
	BTFSC	PORTA,3
	BSF		PAUZA,1
	BTFSC	PORTA,4
	BSF		PAUZA,2
	BTFSC	PORTA,5
	BSF		PAUZA,3
	MOVF	PAUZA,W
	SUBLW	D'15'
	MOVWF	PAUZA
	
	MOVF	PORTB,W		; nacteni nastavenych hodnot START
	SUBLW	D'255'		
	BTFSC	STATUS,Z
	GOTO	ODSTUP	

ZACATEK:
;Delay 999997 cycles
    MOVLW 	0x0A7  ;167 DEC
    MOVWF 	TMP2
    MOVLW 	0x08  ;8 DEC
    MOVWF 	TMP1
    MOVLW 	0x0F8  ;248 DEC
    MOVWF 	TMP0
    DECFSZ 	TMP0,F
    GOTO 	$-1
    DECFSZ 	TMP1,F
    GOTO 	$-5
    DECFSZ 	TMP2,F
    GOTO 	$-9
	DECFSZ 	START
	GOTO 	$-0x0D	; 13 DEC
	
ODSTUP	BSF	RELE1
	MOVF	PAUZA,W		; nacteni nastavenych hodnot PAUZA
	ADDLW	D'16'		
	SUBLW	D'16'
	BTFSC	STATUS,Z
	GOTO	KONEC

		
;Delay 399991 cycles
    MOVLW 	0x0A  ;10 DEC
    MOVWF 	TMP2
    MOVLW 	0x5F  ;95 DEC
    MOVWF 	TMP1
    MOVLW 	0x8B  ;139 DEC
    MOVWF 	TMP0
    DECFSZ 	TMP0,F
    GOTO 	$-1
    DECFSZ 	TMP1,F
    GOTO 	$-5
    DECFSZ 	TMP2,F
    GOTO 	$-9
	DECFSZ 	PAUZA
	GOTO 	$-0x0D	; 13 DEC

KONEC:
	BSF		RELE2

	SLEEP
	END

nezapinas pullupy, spatna banka

mozna jeste neco pripisu/editnu,tet to projizdim…

Proto každému furt radim, BANKSEL a hotovo, nemusí o tom člověk přemýšlet.

Takže stačilo přehodit to zapnutí pull-up o řádek výše dokud jsem byl v bank 1 a už to jede…
Jak jsem psal, jsem strojař a jenom do toho fušuju, ale banksel už jsem nastudoval a určitě na to budu příště myslet…

Děkuju moc za pomoc!!!

no to si asi spatne koukal jinak by si videl ze se tu pullupy nezapinaj :wink: