Interrupt probleem in assembler bij PIC16F628

Status
Niet open voor verdere reacties.

ellemoo

Gebruiker
Lid geworden
4 dec 2008
Berichten
126
Hallo programmeurs,


Ik wil (een deel van) een programma starten op de opgaande flank van een signaal op RB0.

Daarvoor heb ik een testprogramma ontwikkeld in MPLAB/assembler voor een PIC 16f628a die een LED laat oplichten bij een opgaande flank van een bloksignaal en een korte tijd later weer laat doven. Dus nog voor de neergaande flank van dat bloksignaal. Zie onderstaande code.

Het bloksignaal op RB0 start een interrupt. De RB0 interrupt routine set een FLAG, set poort RA0 (met LED, die oplicht), cleared de interrupt flag en zet de Timer0 in timer mode.
Als TMR0 overloopt, wordt de TMR0 interrupt routine gestart die, de FLAG reset, poort RA0 cleart (LED gaat uit) en de Timer0 in de countmode zet (count ingang RA4 ligt aan aarde)
Dit alles werkt perfect. LED op RA0 knippert.

Ik wil een tweede LED op RA1 identiek laten knipperen door de FLAG te gebruiken.
Daartoe activeer ik het geblankte (;;;;;;) programma deel in de

forever_loop
; test FLAG
; FLAG = 1 -> LED RA1 aan
; FLAG = 0 -> LED RA1 uit
goto forever_loop.

RA1 knippert, MAAR RA0 knippert dan niet meer.
Wat is er aan de hand?

Wie kan mij helpen?.

PS
1. Een soortgelijke ervaring heb ik ook in JALEDIT gehad.
2. Is dit (weer) een read-modify-write probleem?




CODE:


; Filename: GPS_PUL2.asm
; Files Required: P16F628a.INC
list p=16f628a ; list directive to define processor
#include <p16f628a.inc> ; processor specific variable definitions
errorlevel *-302 ; suppress message 302 from list file

__CONFIG _CP_OFF & _BODEN_ON & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF*




;***** VARIABLE DEFINITIONS
INT_VAR UDATA 0x20;_SHR 0x20
SAVE RES 2
FLAG RES 1




w_temp EQU 0x7E ; variable used for context saving*
status_temp EQU 0x7F ; variable used for context saving




;*******************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
; INTERRUPT PART
ORG 0x004 ; interrupt vector location
goto isroutine ; go to interrupt service routine

main
bcf STATUS,RP0
; * BANK 0
clrf PORTA
clrf PORTB
bsf STATUS,RP0
;BANK 1
; INPUT 1 OUTPUT 0
movlw 0x10 ; RA4 Grounded RA0,RA1 LED's
movwf TRISA
movlw 0x01 ; RB0
movwf TRISB ;

bcf STATUS,RP0 ;Bank 0
; BANK 0

bcf PORTA,RA0 ; LED A0 OFF
bcf PORTA,RA1 ; LED A1 OFF
movlw 0xb0 ;GIE, 0, TMR0 overflow , INTE, _ 0, 0, 0, 0
movwf INTCON

bsf STATUS,RP0
;BANK 1
movlw 0xe7 ;no pullup, edge up, T0CS (countmode), 0, _ 0, prescaler
movwf OPTION_REG
bcf STATUS,RP0 ;Bank 0
; BANK 0


loop_forever
;test_flag
; btfss FLAG,0
; goto test_flag_not_set
;test_flag_flag_set
; bsf PORTA,RA1
; goto test_flag_out
;test_flag_not_set
; bcf PORTA,RA1
;test_flag_out
goto loop_forever

isroutine
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
bcf STATUS,RP0
;BANK 0
movwf status_temp ; save off contents of STATUS register

rb0_interrupt
btfss INTCON,INTF ;check PB0 INT Flag
goto rb0_int_out ;not set -> int_out
btfss PORTB,RB0 ;check RB0 high
goto rb0_int_out ;not high -> int_out
clrf TMR0 ;clr timer0
bsf FLAG,0 ;flag ON
bsf PORTA,RA0 ;PIN_A0 ON
bcf INTCON,INTF ;clr interrupt

bsf STATUS,RP0
;BANK 1

bcf OPTION_REG,T0CS ;timer select (start timer0)

bcf STATUS,RP0 ;Bank 0
;BANK 0

rb0_int_out

int_t0
btfss INTCON,T0IF ;check Timer0 INT Flag
goto int_t0_out ;not set -> int_out
bcf FLAG,0 ;flag ON
bcf PORTA,RA0 ;PIN_A0 OFF
bcf INTCON,T0IF ;clr interrupt
bsf STATUS,RP0
;BANK 1
bsf OPTION_REG,T0CS ;count_select (stop timer0)
bcf STATUS,RP0 ;Bank 0
;BANK 0
int_t0_out

isr_out
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
; remaining code goes here

END ; end of program'
 
Laatst bewerkt:
Was een read-modify-write probleem.
Door een shadow_port te gebruiken is het probleem opgelost.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan