interrupt med roliga fel
Postat: 28 december 2005, 23:51:16
Hej på er där ute era smarta pic programmerare. Nu kommer jag med en fråga av ett liknande karaktär från tidigare inlägg. Jag har kortat ner allt på mallen jag använder när man skapar ett ett projekt med MPLAB till pic18f452. Tagit bort allt onödigt som jag inte andvänder. Bara för att ni ska kunna lättare förstå mitt program. Minska röran så mycket som möjligt.
OBS:
Därför programmet ser litet ut är att jag vill bara skapa en programmerings kropp först som fungerar innan jag går vidare med själva programmeringen. Därför har jag skrivit in onödiga kommando rader som NOP.Sammtidigt blir det lättare överskådligt för er som vill hjälpa en nybörjare i Mplab.
Här kommer koden:
LIST P=18F452 F=INHX32 ;directive to define processor and file format
#include <P18F452.INC> ;processor specific variable definitions
;******************************************************************************
;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
;******************Reset_start*************************************************
;Reset vector
; This code will start executing when a reset occurs.
org 0x0000
goto Main ;go to start of main code
org 0x0008
goto ISR
;**************************************************************************
;***************interrupt****************************************************
ISR
;**************init**************************************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
init:
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
return
;*********************Main********************************************
;Start of main program
; The main program code is placed here.
Main
call init
Loop
nop
nop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
Som ni ser finns det rester kvar av mallen men det visentliga kvar bara.
Nu kommer mina frågor.
Fråga nummer 1:
Jag simulerar ett interrupt signal på PortB(RB1) sedan kollar jag på INTCON3(INT1IF) denna blir en etta och interrupt har inträffat registerar pic:en. Allt är som det ska vara blir en etta när den går från låg till hög. Bra tänker jag och förväntar mig att det blir ett hopp till min Interrupt subrutin ISR. Svaret på denna hypotes blir ett nej. Så min fråga är varför hoppar inte den till ISR. Laben är länkad med org att den ska börja på adressen 0x0008 men den hoppar inte ändå. Varför inte?
Fråga nummer 2:
När min interrupt subrutin är klar så ska programmet hoppa tillbaka till huvudprogrammet där ifrån den kom. Detta gör man med kommandot retfie. När jag skriver in denna rad ett par rader nedanför ISR så får jag detta felmeddelande.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000008, length=0x00000024
Passar inte den absoluta sektionen startar på den angivna adressen och har en längd på angivet värde. Hur ska jag tyda denna information. Vart ligger felet i mitt program. Hur ändrar jag för att det ska bli rätt?
Fråga nummer 3:
Om jag vill ha fler interrupt nivåer än två går det att skapa med tanke på att det bara finns två interrupt adresser angivna? Eller måste jag välja en pic som har tre interruptnivåer, Vilken har det?
Med Vänlig Hälsning Markus Carlsson
OBS:
Därför programmet ser litet ut är att jag vill bara skapa en programmerings kropp först som fungerar innan jag går vidare med själva programmeringen. Därför har jag skrivit in onödiga kommando rader som NOP.Sammtidigt blir det lättare överskådligt för er som vill hjälpa en nybörjare i Mplab.
Här kommer koden:
LIST P=18F452 F=INHX32 ;directive to define processor and file format
#include <P18F452.INC> ;processor specific variable definitions
;******************************************************************************
;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
;******************Reset_start*************************************************
;Reset vector
; This code will start executing when a reset occurs.
org 0x0000
goto Main ;go to start of main code
org 0x0008
goto ISR
;**************************************************************************
;***************interrupt****************************************************
ISR
;**************init**************************************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.
init:
Movlw B'11111111'
movwf TRISB ;Sätter PortB till ingångar bit 0-7
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON2,INTEDG1 ;Interrupt on rising edge
bsf INTCON3,INT1IE ;Enables the INT1 external interrupt
return
;*********************Main********************************************
;Start of main program
; The main program code is placed here.
Main
call init
Loop
nop
nop
nop
nop
goto Loop
;******************************************************************************
;End of program
END
Som ni ser finns det rester kvar av mallen men det visentliga kvar bara.
Nu kommer mina frågor.
Fråga nummer 1:
Jag simulerar ett interrupt signal på PortB(RB1) sedan kollar jag på INTCON3(INT1IF) denna blir en etta och interrupt har inträffat registerar pic:en. Allt är som det ska vara blir en etta när den går från låg till hög. Bra tänker jag och förväntar mig att det blir ett hopp till min Interrupt subrutin ISR. Svaret på denna hypotes blir ett nej. Så min fråga är varför hoppar inte den till ISR. Laben är länkad med org att den ska börja på adressen 0x0008 men den hoppar inte ändå. Varför inte?
Fråga nummer 2:
När min interrupt subrutin är klar så ska programmet hoppa tillbaka till huvudprogrammet där ifrån den kom. Detta gör man med kommandot retfie. När jag skriver in denna rad ett par rader nedanför ISR så får jag detta felmeddelande.
Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000008, length=0x00000024
Passar inte den absoluta sektionen startar på den angivna adressen och har en längd på angivet värde. Hur ska jag tyda denna information. Vart ligger felet i mitt program. Hur ändrar jag för att det ska bli rätt?
Fråga nummer 3:
Om jag vill ha fler interrupt nivåer än två går det att skapa med tanke på att det bara finns två interrupt adresser angivna? Eller måste jag välja en pic som har tre interruptnivåer, Vilken har det?
Med Vänlig Hälsning Markus Carlsson