Problema con proyecto de sistema de control pic 16f877a

hola comunidad Foros de Electrónica tengo que realizar un proyecto para mi universidad para graduarme técnico en electrónica.
Consiste en un sistema de control con el pic 16f877a, lcd, teclado matricial, para controlar y revisar 8 entrada análogas,8 salidas digitales una salida análoga eso implica realizar un menú de opciones ejecutado por el teclado matricial e investigado mucho pero hasta ahora no me funciona muy bien.

Comencé realizando un ejemplo que encontré por Internet le modifique cambiándole el pic por el 16f877a le puse lcd, teclado matricial 3x4 y la programación en c y como lo esperaba no me funciono.

Les envió el código fuente con el que empece atrabajar el que modifique y la salida analógica que quiero dotar a mi pic que la encontré por Internet.
 

Adjuntos

  • Proyecto fuente.rar
    242 KB · Visitas: 19
  • newproyec.rar
    83 KB · Visitas: 15
  • Salida analogica.rar
    18.2 KB · Visitas: 14
Última edición:
Porque no arrancaste con el proyecto tal como estaba, por que para todos los cambios que hiciste era más sencillo y seguro empezar de cero
 
Hola luis
- 1 es un ejemplos
- 2 lo modifique cambiándole pic poniéndole lcd teclado no funciono.
- 3 es un ejemplo para dotar el pic de una salida analógica.

lo que necesito es controlar 8 entradas analógicas, 8 salidas digitales y dotar mi pic de una salida analógica eso sea visualizado en lcd con un menú de opciones controlado por un teclado matricial 4x3.



Hola Pandacba
Gracias por el consejo deberdad estoy enredado
 
Última edición:
Si tratas de hacer funcionar el proyecto original, una vez logrado esto vas introduciendo los cambios uno a uno, es decir introduces un cambio y lo depures hasta que funcione bien, luego sigues del mismo modo con el próximo, de esa manera es más fácil ubicar errores y corregirlos y poder llegar a buen puerto
 
Por lo que veo LCD.C no está en la misma carpeta que el archivo principal de código, por lo menos lo que yo veo en el rar, si es así no creo que funcione.

Para cambiar el código de un pic a otro a parte de cambiar el nombre del pic en el include hay que revisar que FUSES tiene para que la configuración sea correcta.

Por otro lado hay que tener en cuenta que el archivo LCD.C esté hecho o modificado para ese pic, ya que puede ser que esté hecho para un pic que tenga otra distribución de pines y no te funcione.

Yo revisaría estos archivos y si estás trabajando con PCW empezaría el programa desde cero utilizando el PIC_Wizard para configurar fácilmente los parámetros de ese PIC en concreto.
 
Hola.
Con el PIC16F877A y el teclado, no pude encender un led.
¿Me ayudan a saber dónde tuve el error?

Código:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4M)
#include <stdlib.h>

#include <kbd.c>
#define use_portb_kbd TRUE

#use standard_io(B)
#use standard_io(D)

#define  LED_AZUL  PIN_D0

CHAR k;

void funcion_led_azul(){
output_toggle(LED_AZUL);

if (input_state(LED_AZUL));

 }

void main () {
  kbd_init();
  port_b_pullups(TRUE);
 
  output_low(LED_AZUL);

  for(;;){
  k = kbd_getc();
  if (k!=0)
         switch(k){
         
         case '1': funcion_led_azul();
         break;
      }
}

}
 

Adjuntos

  • teclado.rar
    50.9 KB · Visitas: 7
Última edición por un moderador:
yenz creo que un error es que no has declarado la funcion "funcion_led_azul" al pricipio, esta es una de las cosas que aprendido con la ayuda de D@rkbytes, tienes que poner --void funcion_led_azul(void);--, lo que me estraña es que el compilador no te indique error.
 
Gracias, pero realicé el cambio y no funcionó.
S
erá que es de otra manera prender un led con el teclado matricial.

Cuando le coloco el ";", genera error.
 
Última edición por un moderador:
Gracias, pero realicé el cambio y no funcionó.
S
erá que es de otra manera prender un led con el teclado matricial.

Cuando le coloco el ";", genera error.
Mira lo que tienes mal en tu programa del post #8:
#define use_portb_kbd TRUE, se escribe antes de incluir la librería "kbd.c"

La librería stdlib.h, no se está usando.

#use standard_io(B) y #use standard_io(D) No son necesarios en este programa.

if (input_state(LED_AZUL)); No se usa de esta manera.
Se debe usar de la siguiente forma, por ejemplo:
int1 estado;
estado = input_state(PIN_XX);


Programa corregido:
PHP:
#include <16f877a.h>
#use     delay(crystal = 4MHz)

#define use_portb_kbd TRUE
#include <kbd.c>


#define  LED_AZUL  PIN_D0

void funcion_led_azul()
{
   output_toggle(LED_AZUL);
}

void main () 
{
CHAR k;

   kbd_init();
   port_b_pullups(TRUE);
 
   output_low(LED_AZUL);

   while (true)
   {
      k = kbd_getc();
      
      if (k!=0)
         switch(k)
         {
         
         case '1':
            funcion_led_azul();
            break;    // Brake ya no se coloca al final de la selección.
         }
   }
}
 
Gracias a todos los interesados por colaborar en mi proyecto.

Y gracias D@rkbytes te agradezco como ayudas a las personas como me colaboraste arreglando mi código en el que voy a seguir trabajando hasta lograr terminar mi proyecto de grado.

(y)

:)
 
D@rbytes te hago la siguiente pregunta, no deveria haberse declarado la funcion funcion_led_azul();?, ya que la llamas desde el "case" pero no esta declarada, si no es asi me puedes explicar el por que?.
 
D@rbytes, te hago la siguiente pregunta: ¿No debería haberse declarado la función funcion_led_azul();
Ya que la llamas desde el "case" pero no esta declarada. ¿Si no es así, me puedes explicar el por qué?
Cuando las funciones o subrutinas se encuentran arriba del main, no hace falta.
Sólo se declaran cuando están abajo del void main.

En ese programa la subrutina funcion_led_azul(); se encuentra arriba del main, por eso no es necesario declararla.

Cuando es una función, retorna algún valor y cuando es subrutina, no.
 
ajammm, gracias por la explicacion pero pecando de ser un poco cansado ¿como se valora la decision de que una funcion o subrutina vaya encima o debajo del main? ya que visto asi se podria haber puesto esa subrutina despues del main y entonces si que se hubiese tenido que declarar verdad?.
Te importaria poner 2 ejemplos para que termine de entender el concepto, uno con funcion y el otro con subrutina, si no es mucho pedir claro esta, gracias de paso.
 
Es por comodidad escribir las funciones, subrutinas o procedimientos en la parte de arriba, porque de esta manera ya no hay necesidad de declararlas en la cabecera del programa.
En lenguaje ensamblador si es importante la locación de la mismas, pero en C que es de alto nivel y ya que el compilador realiza mucho trabajo por uno, no hay problema.

Y como mencionas, si la función estuviera abajo del main sin ser declarada o definida, el compilador daría un error indicando que no se ha definido la función llamada.
Y al hacer doble click sobre el error, el editor se coloca sobre la línea del error.

Sobre los ejemplos, no es nada complicado:

Con subrutina sin declarar o definir. (Está en la cabecera del programa.)
PHP:
void estado_de_pin(int8 pin, int1 estado)
{
   if(!estado)
      output_low(pin);
   else
      output_high(pin);
}


void main (void)
{

   while (true)
   {
      estado_de_pin(pin_a0,1);
      delay_ms(1000);
      estado_de_pin(pin_a0,0);
      delay_ms(1000);
   }
}
Con subrutina declarada o definida: (Fuera de la cabecera del programa y abajo del main)
PHP:
void estado_de_pin(int8 pin, int1 estado);


void main (void)
{

   while (true)
   {
      estado_de_pin(pin_a0,1);
      delay_ms(1000);
      estado_de_pin(pin_a0,0);
      delay_ms(1000);
   }
}

void estado_de_pin(int8 pin, int1 estado)
{
   if(!estado)
      output_low(pin);
   else
      output_high(pin);
}
Como función sin declarar o definir. (Está en la cabecera del programa.)
PHP:
int1 estado_de_RA0()
{
   int1 x = input_state(PIN_A0);
   return x;
}

void main (void)
{
   int1 estado;


   while (true)
   {
      estado = estado_de_RA0();
      
      if(estado)
         output_high(PIN_B7);
      else
         output_low(PIN_B7);
   }
}
Como función declarada o definida: (Fuera de la cabecera del programa y abajo del main)
PHP:
int1 estado_de_RA0();


void main (void)
{
   int1 estado;


   while (true)
   {
      estado = estado_de_RA0();
      
      if(estado)
         output_high(PIN_B7);
      else
         output_low(PIN_B7);
   }
}
      
int1 estado_de_RA0()
{
   int1 x = input_state(PIN_A0);
   return x;
}
También se puede usar directamente sin la variable "x":
PHP:
int1 estado_de_RA0()
{
   return input_state(PIN_A0);
}
 
D@rbytes te devo una, jejeje, un dia de estos cuando vengas por españa que te quede claro que tienes unas cuantas cervecitas por la cara gratis, y es mas, habitacion tambien, joer que pelota soy, bromas a parte, aunque lo dicho es verdad, que agradecido estoy con tus explicaciones y te vuelvo a repetir que importantes sois las personas como tu, no te puedes ni imaginar la ayuda que prestais, gracias D@rkbytes por estar hay.
Posdata: entendido muy bien tu explicacion, todo sea que dentro de 4 dias se me olvide, jejeje, espero que no.
 
Última edición:
Atrás
Arriba