Problem Interrupt

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

Problem Interrupt

Inlägg av Markus »

Hej på er Microchips folk. Det var ett tag sedan jag skrev något på detta forum men nu är jag tillbaka igen.


Jag skriver ett program till PIC18f452 krets. Programmet fungerar så att det få en lysdiod att blinka på utgången med en viss fördröjning mellan till och från slaget. När det sedan kommer en insignal på RB1(INT1) interrupt så ska programmet slutat att blinka och ge en konstant ljus på dioden. Sedan efter ett tag åter går programmet till sin vanliga rutin och börjar att blinka igen.


LIST P=18F452, F=INHX32 ;directive to define processor and file format
#include <P18F452.INC> ;processor specific variable definitions

;******************************************************************************
;Configuration bits
; The __CONFIG directive defines configuration data within the .ASM file.
; The labels following the directive are defined in the P18F452.INC file.
; The PIC18FXX2 Data Sheet explains the functions of the configuration bits.
; Change the following lines to suit your application.

__CONFIG _CONFIG1H, _OSCS_OFF_1H & _RCIO_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H

;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.

UDATA

WREG_TEMP RES 1 ;variable in RAM for context saving
STATUS_TEMP RES 1 ;variable in RAM for context saving
BSR_TEMP RES 1 ;variable in RAM for context saving

UDATA_ACS

Fordrojning RES 1 ;fördröjningsvariabel



;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here

DATA_EEPROM CODE 0xf00000

DE "Test Data",0,1,2,3,4,5

;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.

RESET_VECTOR CODE 0x0000



goto Main ;go to start of main code

;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.

HI_INT_VECTOR CODE 0x0008

bra HighInt ;go to high priority interrupt routine

;******************************************************************************
;Low priority interrupt vector
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.

LOW_INT_VECTOR CODE 0x0018

bra LowInt ;go to low priority interrupt routine

;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here.

CODE

HighInt:

BSF PORTB,5
Goto DELAY





retfie FAST

;******************************************************************************
;Low priority interrupt routine
; The low priority interrupt code is placed here.
; This code can be removed if low priority interrupts are not used.

LowInt:
movff STATUS,STATUS_TEMP ;save STATUS register
movff WREG,WREG_TEMP ;save working register
movff BSR,BSR_TEMP ;save BSR register

; *** low priority interrupt code goes here ***


movff BSR_TEMP,BSR ;restore BSR register
movff WREG_TEMP,WREG ;restore working register
movff STATUS_TEMP,STATUS ;restore STATUS register
retfie






;***************************************************************************
DELAY:
Movlw HFF
Movwf fordrojning ;sätter ett startvärde
Snurra: decfsz fordrojning
Call Snurra
return




;***************************************************************************



;***************************************************************************
DELAY2:
Movlw HAA
Movwf fordrojning ;sätter ett startvärde
Snurra2: decfsz fordrojning
Call Snurra2
return

;***************************************************************************;***

init:
MOVLW H'06'
MOVWF ADCON1 ;Ställer in ADCON värdet
MOVLW B'00000000'
MOVWF TRISA ;Sätter PortA till utgångar MOVLW B'11111111'
MOVWF TRISB ;Sätter PortB till ingångar
;inställning intcon reg
BSF RCON,7 ; IPEN=1
BSF INTCON,7
BSF INTCON,6
BSF INTCON2,5 ;INTEDG1=1
BSF INTCON3,6 ;INT1IP=1
return


;***************************************************************************;**


Main: call init

Rotera: BSF PORTB,5 ;Bit 5 PortB Lysdiod till
goto DELAY2
BCF PORTB,5 ;Bit 5 PortB Lysdiod från
call rotera
END




Mina frågor är följande.

Om jag vill ha en extern interrupt på ingången RB1(INT1) ska jag då lägga till mer inställningar än jag har gjort i subrutinen init. Problemet är att programmet inte hoppar ur huvud programmet och kör HighInt subrutinen.

Minna frågor är följande:

Varför gör inte programmet det för när jag påverkar RB1 ingången i simulatorn och sätter den hög. Vilka inställningar är det jag ska ändra på annars om det jag har ställt in är fel.


Sedan har jag en fråga till om det bara finns två nivåer på interrupt(Hög,Låg) om jag skulle vilja ha en interrupt nivå till hur gör jag då tex(1,2,3).
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Jag tittade bara lite snabbt och ser att när du skall göra PortB till ingångar i TrisB så har du inget radbyte när du skall skriva b'11111111' i W-reg.
Utan då fortsätter den att tro att det fortafarnade står b'0000000' i W-reg och det blir utgångar.

Var det tillräckligt rörit??? :D
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

1. Rensa bort *allt* om inte har något med din applikation att göra !

2. Ta bort allt om high/low interrupt. Kör med en nivå, det är ovanligt att man måste använda high/low interrupt, och det bara rör till det.

3. "BSF INTCON,7" (och flera liknande ställen...) Använd symbolerna i INC filen !
T.ex : "BSF RCON,7 ; IPEN=1 ". Skall skrivas "BSF RCON, IPEN".

4. Det saknas en radbrytning, som Jeppsson också påpekade.

Kolla gärna slutet av INC filen för det nya smidigare formatet för
CONFIG inställningar för PIC18.
Om du kör en skapligt sen version av MPLAB, vill säga.

Hur *vet* du att du inte får något interrupt ?

Var finns "Snurra" och "Snurra2" ?

Skall du ha WDT på ?

Behöver du BOR ?

Vad kör du med för oscillator config ?

Var används EEPROM_DATA ?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Oj, vilken soppa.
Du har blandat ihop call och goto på något vis.

När du använder call så läggs nuvarande adress på stacken innan programmet hoppar och rutinen som har anropats ska avslutas med return så hoppar den tillbaka.

Om du ska göra ett hopp utan återhopp så ska du använda goto eller bra.

Det går att få fler prioritets-nivåer för interrupt (dock inte i hårdvaran) men då måste man trixa lite.
Men jag lovar att du inte behöver det än på ett bra tag.
Även om man bara har 2 prioritets-nivåer så kan du fortfarande ha fler interruptkällor än 2, det var kanske det du egentligen menade.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Du har blandat ihop call och goto på något vis.

Missade det... :-)
Det skulle så klart ha varit med i min lista... :-)
Skriv svar