View previous topic :: View next topic |
Author |
Message |
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
HELP with KBD |
Posted: Tue Oct 02, 2007 1:15 pm |
|
|
Hey all.. I've been having some problems when using kbd.c and PIC16F876A with a LCD display on portB and the kbd on portC.
I have altered the LCD.C so that it'd be like this
#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81
#else
//#byte kbd = 0xF83
#byte lcd =0xF87
#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)
#byte kbd = 7 // on to port C (at address 7)
#endif
#endif
#if defined use_portb_kbd
#define set_tris_kbd(x) set_tris_b(x)
#else
//#define set_tris_kbd(x) set_tris_d(x)
#define set_tris_kbd(x) set_tris_c(x)
#endif
But it gets totally crazy when I put it to work.
I have got the example code in order to test, so it's just this:
Code: |
#include <16F876.h>
#fuses RC, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP
#use delay(clock=4000000) //Seta o Clock do PIC
#include "LCD.C"
#include "KBD.C"
#byte port_b=6
#byte port_c=7
void main() {
char k;
lcd_init();
kbd_init();
lcd_putc("\fReady...\n");
while (1)
{
k=kbd_getc();
if(k!=0)
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
}
}
|
When I program the PIC and turn it on, it just keeps on printing tons of numbers and #'s randomly and sometimes even seems to reset itself, even with all configuration bits checked.
My keypad, as I could understand, follows the "black keypad" pattern so I even commented the other pattern on the code.
Does anybody knows how to solve this problem?[/code]
Last edited by rina_1220 on Tue Oct 02, 2007 2:07 pm; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 02, 2007 1:35 pm |
|
|
You need to add external pull-up resistors on the Row pins of the keypad.
You can use 10K ohm resistors. |
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Tue Oct 02, 2007 1:44 pm |
|
|
I've tried that. It won't work |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 02, 2007 1:55 pm |
|
|
My advice is to use the Flex drivers from the CCS code library.
With these drivers, you can configure the driver just by changing
the #define statements for the pins at the start of the driver source file.
Flex LCD driver:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661
Flex Keypad driver:
http://www.ccsinfo.com/forum/viewtopic.php?t=26333
You will still need to add a pull-up resistor (10K) to the keypad
on each of the Row pins.
If you still can't make it work after doing that, then post the
information on your keypad: Manufacturer, part number, and a link
to the data sheet. |
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Wed Oct 03, 2007 5:57 am |
|
|
I still get the same crazy thing happening.
The worst part of it is that I don't even know who the manufacturer of the keypad is. All I know is that i have something like this
pins: 7 6 5 4 3 2 1
and that they are related to rows and columns like this
pin #
1 -> row 3
2 -> row 2
3 -> row 1
4 -> row 0
5 -> col 0
6 -> col 1
7 -> col 2 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 03, 2007 10:39 am |
|
|
Quote: | I've been having some problems when using kbd.c and
PIC16F876A with a LCD display on portB and the kbd on portC.
#include <16F876.h>
|
I just noticed something. In your post, you say you're using 16F876A,
but in your code, the include file is 16F876.H. What's the reason for this ?
The .H file must be the correct one for the PIC. Also, the programmer
must be setup for the correct PIC. This is important.
Code: | #fuses RC, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP
#use delay(clock=4000000) |
In the code above, you're using RC oscillator mode. Do you have an
external resistor and capacitor connected to the OSC1 pin on the PIC ?
What are the values of those components ? |
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Thu Oct 04, 2007 5:44 am |
|
|
Hey sorry...
That was an old version of the code. I've already changed the .H and checked the programmer. And so far I'm not using an RC oscillator anymore. I have now a 4MHz crystal on pins OSC1 and OSC2.
Still, the program is not working as i expected.
I am gonna check all the connections. I guess the keypad is not well connected and that could cause my problem.
Thank you for all your help
anyway, the code now just looks like this
Code: |
#include <16F876A.h>
#fuses XT, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#include "LCD.C"
#include "KBD.C"
#byte port_b=6
#byte port_c=7
void main()
{
char k;
lcd_init();
kbd_init();
lcd_putc("\fReady...\n");
while (1)
{
k=kbd_getc();
if(k!=0)
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
}
}
|
|
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Fri Oct 05, 2007 5:58 am |
|
|
well... I've checked all the connections and it was all right. Nothing helped anyway.
I have MPLAB 7.6 and PCWH compiler version 4.013
I do not know what else to do. |
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Tue Oct 09, 2007 7:55 am |
|
|
anyone? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 09, 2007 10:32 am |
|
|
Quote: | #include "LCD.C"
#include "KBD.C" |
What drivers are these ? Are they the CCS drivers or the Flex drivers ?
What are the pin assignments (that you are currently using) for the
keypad and the LCD ? |
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Tue Oct 09, 2007 10:42 am |
|
|
These are the flex drivers.
But I get the same errors with the CCS ones.
my pin assignments are:
Code: | //Keypad connection:
#define col0 PIN_C0
#define col1 PIN_C1
#define col2 PIN_C2
#define row0 PIN_C4
#define row1 PIN_C5
#define row2 PIN_C6
#define row3 PIN_C7 |
and
Code: | //LCD connection
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_E PIN_B0
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2 |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 09, 2007 11:17 am |
|
|
I tested this on a PicDem2-Plus board. I don't have a 16F876A, so I
used a 16F877A. I don't have vs. 4.013, so I used 4.014 which is the
nearest version that I do have. Also, I didn't use your pins, because
it would take me too long to solder in some pull-up resistors on the row
pins of the keypad on Port C. I used Port B instead, because then I
can turn on the built-in pullups in the PIC, with this line of code:
Code: | port_b_pullups(TRUE); |
It worked. It displays "Ready..." and then it displays characters on
the LCD as I press the keys on the keypad.
Because I'm using pins B6 and B7 for the keypad, I made sure that
the ICD2 connector was unplugged from the board before I tried to
run the program. The ICD2 uses pins B6 and B7, which are used for
row2 and row3, below. That's why it needs to be unplugged.
Code: |
// Keypad connections:
#define col0 PIN_B0
#define col1 PIN_B1
#define col2 PIN_B2
#define row0 PIN_B4
#define row1 PIN_B5
#define row2 PIN_B6
#define row3 PIN_B7 |
LCD connections. These are for the "original" PicDem2-Plus board.
(Not the new "Rohs" version).
Code: |
#define LCD_DB4 PIN_D0
#define LCD_DB5 PIN_D1
#define LCD_DB6 PIN_D2
#define LCD_DB7 PIN_D3
#define LCD_E PIN_A1
#define LCD_RS PIN_A3
#define LCD_RW PIN_A2
#define USE_LCD_RW 1 |
Code: |
#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#include "Flex_LCD_pdp.C"
#include "Flex_KBD_pdp.C"
// These two lines below are not needed.
#byte port_b=6
#byte port_c=7
void main()
{
char k;
lcd_init();
kbd_init();
port_b_pullups(TRUE); // Needed for the keypad row pins
lcd_putc("\fReady...\n");
while (1)
{
k=kbd_getc();
if(k != 0)
if(k =='*')
lcd_putc('\f');
else
lcd_putc(k);
}
} |
|
|
|
rina_1220
Joined: 02 Oct 2007 Posts: 20
|
|
Posted: Tue Oct 09, 2007 11:32 am |
|
|
Hey, Thank you!
I've made the changes according to what you said and its working now.
I still didn't understand why it didn't work in port c with external resistors, but now its working ok.
thank you very much! |
|
|
|