|
|
View previous topic :: View next topic |
Author |
Message |
salgulsen
Joined: 16 Sep 2009 Posts: 21
|
Button noise suppression && software uart (if needed |
Posted: Sun Sep 27, 2009 10:44 am |
|
|
Hi again!
I've some questions to ask...
1. I'm using some push-buttons with 16F877a...But i need to suppress the noise of the button to get a clear input signal... There are some ways to do this (correct me if i'm wrong):
* You can send a delay(xxx) command to suppress it (easiest way, but whole program halts within the whole delay period)
ex : delay_ms(1000)
*If you want the program not to halt, you can use the delay function in a for - next loop which allows you to use interrupts, partially enabling the pic --- like
for i= 0 to 1000
delay_ms(1)
next i
*You can use a dummy pic, which serially sends the button inputs via a byte to the main pic and main pic use the byte as the main input. I generally prefer to use this..At least i used to do this...It was easy to send & receive data with BASIC compiler...I send the inputs from the dummy pic to main pic and run the main pic program according to the input byte...
Questions
*First of all, is there a way to suppress the button noise without completely stopping the program and without the need of the interrupts?
*If not, and/or i have to use interrupts, how can i do these in the safest and easiest way :
I need to get input from 1 analog (2 if -needed-) sensor/s and send commands to
*1 SPI-communicating chip (AD5206 digital potentiometer)
*1 RS232 communicating device
*1 LCD screen to notify the user what is going on with the system
with the 5 input pushbuttons.
*And if i dont want to use interrupts at all and use 1 port software UART (i want to use the HW UART to communicate with the rs232 device) to make communication between the main pic and the dummy pic which all the pushbuttons are connected, is there any safe & easy way to make a good communication which half of the data isn't crappy/ which you can receive the whole data without losing a bit? i've tried using KBHIT but i KNOW i should call it somewhat different... (in the help, it is written that i should call the KBHIT 10 times the bit rate...I'm using a 20Mhz crystal osc and using a 19200 baud serial UART which is i'm communicating nearly 100 times the bit rate...)
Here is the code :
Code: |
#include <16f628A.h>
#Fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=pin_A1, rcv=pin_B0, parity=N, stop=1,FORCE_SW)
#include <Flex_LCD420.c>
#include <stdlib.h>
#BYTE databyte = 0x20
#BIT start = databyte.0
#BIT menuup = databyte.1
#BIT menudown = databyte.2
#BIT confirm = databyte.3
int8 res;
void rxntx()
{
if(kbhit()){
res = getc();
If (res==0xFF){ //When a 0xFF is received, send 0xFF with the input data (2 bytes)
databyte=0;
putc(0xFF);
delay_us(1);
start=input(pin_b4);
menuup=input(pin_b1);
menudown=input(pin_b2);
confirm=input(pin_b3);
putc(databyte);
}else{
putc('h');
delay_us(1);
putc('u');
delay_us(1);
putc('h');
delay_us(1);
putc('?');
delay_us(1); // When a 0xFF is not received as input, send "huh?"
break;
}
}
}
void main()
{
port_b_pullups(TRUE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(global);
while(1)
{
rxntx();
}
}
|
I've tested this code with SIOW : It does send & receive data but it sometimes sends corrupted data or no data at all...
If you have another alternative for the button noise suppression while communicating with the devices i'm using with, please dont hesitate to tell...
Thanks in advance!! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
salgulsen
Joined: 16 Sep 2009 Posts: 21
|
|
Posted: Mon Sep 28, 2009 5:00 am |
|
|
Thanks for the help, PCM Programmer...I've tried the code, it works quite well...except i have a question about the auto-repeat function...I'm having a weird problem...
It is pretty ok when i use :
if(button(PIN_A1, 0, 50, 1, A1, 1)){
printf(lcd_putc,"A1");
}
This prints "A1" and waits for 500 ms and repeats writing A1 on LCD each 10 ms (the main delay is 10 ms)
But when i write :
if(button(PIN_A1, 0, 50, 1, A1, 1)){
printf(lcd_putc,"\nA1");
}
After it fills the LCD's first 2 characters of each line with A1, this somehow waits for 3000 ms's to auto-repeat the function... Here is my whole code :
Code: |
#include <16f628A.h>
#Fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD
#use delay(clock=20000000)
#include <Flex_LCD420.c>
#include <stdlib.h>
#include <Button.c>
int8 A0 = 0; // For the button on pin A0
int8 A1 = 0; // For the button on pin A1
void main()
{
port_b_pullups(TRUE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x0F);
set_tris_b(0x80);
lcd_init();
delay_ms(100);
while(1)
{
if(button(PIN_A0, 0, 50, 1, A0, 1)){
printf(lcd_putc,"A0");
}
if(button(PIN_A1, 0, 50, 1, A1, 1)){
printf(lcd_putc,"A1");
}
output_toggle(pin_b7);
delay_ms(10);
}
} |
I assume it is something with the flex_lcd420 code but i've checked it, it has no delay in the lcd_gotoxy command...What can be the problem? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Sep 28, 2009 1:00 pm |
|
|
Quote: | if(button(PIN_A0, 0, 50, 1, A0, 1)){
printf(lcd_putc,"A0");
}
if(button(PIN_A1, 0, 50, 1, A1, 1)){
printf(lcd_putc,"A1");
|
First, change your auto-repeat value to a more reasonable number.
With a setting of '1', as above, your repeat rate is 100 times a second.
That's way too fast. Trying setting it to 20. This will give an auto-
repeat rate of 5 per second. That's small enough so you won't quickly
over-run the LCD line. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|