CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

ADC / Keypad help

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
pretyh8machin



Joined: 18 Oct 2011
Posts: 4

View user's profile Send private message

ADC / Keypad help
PostPosted: Mon Nov 07, 2011 1:56 am     Reply with quote

Hey CCS forum users,
So I have been working on this project for class where I have to control the direction of a motor using a H-bridge circuit connected to with my PIC. I have a keypad that input that changes these values just fine. I broke down my code into sections so I can determine where I am getting any errors or problems with the code. I got my ADC to display a value on my LCD too so I know my ADC is working fine also. For some reason when I combined the code altogether I found out that as soon as I initialized my adc converter my keypad stopped responding. I couldn't figure out why. Heres my code:

Code:

#include <18f4580.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, HS, MCLR   
#use delay(clock=8000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

#include <flex_kbd.c>
#include <flex_lcd.c>

#define BRAKE PIN_C4
#define DIRECTION PIN_C5

//!#int_rda
//!
//!void rda_isr(void)
//!{
//!   lcd_init();  // Always call this first.
//!   kbd_init();
//!   long value1;
//!   setup_port_a(ALL_ANALOG);
//!   setup_adc(adc_clock_internal);
//!   setup_ccp1(CCP_PWM);
//!   setup_timer_2(T2_DIV_BY_1, 127, 1);
//!   set_adc_channel(0);
//!   delay_us(10);
//!   value1=read_adc();
//!   lcd_gotoxy(1, 1);
//!   printf(lcd_putc,"\f%2X ", value1);
//!   set_pwm1_duty(value1);
//!   delay_ms(100);
//!}

void housekeeping();
void startmenu();
void optionbegin();
void displaybegin();
void menudisplay();
void operation();
void adc();

long value1;

void main() {
housekeeping();
//enable_interrupts(INT_RDA);
//enable_interrupts(GLOBAL);
setup_port_a(ALL_ANALOG);
setup_adc(adc_clock_internal);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_1, 127, 1);
//startmenu();
//menudisplay();
//adc();
operation();
}

void housekeeping(){
   lcd_init();  // Always call this first.
   kbd_init();
   output_high (BRAKE);
}

void startmenu(){
   displaybegin();
   optionbegin();
}

void displaybegin(){
   lcd_putc( "\fPress 1 to begin");
}

void optionbegin(){
   char enter;
   int i=0;

   while (i!=1){
   enter=kbd_getc();
   if (enter=='1') {
         i=1;
      } else {
         i=0;
      }
   }
}
   
void menudisplay(){
   int i;
   lcd_gotoxy(1, 1);
   lcd_putc( "\fPress '1'\n");
   lcd_gotoxy(1, 2);
   lcd_putc( "to start brake");
   delay_ms(1000);
   lcd_gotoxy(16, 2);   

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      }

   lcd_gotoxy(16, 1);

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      }

   lcd_gotoxy(1, 1);
   lcd_putc( "\fPress '2'\n");
   lcd_gotoxy(1, 2);
   lcd_putc( "to stop brake");
   delay_ms(1000);
   lcd_gotoxy(16, 2);   

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      }

   lcd_gotoxy(16, 1);

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      }

   lcd_gotoxy(1, 1);
   lcd_putc( "\f'3' and '4'\n");
   lcd_gotoxy(1, 2);
   lcd_putc( "change direction");
   delay_ms(1000);
   lcd_gotoxy(16, 2);   

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      }

   lcd_gotoxy(16, 1);

   for(i = 0; i < 20; i++)
      {
       printf(lcd_putc," \b\b");
       delay_ms(150);
      } 
}
     
void operation(){
   char k;
//!   value1=read_adc();
//!   set_pwm1_duty(value1);
//!   lcd_putc( "\fPress '1'\n");
   while (TRUE){
         k=kbd_getc();
         if(k!=0){
            if(k=='2')
            output_low (BRAKE);
            if(k=='1')
            output_high (BRAKE);
            if(k=='4')
            output_low (DIRECTION);
            if(k=='3')
            output_high (DIRECTION);
            }
}
}

void adc(){
   setup_port_a(ALL_ANALOG);
   setup_adc(adc_clock_internal);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1, 127, 1);
}

I commented out the irrelevant sections because thats just a menu display. Any help is appreciated. Thnx in advance. The Keypad works up until I initialize the ADC.
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Mon Nov 07, 2011 3:22 am     Reply with quote

The 'key thing' you have not shown, is the start of the flex_kbd driver, defining which pins are used for the keypad.
Don't initialise the ADC at multiple places. Do it _once_, either at the start of main, or in an init routine. Then 'think'. What ADC pins are you using? (again you don't say). Does it make sense to setup _all_ the ADC pins (on your chip that means AN0 to AN10, the whole of portA, and B0,B1 & B4). If any of these pins are are used as digital inputs, they _won't_ function after this is done....
I'd guess at least one of these pins is being used for the keypad....
Since you only seem to be reading AN0, use

setup_adc_ports(AN0);

Also, at your clock rate, ADC_CLOCK_INTERNAL, is _not_ recommended look at table 19-1 in the data sheet, and use:

setup_adc(ADC_CLOCK_DIV_16);

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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