Hoi ik zit met het volgende probleem.
Voor een pic 16f690 heb ik in asm een "programmatje" geschreven.
De bedoeling is dat op iedere 2e puls die op ingang RA,1 binnenkomt mijn 7 segment display een cijfer hoger aangeeft.Hij telt door t/m 75 waarna hij stopt.
Tot hier lijkt het goed te werken.Maar de displays knipperen licht.
Weet iemand hoe dit te verhelpen ?
pic asm code:
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
ERRORLEVEL -302
ERRORLEVEL -305
ERRORLEVEL -224
;------------------------------------------
; VARIABLE DEFINITION -
;------------------------------------------
;INPUTS
cntr1 EQU H'20' ; adress voor delay
cntr2 EQU H'21' ; " "
#define DISPL1 PORTB,6 ; DISPLAY 1 TALLEN
#define DISPL2 PORTB,5 ; DISPLAY 10 TALLEN
org 0
GOTO RST
;--------------------------------------------
; CREATE A LITTLE MULTIPLEX TEMPO -
;--------------------------------------------
delay movlw 0x01 ; delay loop voor multiplexing
KILL movwf cntr2 ; delay timer voor reset / stop effect
delay1 movlw 0xff
movwf cntr1
delay2 BTFSC PORTA,0 ; is PORTA,0 hoog ( reset knop )
GOTO E_RESET ; ga naar E_RESET
BTFSC PORTA,2 ; is PORTA,2 hoog ( stop knop )
GOTO E_OFF ; ga naar E_OFF
decfsz cntr1, f ; anders vervolg routine
goto delay2
decfsz cntr2, f
goto delay1
return ; ga terug naar laatste commando
;---------------------------------------------
; *** RESET : MAIN BOOT ROUTINE *** -
;---------------------------------------------
RST BSF STATUS,RP1 ;BANK2
MOVLW B'00000000'
MOVWF CM1CON0
MOVLW B'00000000'
MOVWF CM2CON0
CLRF ANSEL ;I/O'S DIGITAL
;
BSF STATUS,RP0 ;BANK1
MOVLW B'11010111'
MOVWF OPTION_REG ;SET PIC OPTIONS
MOVLW B'00000111'
TRIS PORTA
MOVLW B'00000000'
TRIS PORTB
MOVLW B'00000000' ;I/O'S DIRECTION
TRIS PORTC
;
BCF STATUS,RP0 ;BACK TO BANK 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
GOTO E_ON
;--------------------------------------------------
; START OF PROGRAM -
;--------------------------------------------------
E_ON CLRF PORTC
BTFSC PORTA,0 ; is RA,0 hoog ga naar E_RESET
GOTO E_ON ; is RA,0 laag vervolg routine
E_AAN MOVLW H'CF'
CALL SEG2
MOVLW H'CB'
CALL SEG1 ; power attention / displays shows : ON
BTFSC PORTA,0
GOTO E_RESET ; start teller --> E_RESET
GOTO E_AAN
;--------------------------------------------------------------
E_RESET CLRF PORTC
CLRF PORTB ; wis displays
BTFSC PORTA,0
GOTO E_RESET ; wacht tot resetknop wordt losgelaten
BTFSC PORTA,1
GOTO E_1 ; wacht op startpuls van RA,1 en ga dan naar E_1
GOTO E_RESET ; anders blijf wachten op startpuls
; *************************
; * DISPLAY BESTURING *
; *************************
E_1 CLRF PORTC
CLRF PORTB ; wis "ON" op displays
BTFSC PORTA,1 ; kijk naar een puls op input RA,1
GOTO E_1 ; wacht tot PORTA,1 laag is en ga dan verder
E_01 MOVLW H'03'
CALL SEG1 ; zet de nieuwe output waarde op het display "1"
BTFSC PORTA,1 ; wacht op een puls op RA,1 en ga naar E_001
GOTO E_001
GOTO E_01
E_001 BSF DISPL1 ; laat "1" op het display staan
BTFSC PORTA,1
GOTO E_001 ; en wacht tot RA,1 weer laag is
E_0001 MOVLW H'03' ; zet "1"nogmaals op het display
CALL SEG1
BTFSC PORTA,1 ; kijk naar een puls op RA,1
GOTO E_2 ; en ga dan naar E_2
GOTO E_0001
E_2 MOVLW H'03'
CALL SEG1 ; laat "1" op het display staan tot RA,1
BTFSC PORTA,1 ; weer laag is
GOTO E_2
E_02 MOVLW H'9D'
CALL SEG1 ; zet de nieuwe output waarde op het display "2"
BTFSC PORTA,1 ; en herhaal het voorgaande
GOTO E_002
GOTO E_02
E_002 BSF DISPL1
BTFSC PORTA,1
GOTO E_002
E_0002 MOVLW H'9D'
CALL SEG1
BTFSC PORTA,1
GOTO E_3
GOTO E_0002
; *-----------------------------*
; *- X DISPLAY OUTPUT X -*
; *-----------------------------*
SEG1 MOVWF PORTC
BSF DISPL1 ; zet waarde op display 1
CALL DELAY
BCF DISPL1
RETURN
SEG2 MOVWF PORTC
BSF DISPL2 ; zet waarde op display 2
CALL DELAY
BCF DISPL2
RETURN