Hoi co'ers
Ik heb een programma wat uit 2 gedeeltes bestaat nl :
-interrupt gestuurde multiplex.
-counter die pulsjes telt.
Waneer ik deze 2 onderdelen apart test werken ze goed.
Maar nu ik deze als één programma heb samengevoegd lijkt mijn ic geen input op RA0 te accepteren ?
Als ik in het programma "in init" een ; voor CLRF PORTA zet, tellen de displays door tot 9 "hierna krijg ik natuurlijk een overflow"
Maar waneer ik dit commando weglaat lijkt er niets meer te gebeuren
Ik heb ook andere inputs ra1 en ra2 geprobeerd maar ook deze werken niet.
Weet iemand hoe ik de input werkend krijg ?
Groeten beest.
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
errorlevel -302
cblock 0x20
puls ; counter register
d1 ; puls-width delay
d2
endc
pclath_temp equ 0x70
w_temp equ 0x71
status_temp equ 0x72
digcount equ 0x73
digit1 equ 0x74
digit2 equ 0x75
digit3 equ 0x76
digit4 equ 0x77
maxdigits equ d'2' ;max d'4'
org 0x000
goto Init
Irq org 0x004 ; 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
movf pclath,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
movf digcount,w
banksel portb
call digtab ; select digit
movwf portb
movlw digit1
movwf fsr
movf digcount,w
addwf fsr,f
movf indf,w
call segtab ; set segment data
movwf portc
incf digcount,f
movf digcount,w
xorlw maxdigits
btfsc status,z
clrf digcount
bcf intcon,t0if
goto restore
segtab addwf pcl,f
dt 0x0c,0xe6,0x6e,0x2d,0x6b,0xeb,0x0e,0xef,0x6f,0xcf ; 0 t/m 9
digtab addwf pcl,f
dt 0x20,0x40,0x80,0x10 ; multiplex digit's
restore
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf pclath ; restore pre-isr PCLATH register contents
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
Init
banksel tmr0
clrf tmr0
clrf digcount
bsf intcon,t0ie
bsf intcon,gie
bsf intcon,peie
banksel ansel
clrf ansel ; i/o digital
clrf anselh
banksel option_reg
movlw b'10000011'
movwf option_reg ; Set option reg.
banksel trisa
movlw b'00000001' ; RA0 = input
movwf trisa
movlw b'00000000' ; all other's output
movwf trisb
movlw b'00000000' ; set up ports
movwf trisc
clrf porta ; clear porta
clrf puls ; clear counter register
e1 movlw d'0'
movwf digit1
movlw d'9'
movwf digit2 ; output value
call chsw
e2 incf digit1, f ; output value +1
call chsw ; repeat this
goto e2
pr clrf puls ;set counter register to zero
return
lkagain call delay ;pulswidth delay
chsw movf puls, w ;put counter value in W
btfsc porta, 0 ;is porta,0 1
incf puls, f ;increment f+1
xorlw d'2' ;check of w=2
btfsc status, z ;is w 2
goto pr ;goto pr
goto lkagain ;else look for 2nd pulse
lo goto lo
;-----------delay 0,135s----------
delay
movlw 0x76
movwf d1
movlw 0x6A
movwf d2
Delay_01
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_01
goto $+1
nop
return
end
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Het zal waarschijnlijk een stuk beter werken als je na de TRIS instructies weer teruggaat naar de juiste bank (0)...
