TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
22 de Septiembre de 2014, 21:16:07

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
349006 Mensajes en 39150 Temas por 40812 Usuarios
Último usuario: benjhyjordan
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  interrupciones adc y kbd pic16f877a en PIC C
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: interrupciones adc y kbd pic16f877a en PIC C  (Leído 3705 veces)
gregory2321
PIC10
*
Desconectado Desconectado

Mexico Mexico

Mensajes: 2


« : 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:

#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;
   }
 }
En línea
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4501

MLO


« Respuesta #1 : 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  Confused ...

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

Saludos
En línea

El papel lo aguanta todo
gregory2321
PIC10
*
Desconectado Desconectado

Mexico Mexico

Mensajes: 2


« Respuesta #2 : 26 de Febrero de 2010, 11:47:51 »

Hola
Muchas por responder tan pronto, mi código con el adc está aquí
Código:

#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.
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.09 segundos con 23 consultas.
anything