Problem s ext. prerusenim u 16F84

Radek a Petra Vickovi rvicek
Středa Březen 17 14:25:00 CET 2004


Zdravim.
Mel bych prosbu na "PICare" zda by me nepomohli najit v cem je problem.
Napsal jsem rutinu ktera prijima data (jak se vysila je popsano nize) a
odladil ji v hlavni smycce programu. Cekal jsem na 1 na RA0 a jakmile se
objevila probehla tahle rutina a tak porad kolem dokola. Jelikoz potrebuji
delat taky jeste neco jineho nez tohle presunul jsem tuhle rutinu do
preruseni a preruseni se generuje z RB0 opet pokud je 1 jdu do preruseni a
dekoduju.
Vsechno krasne funguje az na jednu kosmetickou vec. Z nejakeho duvodu se to
preruseni vyvola jeste jednou hned po tom prvnim. Tedy prijde vysilani ja
jej dekoduji a vyhodnotim blikne me zelena LED ze je vse OK a pak najednou
blikne jeste cervena LED jako ze vysilani nebylo moje (jelikoz nic nevysila
je to spravny vysledek). Zjevne se jedna o to ze se preruseni vyvola jeste
jednou i kdyz neni vysilano. Zkousel jsem prodlouzit cas za dekodovanim
abych eliminoval nejake dobehy vysilace, ale zde problem neni.

Jedina zmena tedy je ze jsem presunul vstup z RA0 na RB0 kvuli preruseni a
nejsem si jist zda nemuze byt nejaky problem s typem vstupu. Koukal jsem do
DS, ale z toho mne nic nenapadlo. Jediny rozdil je v tom ze RB0 je ST a RA0
neni ale to snad nevadi.

Zde je ten program k nahlednuti. Jelikoz je to ma prvotina budte ke mne
shovivavi pokud jsem nekde udelal nejakou cunarnu. Nicmene pokud mi nekdo
napise ze se neco dela jinak a elegantneji budu rad. Ten vysilac jsem
programoval take ja takze pripominky k zajisteni chybovosti jsou
neopodstatnene, jelikoz je to zabezpeceno systemem vysilani. :-)
Dekuji za odpovedi.

RadekCX


**********************************************************
	LIST P = 16F84,	R = DEC
	#include<p16f84.inc>

;Zapojeni:
;Na RB0 je pripojen UHF prijimac ktery poskytuje jiz demodulovana data
;kdyz je v 1 je detekovana nosna kdyz v 0 nevysila se. Modul zvlada max
;2kHz modulaci. Kazdy bit je vysilan jako sekvence 1X0 (X je vlastni
;datovy bit) a jeho vysilani trva 3x1ms tedy modulacni kmitocet je 1kHz.
Cele
;vysilani je zacato vyslanim dvou bajtu R a V (bitove) a pak dva bity ktere
;informuji o stavu cidel.
;	HSosc	4MHz
;	RB0	IN  - RX p?ij?m? kdy? je 1
;	RB1	OUT - zelena LED sviti v 1 - dekodovan? OK
;	RB2	OUT - zluta LED sviti v 1 - cidlo 1
;	RB3	OUT - zluta LED sviti v 1 - cidlo 2
;	RB4	OUT - cervena LED sviti v 1 - ru?en?

#define RX		PORTB,0		;
#define LEDOK	PORTB,1		;
#define LED1	PORTB,2		;
#define LED2	PORTB,3		;
#define LEDERR	PORTB,4		;
#define TOIF	INTCON,2		;
#define INTF	INTCON,1		;

OFFRAM	EQU	0x0C		;zacatek RAM
MEM_W		EQU	OFFRAM	;pamet W
MEM_STAT	EQU	OFFRAM+1	;pamet STATUS
TMP0		EQU	OFFRAM+2	;pomocne promenne pro smycky
TMP1		EQU	OFFRAM+3	;pomocne promenne pro smycky
TMP2		EQU	OFFRAM+4	;pomocne promenne pro smycky
MCIDLA	EQU	OFFRAM+5	;registr cidel
ERRCNT	EQU	OFFRAM+6	;counter alarmu
ITMP0		EQU	OFFRAM+7	;pomocne promenne pro smycky
ITMP1		EQU	OFFRAM+8	;pomocne promenne pro smycky
ITMP2		EQU	OFFRAM+9	;pomocne promenne pro smycky
;*******************************************************************
	ORG 0x0

	goto start	;odskok na zacatek programu

	ORG 0x4
	goto intproc	;odskok do preruseni

	ORG 0x5
;*******************************************************************
start
	clrf PORTB	;portb do 0
	clrf PORTA	;porta do 0

	bsf STATUS,RP0		;banka 1

	movlw B'11000111'	;
	movwf OPT_REG		;pull-ups zakazany, RB0/INT nabezna

	movlw B'00000001'
	movwf TRISB		;portb cely vystup jen RB0 je vstup
	movlw H'FF'
	movwf TRISA		;porta cely vstup
	bcf STATUS,RP0		;banka 0

	bsf LEDOK		;inicializace - rozsv?tit
	call s1
	bcf LEDOK		;inicializace - zhasnout

	bsf LEDERR		;inicializace - rozsv?tit
	call s1
	bcf LEDERR		;inicializace - zhasnout

	bsf LED1		;inicializace - rozsv?tit
	call s1
	bcf LED1		;inicializace - zhasnout

	bsf LED2		;inicializace - rozsv?tit
	call s1
	bcf LED2		;inicializace - zhasnout

	movlw B'10010000'
	movwf INTCON		;GIE povoleno, INTE povoleno, vse dalsi OFF

SMYCKA
	goto	SMYCKA		;zde bude obsluha casove nekritickych udalosti
	return

;*******************************************************************
intproc
	movwf MEM_W	;push
	swapf STATUS,W
	movwf MEM_STAT
	bcf INTF	;vynulovani priznaku preruseni o RB0

	call s001	;
	call ms5	;pockame na prostredek bitu

			;1.byte - pismeno R
	btfsc RX	;1.bit - 0
	goto chyba	;nesouhlasi koncim dekodovani
	call s003	;pockam na dalsi bit
	btfss RX	;2.bit - 1
	goto chyba
	call s003
	btfsc RX	;3.bit - 0
	goto chyba
	call s003
	btfss RX	;4.bit - 1
	goto chyba
	call s003
	btfsc RX	;5.bit - 0
	goto chyba
	call s003
	btfsc RX	;6.bit - 0
	goto chyba
	call s003
	btfss RX	;7.bit - 1
	goto chyba
	call s003
	btfsc RX	;8.bit - 0
	goto chyba
	call s003
			;2.byte - pismeno V
	btfsc RX	;1.bit - 0
	goto chyba
	call s003
	btfss RX	;2.bit - 1
	goto chyba
	call s003
	btfsc RX	;3.bit - 0
	goto chyba
	call s003
	btfss RX	;4.bit - 1
	goto chyba
	call s003
	btfsc RX	;5.bit - 0
	goto chyba
	call s003
	btfss RX	;6.bit - 1
	goto chyba
	call s003
	btfss RX	;7.bit - 1
	goto chyba
	call s003
	btfsc RX	;8.bit - 0
	goto chyba
	call s003
	bsf LEDOK	;hlavicka OK rozsvitim LEDOK

			;ted prijmu stavy cidel
	btfsc RX	;1.bit - data
	bsf LED2
	call s003
	btfsc RX	;2.bit - data
	bsf LED1
	goto konec

chyba	bsf LEDERR	;jednalo se o ruseni rozsvitim LEDERR

konec	call s1	;necham LED 0.1s svitit
	bcf LEDOK	;zhasnout
	bcf LEDERR	;zhasnout
	bcf LED1	;zhasnout
	bcf LED2	;zhasnout

	swapf MEM_STAT,W
	movwf STATUS
	swapf MEM_W,F
	swapf MEM_W,W
	retfie
;*******************************************************************
---
Odchoz? zpr?va neobsahuje viry.
Zkontrolov?no antivirov?m syst?mem AVG (http://www.grisoft.cz).
Verze: 6.0.404 / Virov? b?ze: 228 - datum vyd?n?: 15.10.2002




Další informace o konferenci Hw-list