
Anledningen till detta:
Jag har postat samma fråga i Idebanken i en tråd med helt annat namn och som är inne på 3 sidor nu. Jag postade där för att slippa starta en ny tråd. Problemet jag ser är dock att jag tror att det är många som läst den tråden från början och som vet vad "ideen" handlar om och kanske nu inte läser tråden längre. Jag vet att jag själv håller mig inom vissa delar av detta forum. Jag tänker att Mikroprocessorrävarna håller sig främst till dessa delar av forumet.
Jag tänker mig också att en fråga av denna typ brukar generera flera bra förslag på vad felet kan vara men i den andra tråden är det stendött.
Frågan som sådan gäller uteslutande en Mikroprocessor och dess kod.
Frågan.
Processor: 12f629
Problem: Jag klarar inte att "cleara" Interupptflaggan.
Allt fungerar bra från början, simulatorn fastnar i min "MainLoop". Den "hänger" där tills jag sätter GPIO,0 till hög i stimulus kontrollfönstret. Då hamnar den i ISRen, helt enligt planerna.
Men sen, så fastnar den där.- Den går igenom ISRen och hoppar direkt till början av ISRen.
Detta beror väl på att jag inte lyckats "Cleara" interuppt flaggan för interupt on change.
I data bladet står det att jag måste:
a) Any read or write of GPIO. This will end the mismatch condition.
b) Clear the flag bit GPIF
Detta gör jag så här i koden:
Kod: Markera allt
MOVFW GPIO ;Läser GPIO för att ta bort "mismatch"
BCF INTCON,GPIF ;Clear InteruptOnChange Flag
Tacksam för ideer hur jag ska rensa flaggan. Antar att det är något som krävs att göras före flaggan kan rensas.
Koden i sin helhet som jag kör med nu.
Kod: Markera allt
;******************************************************************************
; This file is a basic code template for object module code *
; generation on the PIC12F629. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;******************************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;******************************************************************************
; *
; Files required: P12F629.INC *
; *
; *
; *
;******************************************************************************
; *
; Notes: *
; *
;******************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR 0x20
W_TEMP RES 1 ; variable used for context saving
STATUS_TEMP RES 1 ; variable used for context saving
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE CODE 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------
OSC CODE 0x03FF
; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into
; the OSCCAL register.
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET_VECTOR CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
INT_VECTOR CODE 0x0004 ; interrupt vector location
MOVWF W_TEMP ; save off current W register contents
MOVF STATUS,w ; move status register into W register
MOVWF STATUS_TEMP ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
MOVFW GPIO ;Läser GPIO för att ta bort "mismatch"
BCF INTCON,GPIF ;Clear InteruptOnChange Flag
NOP
MOVF STATUS_TEMP,w ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF W_TEMP,f
SWAPF W_TEMP,w ; restore pre-isr W register contents
RETFIE ; return from interrupt
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
MAIN_PROG CODE
START
;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
errorlevel -302
BSF STATUS,RP0 ; set file register bank to 1
CALL 0x3FF ; retrieve factory calibration value
MOVWF OSCCAL ; update register with factory cal value
BCF STATUS,RP0 ; set file register bank to 0
errorlevel +302
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
BANKSEL GPIO
CLRF GPIO ;Init GPIO
MOVLW 07h ;Set GP<2:0> to
MOVWF CMCON ;digital IO
BANKSEL TRISIO
MOVLW b'000001' ;Set GPIO 0=input
MOVWF TRISIO ;and GPIO 1-5=output
BSF INTCON,GIE ;Enable GloblInterupt
BSF IOC,IOC0 ;Enable InteruptOnChange on GPIO,0
BSF INTCON,GPIE ;Enable InteruptOnChange
MainLoop
GOTO MainLoop
NOP
END ; directive 'end of program'
MVH Peter