View previous topic :: View next topic |
Author |
Message |
peachgirl Guest
|
How to calculate the duration of a button inserted? |
Posted: Mon Jun 11, 2007 12:53 pm |
|
|
I use KBDD.C in the #examples# for my keyboard, now I have to calculate the duration of a button inserted, I don't know how to do realize it. |
|
|
peachgirl Guest
|
|
Posted: Mon Jun 11, 2007 12:58 pm |
|
|
In this case, I use these codes to get a value from keyboard
Code: |
int8 getvalue()
{
int8 value=0;
do
{
value = kbd_getc(); // the function of the KBBD.C
}while(value==0)
} |
I don't konw when it is inserted. but Now I think have to know the duration inserted,
Is there any one can help me? |
|
|
inservi
Joined: 13 May 2007 Posts: 128
|
|
Posted: Mon Jun 11, 2007 2:04 pm |
|
|
Hello,
What is the resolution needed ?
If you call kbd_getc() then the resolution will never be better than the time used by kbd_getc().
try some think like that for 13mSec resolution (77em second):
Code: | #use delay(clock=20000000)
#define initSec 77
int8 sec77 ;
int8 sec = 0 ;
#int_TIMER1
void TIMER1_isr(void) { // 13 ms at 20Mhz
if (--Sec77 == 0 ) {
sec77 = initSec ;
++sec ;
}
}
int16 get value() {
int16 timePushed77sec = 0 ; // time pushed by 77em seconds
sec = 0 ;
sec77 = initSec;
int8 value=0;
do
{
value = kbd_getc(); // the function of the KBBD.C
}while(value==0)
// Start count now :
enable_interrupts(INT_TIMER1);
while ( kbd_getc() != 0 ) ;
disable_interrupts(INT_TIMER1);
timePushed77sec = ( (int16)sec * initSec ) + ( initSec - Sec77 ) ;
// the time is in now timePushed77sec with 77em seconds resolution.
return ( timePushed77sec ) ;
}
void main() {
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // 13 ms at 20Mhz
//enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
|
dro. _________________ in médio virtus |
|
|
peachgirl Guest
|
|
Posted: Tue Jun 12, 2007 6:57 am |
|
|
Hello inservi,
I have tried what you said, but the result of the timePushed77sec is always 1. I don't konw why.
I used printf(lcd_putc, "%lu", timePushed77sec); I can't calcute the duration that i pushed a button.
Thank you for your help^!!!! |
|
|
inservi
Joined: 13 May 2007 Posts: 128
|
|
Posted: Wed Jun 13, 2007 3:15 am |
|
|
Hello, i tried so
Code: | #define initSec 77
int8 sec77 ;
int8 sec = 0 ;
#int_TIMER1
void TIMER1_isr(void) { // 13 ms at 20Mhz
if (--Sec77 == 0 ) {
sec77 = initSec ;
++sec ;
}
}
int16 getvalue() {
int16 timePushed77sec = 0 ; // time pushed by 77em seconds
sec = 0 ;
sec77 = initSec;
/*
int8 value=0;
do
{
value = kbd_getc(); // the function of the KBBD.C
}while(value==0)
*/
// Start count now :
enable_interrupts(INT_TIMER1);
//while ( kbd_getc() != 0 ) ;
delay_ms(1500) ;
disable_interrupts(INT_TIMER1);
timePushed77sec = ( (int16)sec * initSec ) + ( initSec - Sec77 ) ;
// the time is in now timePushed77sec with 77em seconds resolution.
return ( timePushed77sec ) ;
}
void main()
{
int16 v1;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // 13 ms at 20Mhz
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(GLOBAL);
v1 = getvalue() ;
printf("v1 %Lu ", v1);
} |
As you see, i replaced the 'while ( kbd_getc() != 0 )' by 'delay_ms(x)'
With 'delay_ms(500)' i get 39, with 1500, i get 115, with 200, i get 15.
If you get all time 1, it s probably because the function 'kbd_getc() ' is waiting for the button release before return the result or somthink like that ? unfortunately, i do not have keyboard nor 'KBBD.C' then, i can not test more.
Are you sure that you use 'KBBD.C' and not 'KBD.C' ?
You will probably have to modify the 'kbd_getc() ' function.
dro. _________________ in médio virtus |
|
|
peachgirl Guest
|
|
Posted: Wed Jun 13, 2007 4:02 am |
|
|
Hello inservi,
I tried the programme that you give me.
delay_ms(500); ------>I get 24
delay_ms(1500); ------>I get 70
delay_ms(200); ------>I get 10
I am sure the function is KBDD.C |
|
|
peachgirl Guest
|
|
Posted: Wed Jun 13, 2007 4:11 am |
|
|
What I want to say is that: if I can use while(kbd_getc() != 0) , its super!but we can't, so I want to know the raison of it. I don't konw if you have some ideas about it? and when you change it to delay_ms(500), what you think?
thanks very much again,
Heuresement vous être là!!! |
|
|
inservi
Joined: 13 May 2007 Posts: 128
|
|
Posted: Wed Jun 13, 2007 8:32 am |
|
|
Hello,
Could you send the code KBDD.C ?
C'est un plaisir de vous aider !
dro. _________________ in médio virtus |
|
|
peachgirl Guest
|
|
Posted: Wed Jun 13, 2007 9:11 am |
|
|
Code: |
#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81 // This puts the entire structure 0xF81 est l'adress de PORTB
#else
#byte kbd = 0xF83 // This puts the entire structure 0xF83 est l'adress de PORTD
#endif
#else
#if defined use_portb_kbd
#byte kbd = 6 // on to port B (at address 6)
#else
#byte kbd = 8 // on to port D (at address 8)
#endif
#endif
#define set_tris_kbd(x) set_tris_d(x)
//Keypad connection: (for example column 0 is B2)
// Bx:
#define COL0 (1 << 4)
#define COL1 (1 << 5)
#define COL2 (1 << 6)
#define COL3 (1 << 7)
#define ROW0 (1 << 3)
#define ROW1 (1 << 2)
#define ROW2 (1 << 1)
#define ROW3 (1 <<0>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
case 3 : set_tris_kbd(ALL_PINS&~COL3);
kbd=~COL3&ALL_PINS;
break;
}
if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
}
else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}
|
|
|
|
peachgirl Guest
|
|
Posted: Wed Jun 13, 2007 9:13 am |
|
|
thank you!!!
I have posted my KBDD.C |
|
|
Guest
|
|
Posted: Wed Jun 13, 2007 9:31 am |
|
|
Do you know how to difine the number of times to call kbd_getc each second? Because I think its because that the pins don't insiste 1, the pin send some impluse(pulse) |
|
|
peachgirl Guest
|
the first part of the code |
Posted: Thu Jun 14, 2007 1:11 am |
|
|
Code: |
#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81 // This puts the entire structure 0xF81 est l'adress de PORTB
#else
#byte kbd = 0xF83 // This puts the entire structure 0xF83 est l'adress de PORTD
#endif
#else
#if defined use_portb_kbd
#byte kbd = 6 // on to port B (at address 6)
#else
#byte kbd = 8 // on to port D (at address 8)
#endif
#endif
#define set_tris_kbd(x) set_tris_d(x)
//Keypad connection: (for example column 0 is B2)
// Bx:
#define COL0 (1 << 4)
#define COL1 (1 << 5)
#define COL2 (1 << 6)
#define COL3 (1 << 7)
#define ROW0 (1 << 3)
#define ROW1 (1 << 2)
#define ROW2 (1 << 1)
#define ROW3 (1 << 0)
#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)
// Keypad layout:
char const KEYS[4][4]={{'1','2','3','+'},
{'4','5','6','-'},
{'7','8','9','!'},
{'*','0','#','$'}};
#define KBD_DEBOUNCE_FACTOR 33 // |
|
|
|
peachgirl Guest
|
the second part of the code |
Posted: Thu Jun 14, 2007 1:12 am |
|
|
Code: |
void kbd_init() {
}
char kbd_getc( ) {
static BYTE kbd_call_count;
static short int kbd_down;
static char last_key;
static BYTE col;
BYTE kchar;
BYTE row;
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
case 3 : set_tris_kbd(ALL_PINS&~COL3);
kbd=~COL3&ALL_PINS;
break;
}
if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
}
else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
} |
|
|
|
inservi
Joined: 13 May 2007 Posts: 128
|
|
Posted: Thu Jun 14, 2007 3:13 am |
|
|
Hello,
You posted two versions, i assume that the right one is the second one.
I try to modify it then i post the result.
Best regards,
dro. _________________ in médio virtus |
|
|
peachgirl Guest
|
|
Posted: Thu Jun 14, 2007 3:31 am |
|
|
yes; the second
thank you very much!!! |
|
|
|