Zacyklení přerušení u 16f630

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

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

Zacyklení přerušení u 16f630

#1 Příspěvek od beagle »

Dobrý den,

jsem začátečník a učín se programovat PICY. Napsal jsem si program který po stisku tlačítka přičte 1 na displeji .Zkoušel jsem to pomocí přerušení, ale problém je v tom že nemužu vynulovat přiznakový bit INTCON,RAIF a tudíž se mi to vrací pořád na přerušení, zkoušel jsem to v MPLABU.Prosín poraĎte
kde dělám chybu?
TAdy je program

LIST P=16F630, R=DEC
INCLUDE "P16f630.inc"
;********************* definice proměnných *************************
#define ANODA1 PORTC,4 ;anoda 1LEDsegmentu
#define ANODA2 PORTC,5 ;anoda 2LEDsegmentu
#define INKREM PORTA,0 ;tlačítko +
#define DEKREM PORTA,1 ;tlačítko -
#define S_TART PORTA,2 ;tlačítko START
#define S_TOP PORTA,3 ;tlačítko STOP
#define LED PORTA,5 ;segment H2 bliká kažkou sekundu při spuštění
#define PIEZO PORTA,4 ;zvukový signál při skončení
TMP_W EQU 20h ; temp preruseni
TMP_S EQU 21h ; temp preruseni

TMP0 EQU 22h
TMP1 EQU 23h
TMP2 EQU 24h
TMP3 EQU 27h
TMP4 EQU 28h
TMP5 EQU 29h
FSR_sav EQU 30h
PCL_sav EQU 31h
W_save equ 32h
Sta_sav EQU 33h
CAS EQU 34h
JEDNOTKY EQU 25h
DESITKY EQU 26h

;--------------------------------------------------------------------------

org 0x2007 ; adresa konfigurace PIC16F630 a 675
dw _BODEN_OFF & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _MCLRE_OFF & _CPD_OFF & _INTRC_OSC_NOCLKOUT

;************************ Reset procesoru *************************

org 0x0000 ; zacatek programu
goto INIT ; skok na počáteční inicalizaci



org 0x0004 ; vektor přerušení
goto PRERUS

;**************************************************************************
;* Preruseni *
;**************************************************************************
PRERUS
movwf TMP_W ; (ulozeni hodnot registru W a STATUS)
swapf STATUS,W ; prohodi nibble STATUS a ulozi do W
movwf TMP_S ; ulozit STATUS
; ------------------------

; bcf INTCON,T0IF ; vynulovat priznak preruseni (pretekl casovac TMR0)
bcf INTCON,RAIF ; vynulovat priznak preruseni (zmena na portu RA0-RA5)
; bcf INTCON,INTF ; vynulovat priznak preruseni (vstup RA2)
;-------------------------------
bcf INTCON,RAIF
call PRICTI
; !!! zde napiste co ma preruseni vykonat !!!


;------------------------------- (obnovení hodnot registru W a STATUS)
PRERUS_KON
swapf TMP_S,W ; prohodí nibble TMP_S a uloží do W
movwf STATUS ; obnova STATUS
swapf TMP_W,F ; prohodi nibble TMP_W
swapf TMP_W,W ; obnova W
; ------------------------
retfie ; návrat z přerušení
;************************ Inicializace procesoru *************************


INIT
movlw b'00000000' ; prednastavit 0 na RA0 - RA5,
movwf PORTA

movlw b'00110000' ; prednastavit 0 na RC0 - RC3, 1 na RC4-RC5
movwf PORTC

movlw b'00000111' ; =07h, digitalni vstupy na RA0 - RA2 (comparator OFF)
movwf CMCON
; ------------------------
bsf STATUS,RP0 ; nastaveni BANKY 1

movlw b'001111'
movwf TRISA ; RA0 - RA3 vstup , RA4-RA5 výstup (0=vystup, 1=vstup)

movlw b'000000'
movwf TRISC ; RC0 – RC5vystup ( 0=vystup, 1=vstup)

movlw b'11000000' ; PULL-UPy OFF, preddelic=1:16 pripojen k TMR0
movwf OPTION_REG ; f:3,2768MHz :1 :16 = 204800Hz (4,882us)

; call 03FFh ; zapsat kalibraci vnitrniho oscilatoru
; movwf OSCCAL ; 00h min. f, 80h stred f, 0FFh pro max. f
; ------------------------
movlw b'00000000' ; nastaveni PULL-UP na vstupu RA0 - RA2, RA4-RA5
movwf WPUA ; (0 zakazan, 1 povolen)
movlw b'00000011' ; preruseni pri zmene na vstupu RC0 - RC5
movwf IOCA ; Povolit INT on CHANGE na GP0 (0 zakazano, 1 povoleno)
movlw b'10001000' ; Glob.prer. povoleno, povoleno změnou na RA0-RA5
movwf INTCON
bcf STATUS,RP0 ; nastaveni BANKY 0

clrf JEDNOTKY
clrf DESITKY

ZOBRAZ bcf ANODA1
movf DESITKY,0
movwf PORTC
call ZPOZDENI
bsf ANODA1
call ZPOZDENI

bcf ANODA2
movf JEDNOTKY,0
movwf PORTC
call ZPOZDENI
bsf ANODA2
call ZPOZDENI
btfss INTCON,GIE
return
call ZOBRAZ

;Variables: TMP2, TMP1, TMP0 (1000cyklu
; při 1MHz
ZPOZDENI
MOVLW 0x01 ;1 DEC
MOVWF TMP2
MOVLW 0x05 ;5 DEC
MOVWF TMP1
MOVLW 0x41 ;41 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
RETURN
;End of Delay



PRICTI incf JEDNOTKY,1
movf JEDNOTKY,0
xorlw b'00001001'
btfss STATUS,Z
incf DESITKY,1
clrf JEDNOTKY
;movf DESITKY,0

RETURN



END

Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 02:00
Kontaktovat uživatele:

#2 Příspěvek od jankop »

Nechce se mi to moc studovat, ale před zrušením RAIF musíš nejprve zrušit příčinu přerušení přečtením nebo zápisem brány PORTA. Teprve potom lze provést Clear RAIF. To je ovšem základ popsaný v manuálu procesoru, tak předpokládám, že je to samozřejmé.

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#3 Příspěvek od beagle »

Děkuji za odpověď.Máte pravdu. pomohlo to , nějak jsem si to neuvědonil.

Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 02:00
Kontaktovat uživatele:

#4 Příspěvek od jankop »

Rád jsem pomohl. Podstatné je, že se dovedeš zeptat a přesně specifikovat problém a výchozí podmínky.

Odpovědět

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