Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

16/02/2015 #1


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.
16/02/2015 #2


son proyectos independientes?
16/02/2015 #3

Avatar de pandacba

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
17/02/2015 #4


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.

---------- Actualizado después de 3 minutos ----------

Hola Pandacba
Gracias por el consejo deberdad estoy enredado
17/02/2015 #5

Avatar de pandacba

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
17/02/2015 #6


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.
17/02/2015 #7


gracias muchachos

voy ha comenzar encender un led con el numero 1 del teclado matricial.
y voy a investigar como funciona el PIC_Wizard.
17/02/2015 #8


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;
      }
}

}
Archivos Adjuntos
Tipo de Archivo: rar teclado.rar (50,9 KB (Kilobytes), 5 visitas)
17/02/2015 #9


en que programas yo puedo ayudarte
17/02/2015 #10


en el compilador ccs
17/02/2015 #11


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.
17/02/2015 #12


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.
17/02/2015 #13
Moderador

Avatar de D@rkbytes

yenz dijo: Ver Mensaje
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:
Código 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)
   {
      
kbd_getc();
      
      if (
k!=0)
         switch(
k)
         {
         
         case 
'1':
            
funcion_led_azul();
            break;    
// Brake ya no se coloca al final de la selección.
         
}
   }

18/02/2015 #14


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.



19/02/2015 #15


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?.
19/02/2015 #16
Moderador

Avatar de D@rkbytes

miglo dijo: Ver Mensaje
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.
20/02/2015 #17


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.
21/02/2015 #18
Moderador

Avatar de D@rkbytes

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.)
Código PHP:
void estado_de_pin(int8 pinint1 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)
Código PHP:
void estado_de_pin(int8 pinint1 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 pinint1 estado)
{
   if(!
estado)
      
output_low(pin);
   else
      
output_high(pin);

Como función sin declarar o definir. (Está en la cabecera del programa.)
Código 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)
Código 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":
Código PHP:
int1 estado_de_RA0()
{
   return 
input_state(PIN_A0);

21/02/2015 #19


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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.