Autor Tema: interrupciones adc y kbd pic16f877a en PIC C  (Leído 4429 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gregory2321

  • PIC10
  • *
  • Mensajes: 2
interrupciones adc y kbd pic16f877a en PIC C
« en: 25 de Febrero de 2010, 14:35:34 »
Saludos

Lo que quiero hacer es un control pi para temperatura, e introducir la temperatura de referencia con un teclado matricial, esto se deberia comparar con la lectura del adc del pic. Mi pregunta es como introducir estas dos interrupciones en el pic16f877a, ya tengo la del teclado pero no funciona bien cuando introduzco el adc, si alguien pudiera ayudarme se los agradeceria mucho.

Mi codigo para obtener los datos del teclado es el siguiente:

Código: [Seleccionar]

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=20000000)                          //Fosc=4Mhz
#include <kbd4x4.c>                                 //libreria manejo keypad
#include <lcd420_2.c> 
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2                                   
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

void usuario(void);
int a;

signed char i;
boolean var=0;

void main(void)
 {
  inicio:
  lcd_init();
  a=kbd_getc();             
  usuario();
  goto inicio;
 
 }
void usuario(void)
 {
  uno:
  lcd_putc("\fCOLOQUE DATO\n");
  for(i=0; ;i++)
   {                               
    do{a=kbd_getc();
      }while(a==0);               
    lcd_putc(a);
                         
      if(a=='A')                   
      {
     lcd_putc("\fREINICIANDO" );
     delay_ms(500);
     lcd_putc("/f");
     var=1;
     goto uno;
     }
     var=0;
   }
 }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4570
Re: interrupciones adc y kbd pic16f877a en PIC C
« Respuesta #1 en: 25 de Febrero de 2010, 21:22:35 »
Hola.

Si vas a usar 20MHz, cambia el fusible XT por HS.

Los #define de la LCD, van antes del archivo de cabecera.

Si vas a usar el teclado por el puerto B, debes activar la resistencias de pullup internas.

Evita usar los GOTO.

No veo la rutina del ADC por ningun lado  :? ...

El uso de los teclados y las LCDs es un tema muy difundido en el foro, usa el buscador ;-)

Saludos
El papel lo aguanta todo

Desconectado gregory2321

  • PIC10
  • *
  • Mensajes: 2
Re: interrupciones adc y kbd pic16f877a en PIC C
« Respuesta #2 en: 26 de Febrero de 2010, 11:47:51 »
Hola
Muchas por responder tan pronto, mi código con el adc está aquí
Código: [Seleccionar]

#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)                          //Fosc=4Mhz
#include <kbd4x4.c>                                 //libreria manejo keypad
#include <lcd420_2.c> 
                                 
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

int a,vi;
float ab,b;
signed char i;
boolean var=0;

   #INT_AD
   void  AD_isr(void)
   {
   ab=read_ADC(ADC_READ_ONLY);
   vi=TRUE;
   Read_ADC(ADC_START_ONLY);
   }

void main()
{
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   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(INT_AD);
   enable_interrupts(GLOBAL);
   set_adc_channel(0);
   
   vi=FALSE;
   lcd_init();
   read_ADC(ADC_START_ONLY);
   a=kbd_getc();
  while(TRUE)
 {
  if (vi==TRUE)
  {
   b=ab;
   b=(b/1023)*500;
   //do{a=kbd_getc();
     // }while(a==0);
   a=kbd_getc();   
   lcd_gotoxy(1,1);
   lcd_putc("\fTemp. elegida\n");
   lcd_gotoxy(1,3);
   lcd_putc("Temp. actual:");
   lcd_gotoxy(1,4);
   printf(lcd_putc,"%1.2f",b);
   lcd_gotoxy(10,4);
   lcd_putc("grados");
   lcd_gotoxy(1,2);
   lcd_putc(a);
   lcd_gotoxy(10,2);
   lcd_putc("grados");                         
}
 }
}


Mi problema es que no puedo hacer que ambos funcionen correctamente al mismo tiempo, ya que de momento quisiera observar dos digitos enteros leidos del teclado y el valor del adc, y que este se actualice tan pronto cambie. Ya desactive los pullups.


 

anything