Puls te kort voor pic16f628

Hallo allemaal.

Ik heb een klein stukje electronica met als hoofd een pic16f628. Nu is het zo dat de meganische puls op de schakelaar (micro swish) te kort is waardoor hij deze niet telt.
Wanneer ik die zelfde schakelaar met de hand bedien telt hij wel
Ik vermoed dat het te maken heeft met de :
Debounce wait.
Klopt dat. En wat moet ik er dan aan veranderen?
Hier onder staat de code,

list c=123,p=pic16f648a
radix dec
errorlevel 0, -302, -306

#include <p16f648a.inc>

__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _PWRTE_ON & _CP_ON & _MCLRE_OFF
sysclock equ d'4000000' ;Crystal frequency

fclock set sysclock /4
delay1ms_value set (fclock / 50000) + (fclock / 500000)

;==================================================================================================
; Shared Data memory 70...7F Hex
;--------------------------------------------------------------------------------------------------
lp_delay equ 0x70
lpcount equ 0x71
scount equ 0x72
mscount equ 0x73
temp equ 0x74
checksum equ 0x75
ledcnt equ 0x76
relcnt equ 0x77
loopcnt equ 0x78

;-------------/ Port A bit assignments /-----------------------------------------------------------
;
#define button1 porta,0
#define button2 porta,1
#define button3 porta,2
#define button4 porta,3
;
;-------------- Port B bit assignments /-----------------------------------------------------------

#define led1 portb,0
#define led2 portb,1
#define led3 portb,2
#define led4 portb,3
#define led5 portb,4
#define relay1 portb,5
#define relay2 portb,6

;==================================================================================================
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;==================================================================================================
org 0x0000
startup goto initialize

org 0x0004
initialize
banksel trisa
movlw b'00001111'
movwf trisa
clrf trisb
banksel portb
clrf portb
clrf ledcnt
clrf relcnt
movlw 0x07
movwf cmcon

;========================================================================================
; MAIN: Main program loop
;========================================================================================
main btfss button1 ;Button 1 pressed?
goto main_2 ;No
call delay_20ms ;Debounce wait
btfss button1 ;Test again
goto main_2 ;
main_1_lp btfsc button1 ;Wait release button 1
goto main_1_lp ;
movlw d'5' ;
xorwf ledcnt,w ;
btfsc status,z ;
goto main_clrled ;
incf ledcnt,f ;Increment led count
goto main_rel ;
main_clrled clrf ledcnt ;
goto main_rel ;
;------------------------------------------------------------------------
main_2 btfss button2 ;Button 2 pressed?
goto main_3 ;No
call delay_20ms ;Debounce wait
btfss button2 ;Test again
goto main_3 ;
main_2_lp btfsc button2 ;Wait release button 2
goto main_2_lp ;
movlw d'5' ;Load ledcount with max
movwf ledcnt ;
goto main_rel ;
;------------------------------------------------------------------------
main_3 btfss button3 ;Button 3 pressed?
goto main_4 ;No
call delay_20ms ;Debounce wait
btfss button3 ;Test again
goto main_4 ;
main_3_lp btfsc button3 ;Wait release button 3
goto main_3_lp ;
clrf ledcnt ;All relays/leds off
clrf portb ;
goto main_rel ;
;------------------------------------------------------------------------
main_4 btfss button4 ;Button 4 pressed?
goto main ;No
clrf portb ;
call delay_20ms ;Debounce wait
btfss button4 ;Test again
goto main_rel ;
main_4_lp btfsc button4 ;Wait release button 4
goto main_4_lp ;
clrf relcnt ;
clrf ledcnt ;
clrf portb ;

main_butt4_lp0 incf relcnt,f ;Load initial values
movlw d'100' ;Update port status
movwf loopcnt ;
bsf status,c ;
rlf portb,f ;
main_butt4_lp1 decfsz loopcnt,f ;5 sec. waitloop
goto main_butt4_lp2 ;
goto main_rel ;
main_butt4_lp2 call delay_50ms ;
btfss button4 ;Wait next press
goto main_butt4_lp1 ;
call delay_20ms ;
btfss button4 ;Debounce
goto main_rel ;
main_butt4_lp3 btfsc button4 ;Wait release
goto main_butt4_lp3 ;
movlw d'5' ;All done?
xorwf relcnt,w ;
btfss status,z ;
goto main_butt4_lp0 ;
clrf relcnt ;
goto main ;

main_rel clrf portb ;
movf ledcnt,w ;
movwf temp ;
incf temp,f ;
main_rel_lp decfsz temp,f ;
goto main_led ;
goto main_rel2 ;
main_led bsf status,c ;
rlf portb,f ;
goto main_rel_lp ;

main_rel2 movf ledcnt,w ;
btfsc status,z ;
goto main ;
xorwf relcnt,w ;
btfss status,z ;
goto main ;
bsf relay1 ;
bsf relay2 ;
movlw d'2' ;
call delay_s ;
bcf relay2 ;
movlw d'8' ;
call delay_s ;
bcf relay1 ;
goto main ;

;==================================================================================================
; [x] delay_s Waitloop of 'W' sec
; [x] delay_ms Waitloop of 'W' ms ('W' is W register value in msecs)
;--------------------------------------------------------------------------------------------------
delay_50ms movlw d'50'
goto delay_ms
delay_20ms movlw d'20'
delay_ms movwf mscount
delay_ms_lp1 movlw delay1ms_value
movwf lp_delay

delay_ms_lp2 movlw d'15'
movwf lpcount
delay_ms_lp decfsz lpcount,f
goto delay_ms_lp

decfsz lp_delay,f
goto delay_ms_lp2
decfsz mscount,f
goto delay_ms_lp1
retlw 0

delay_s movwf scount
delay_s_lp movlw d'250'
call delay_ms
movlw d'250'
call delay_ms
movlw d'250'
call delay_ms
movlw d'250'
call delay_ms
decfsz scount,f
goto delay_s_lp
retlw 0

end

Alvast bedankt.

Zet er even code-tags omheen, zo is het bijna niet te lezen...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik heb geen verstand van PIC's en geen zin om me d'r in te gaan verdiepen. Maar.... een mechanische schakelaar is ALTIJD langzaam genoeg dat een microcontroller dat makkelijk kan zien. Er is iets met HOE je het doet in je software als het niet werkt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Shiptronic

Golden Member

Gebruik je iets van een Interupt? die zou hem moeten pakken.

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Nu is het zo dat de meganische puls op de schakelaar (micro swish) te kort is waardoor hij deze niet telt.

Als dat zo is denk ik eerder dat de microswitch niet geheel schakelt. Ik zou dat eerst eens controleren. Als de puls echt zo snel is dan kan je ook geen mechanische schakelaar gebruiken maar zou iets met een magneetje en hall-switch of met IR-lichtsensor moet gaan proberen.

maar als je toch denkt dat het aan je programma ligt dan kan je de wachttijden gewoon wat korter maken of helemaal weg en de contact dender filter maken rondom je schakelaar.

een mechanische schakelaar is ALTIJD langzaam genoeg

Is ook mijn gedacht maar de mechnische puls naar de schakelaar toe die kan wel te kort zijn waardoor de schakelaar gewoon niet schakelt maar ergens tot halverwege komt.

Daar had ik ook last van toen ik mijn brommer zo ver had opgevoerd dat de contactpunten het niet meer konden bijhouden. eenmaal met elektronische ontsteking gingen de toeren nog verder omhoog tot bijna max van de toerenteller.

[Bericht gewijzigd door benleentje op 22 mei 2020 22:35:22 (29%)]

Oke gaan we dat proberen morgen.
Gr jan

Als je de code even van code tags voorziet wil ik er wel even naar kijken, zo is het niet te lezen...
[code=picasm]
...
...
[/code]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik zou die delay_20ms eens korter maken, dus de '20' in delay_20ms movlw d'20' vervangen door 5 of zo, en het dan nog eens proberen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken