ssaguiar
New Member
Hi to all.
This is my first post in this forum and I'm glad to be here.
I am working in a project of a controller for a electronic driven oven and have a question about keys debounce / autorepeat I wish to ask.
In this project, there are several keys:
- Set temperature;
- Set time;
- Set toaster on/off;
- Light on;
- On/off;
- Up;
- Down.
In this project, when you push the Up or Down keys, it ill increment / decrement the display value, making a beep each time.
If you keep the key (Up or Down) pressed for more than 2 seconds, the display value will increment faster (2 values per second) and, if you keep the key pressed formore than 4 seconds after that, these values will increment even faster (4 values per second, more or less).
The processo used is thepic16f677, but I can use for develop, the 16f877a, because I have an easyPic4 development board and it's circuit is diferent from the pcb board of the project..
Has anybody any idea on how to make this work, in pic assembler (mpasm)?
Thanks to all for any help.
Sergio
To all friends:
This is the final code for the keys autorepeat with debounce and turbo, explained:
Code:
;/****************************************************************************
;* DESCRIPTION: Verify if key Up is pressed
;/****************************************************************************
BSF TRISB,7 ; Set PORTB,7 as input (KEY_UP)
BCF STATUS, RP0 ; Goto BANK 0
BTFSS KEY_UP ; Test if PORTB pin 7 is 0 (KEY_UP pressed)
GOTO KEYUPISR ; If key pressed, go process it
;/****************************************************************************
;* DESCRIPTION: If we arrive here, no keys are pressed, so clear keys flags.
;/****************************************************************************
CLRF KEYS_FLAGS ; If no key pressed, clear Keys pressed flags.
CLRF KEYUPCNT ; Clear Key UP press counter
CLRF KEYDWNCNT ; Clear Key DOWN press counter
CLRF KEYONOFFCNT ; Clear Key ONOFF press counter
MOVLW D'3' ; Reset key debounce counter
MOVWF KEY_DEBOUNCE ;
CLRF KEY_TURBO ; Reset Key turbo counter
GOTO EXITTMR0 ; Done, exit.
;/****************************************************************************
;* DESCRIPTION: Process key Up
;/****************************************************************************
KEYUPISR
BTFSC KEYS_FLAGS,0 ; First pass? If not, use debounce/turbo
GOTO CONTDEB ; Continue, if not.
CLRF TMR_1MS ; Clear 1 ms counter (for 100 ms)
BSF BUZZEREN ; Enable beep (for 100ms)
GOTO CONTUPISR2 ; Continue
CONTDEB
MOVF KEY_TURBO,W ; If KEY_TURBO == 255
SUBLW D'255' ; Let it be 255 (we are at maximum TURBO speed).
BTFSS STATUS,Z ; Else
INCF KEY_TURBO,F ; Increment KEY_TURBO
DECFSZ KEY_DEBOUNCE,F ; KEY_DEBOUNCE--;
GOTO EXITKEYUPISR ; If KEY_DEBOUNCE > 0, exit
MOVF KEY_TURBO,W ; Else, if KEY_TURBO < 20,
SUBLW D'19' ; Then, let's use a value of 6 in KEY_DEBOUNCE
BTFSS STATUS,C ;
GOTO CONTUPISR0 ; No, it's not < 20, continue
MOVLW 0x06 ; Yes, it's below 20, then
MOVWF KEY_DEBOUNCE ; set simple autorepeat mode - KEY_DEBOUNCE = 6
CONTUPISR0
MOVF KEY_TURBO,W ; If KEY_TURBO > 20 and KEY_TURBO <= 40
SUBLW D'20' ; > 20?
BTFSC STATUS, C ;
GOTO CONTUPISR1 ; No, goto next test
MOVF KEY_TURBO,W ;
SUBLW D'40' ; <= 40?
BTFSS STATUS, C ;
GOTO CONTUPISR1 ; No, goto next test
MOVLW 0x03 ; Yes, KEY_TURBO is > 20 and <= 40 then
MOVWF KEY_DEBOUNCE ; Put in turbo mode - KEY_DEBOUNCE = 3
GOTO CONTUPISR2 ; Continue
CONTUPISR1
MOVF KEY_TURBO,W ; Else if KEY_TURBO > 40
SUBLW D'40' ;
BTFSC STATUS, C ;
GOTO CONTUPISR2 ; No, Continue
MOVLW D'255' ; If yes, make it 255, so
MOVWF KEY_TURBO ; Next time, it will allways get here...
MOVLW 0x01 ; KEY_DEBOUNCE = 1
MOVWF KEY_DEBOUNCE ; Put in extra tubo mode - KEY_DEBOUNCE = 1.
CONTUPISR2
MOVF TEMPER,W ; If TEMPER == 250
SUBLW D'250'
BTFSC STATUS,Z ;
GOTO LLA1 ; get out if = 250 and beep
INCF TEMPER,F
GOTO LLA ; continue
CALL SETDISPVAR ; Convert
DECFSZ KEYUPCNT,W ; If this is the first time the key UP is pressed, then beep?
GOTO EXITKEYUPISR ; Exit
LLA1
CLRF TMR_1MS ; Restart 1 ms counter, so timer1 isr can make beep last 100ms
BSF BUZZEREN ; Enable beep (for 100ms), untill it's disabled by timer1 isr
EXITKEYUPISR
GOTO EXITTMR0 ; Done, exit
Code:
;/****************************************************************************
;* DESCRIPTION: If beep enabled, toggle buzzer pin.
;/****************************************************************************
BTFSS BUZZEREN ; Buzzer Enabled?
GOTO ENDBEEPC ; No, get out
BSF STATUS, RP0 ; Bank 1
BCF TRISC,0 ; PORTC pin0 output
MOVLW D'1' ; Pin 0 => Buzzer
BCF STATUS, RP0 ; Bank 0
XORWF PORTC,F ; Xor PORTC,pin0 with decimal 1 (Binary 00000001).
ENDBEEPC
;/****************************************************************************
;* DESCRIPTION: Initialize all interrupts values for TIMER0 and TIMER1
;/****************************************************************************
INCF TMR_1MS,F ; Increment TR_1MS (0.5 ms counter)
MOVLW D'200' ; 200 because we have an timer1 int at every 500us.
XORWF TMR_1MS,W ; Is TMR_1MS = 200 (100ms)?
BTFSC STATUS,Z ; No, skip if TMR_1MS < 200
GOTO INC100MS ; Yes, zero TMR_1MS and inc TMR_100MS
GOTO END_INT ; No, exit interrupt
INC100MS
;/****************************************************************************
;* DESCRIPTION: Disable buzzer at every 100ms and process 100ms counter
;/****************************************************************************
BCF BUZZEREN ; Disable buzzer
CLRF TMR_1MS ; Zero TMR_1MS
INCF TMR_100MS,F ; Increment TMR_100MS (100 ms counter)
...
...
...
...
...
END_INT
Hope this can be helpfull.
Sergio