Curso tutorial del PIC16F877

hola erko , nunca he programado pics en programas que no sean mplab o proview 32 aunque este ultimo sea de atmel jaja pero por lo que yo he aprendido, ese error puede tener dos posibilidades:
1. Normalmente la librería de los pics se identifican con la matricula ejemplo: # include "pic16f877.h" en vez de # include "pic.h" y de ser este error, de ahi vienen los otros errores de deconocimiento de variables como RB0,RB1 etc. caxay?
2. Si tu librería es correcta, entonces debes checar que las rutas de los directorios esten configurados correctamente es decir, si la ruta de tu libreria h esta en c:\compilador\h y en las opciones tienes definida la ruta c:\users\desktop\compilador\h, nunca encontrara ni el pic.h ni todas las variables.
Espero sirva esta respuesta.
un saludo
 
primero que nada gracias por tu respuesta....

acabo de checar lo que me dices, si pongo "#include<pic16f877.h" al ultimo programa solo me aparece el siguiente error:

sdcc -mpic14 -p16f877 -V --debug -I/home/erko/Piklab/ -c Seca.c
Seca.c:67: error 20: Undefined identifier 'OPTION'
+ "/usr/bin/sdcpp" -nostdinc -Wall -std=c99 -I"/home/erko/Piklab/" -obj-ext=.o -DSDCC_MODEL_SMALL -DSDCC=270 -DSDCC_pic14 -D__pic14 -DSDCC_PROCESSOR="16f877" -I"/usr/bin/../share/sdcc/include/pic14" -I"/usr/share/sdcc/include/pic14" -I"/usr/bin/../share/sdcc/include" -I"/usr/share/sdcc/include" -I"/usr/bin/../share/sdcc/include/pic" -I"/usr/share/sdcc/include/pic" "Seca.c"
*** Salida con estado: 1 ***

haciendo referencia a OPTION de void ciclo (void), con lo que concluyo que las rutas de los directorios estas bien dirigidas (o eso creo yo).... alguien mas sabra por que....? mientras tanto sigo intentando con otros codigos... y nuevamente gracias fragmir....
 
Para resolver eso debes revisar la librería del pic16f877.h para buscar la variable option, si tu "identifier" es correcto, en la librería deberá aparecer declarado.
De no ser así deberás buscar el identificador correcto quiza es opt u options o algo así que se yo jeje pero de no ser así quiza estas omitiendo alguna librería que trae ese identificador
salu2
 
Saludos a todos, esta vez he subido un documento acerca de la primera practica que tuve en la materia de programación de sistemas en tiempo real donde se explica muy bien el uso de MPLAB, el documento fue escrito por el profesor David Arturo Gutiérrez Begovich al que le agradezco por todo lo que nos enseño a mis compañeros y a mi acerca de los PICs.

Hasta la próxima camaradas!!!
 

Adjuntos

  • prctica_1pdf_161.zip
    176.7 KB · Visitas: 553
PASOS EN MPLAB:

Bueno colegas aqui esta mas información para seguir con este tema, adjunto esta imagen que describe los
pasos a seguir en el MPLAB para crear un nuevo Programa espero ya hayan hecho su grabador
y tengan instalado el MPLab.

ademas de como Escribir Nuevo program MPLAB:

En esta imagen describo como se abre el editor de MPlab diran algunos que esto ya es mas que
ridiculo describir paso a paso pero creo que es conveniente ya que estoy seguro de hay nuevos
en el tema y se preguntaran como hacerle.
 

Adjuntos

  • escribir_nuevo_program_mplab_687.rar
    70.9 KB · Visitas: 296
Primeros ejemplos del TUTORIAL:

Estos son los primeros ejemplos del tutorial espero les agrade los hice con comentarios para
su mejor comprension empiezen a checar por orden ya que asi le entenderan mejor.

1.-Un bit x PORTC_16F877
2.-Puerto_B con 16F877
3.-Un bit ON-OFF x PUERTO C 16F877

Se que a lo mejor son sencillos para algunos pero creanme son la base del aprendizaje en PICS.
 

Adjuntos

  • primeros_ejemplos_del_tutorial_108.rar
    3.1 KB · Visitas: 383
USO del Sistema Minimo:

Esta imagen les ayudara a probar el pic con los ejemplos ya vistos claro antes tienen que grabar el
PIC con el Winpic800.
 

Adjuntos

  • sist_min877_130.jpg
    sist_min877_130.jpg
    29.9 KB · Visitas: 763
Hola soy nuevo y quisiera pedirles una ayuda con el manejo de tablas en microcontroladores PIC.

La verdad estuve unas nuevas funciones o algo parecido que no logro entendedr como trabajan.

movlw LOW(table_ram)
movlw HIGH(table_ram)
bueno no se como trabajkan high y low. Agradeceria su ayuda
Héctor Pita
 
gracias alejandro que checo la información que envie me hizo un comentario de un codigo que puse mal y ademas no entendia por que lo ponia ahi, si me equivoque en esa linea de codigo
la instruccion correcta es clrf portc y la explifcacion de esto es que antes de configurar los puertos pongo esta instruccion para que cuando se prenda el pic y realice su tarea no aparesca en el puerto información no deseada lo que muchos llaman (bits basura)

Aqui pongo el codigo donde me equivoque para que lo chequen y ademas les señalo donde fue.

;********************Un bit ON-OFF x PUERTO C 16F877.asm*****************
;***************************SNAKEWATHER****************************

;El Programa hace que en el puerto C del pic16f877 el bit #0 este presente un intermitancia
;RC0=prende y apaga.

;ZONA DE DATOS*************************************************

List P=16F877 ;En la zona de datos especifico el pic e incluyo la libreria a utilizar
;que contiene el mapa de memoria y especificaciones de dicho PIC.

#include<p16f877.inc>

PDel0 EQU 20h ;Estos son los registros para el retardo EQU nos dicen que equivalen
PDel1 EQU 21h ;a una direccion de memoria en nuestro caso 20 y 21h espacio libre
;en nuestro PIC del mapa de memoria (ver hoja de datos BANCO 0)

;ZONA DE CODIGOS (Aqui pongo las instrucciones para el pic)*****************

org 0x00 ;El programa comienza en la direccion 0 de la ;memoria de programa.

clrf PORTC

bcf STATUS,RP1 ;Se pone a uno el bit RP1 del registro status
bsf STATUS,RP0 ;Se pone a uno el bit RP0 del registro status
;con esto se selecciona el banco 1 del pic.
bcf TRISC,0 ;Se pone a cero el bit 0 del puerto C con ;esto el Bit 1 del Pto B esta configurado como ;salida.

bcf STATUS,RP0 ;Se pone a cero el bit RP0 del registro status
bcf STATUS,RP1 ;Se pone a cero el bit RP1 del registro status
;(seleccion del banco cero).


ON bsf PORTC,0 ;Pone un 1 logico en el bit cero del PTo B.
call RETARDO ;brinca a la rutina retardo
bcf PORTC,0 ;apaga el bit cero de Pto B
call RETARDO ;brinca a retardo
goto ON ;prendelo otravez.
 
Si, es muy fino. También hay que aprender a programar en C y montarlos en el PIC, porque a la larga nos va a solucionar muchos problemas, t sobre todo ahorrar tiempo...
 
carloscm dijo:
Bueno aqui les dejo un programa el cual prende todo el puerto b en ruleta, es decir que prende un led y esta va de izquierda a derecha y resgresa, espero les sirva creo que es un poco mas facil de entender, se los dejo a su consideracion
Código:
//                        CARLOS


#include <16F877.h>     // Def. el Micro a Usar
#fuses HS,NOWDT,NOPROTECT,NOLVP  // Config. de los fusibles
#use delay(clock=10000000)    // Velocidad Cristal
#int_rtcc  
                                                                   
void Ini_puertos()  // Procedimiendo Inicio el perifericos 
   {                                          
   output_high(PIN_B1);    // Activamos a "1" el Pin (Colocamos 5Volts ó "1"Logico)
   delay_ms(500);          // Retardo en miliSegundos    
   output_low(PIN_B1);    // Mandamos a Gnd (Cero Volts ó "0" Logico)
   delay_ms(500);        // Retardo en miliSegundos     
   output_high(PIN_B1);  // Activamos a "1" el Pin (Colocamos 5Volts ó "1"Logico)
   delay_ms(500);       // Retardo en miliSegundos    
   output_low(PIN_B1); // Mandamos a Gnd (Cero Volts ó "0" Logico)
   }

void main()                                     // Programa Principal
{
   Ini_puertos();                               // Mando a traer la funcion que inicia perifericos
  
   while(1)                                     // Ciclo infinito
   {        
   output_high(PIN_B0);    // Activamos a "1" el Pin (Colocamos 5Volts ó "1"Logico)                     
   delay_ms(1000);         // Retardo en miliSegundos                       
   output_low(PIN_B0);     // Mandamos a Gnd (Cero Volts ó "0" Logico)   

   
   output_high(PIN_B1);                        
   delay_ms(1000);                                  
   output_low(PIN_B1);                         
   
   output_high(PIN_B2);                        
   delay_ms(1000);                               
   output_low(PIN_B2);       
   
   output_high(PIN_B3);                        
   delay_ms(1000);                               
   output_low(PIN_B3);       

   output_high(PIN_B4);                        
   delay_ms(1000);                               
   output_low(PIN_B4);       
   
   output_high(PIN_B5);                        
   delay_ms(1000);                               
   output_low(PIN_B5);       
   
   output_high(PIN_B6);                        
   delay_ms(1000);                               
   output_low(PIN_B6);
   
   output_high(PIN_B7);                        
   delay_ms(1000);                               
   output_low(PIN_B7);

   output_high(PIN_B6);                        
   delay_ms(1000);                               
   output_low(PIN_B6);  
   
   output_high(PIN_B5);                        
   delay_ms(1000);                               
   output_low(PIN_B5);       
   
   output_high(PIN_B4);                        
   delay_ms(1000);                               
   output_low(PIN_B4);  
   
   output_high(PIN_B3);                        
   delay_ms(1000);                               
   output_low(PIN_B3);   
   
   output_high(PIN_B2);                        
   delay_ms(1000);                               
   output_low(PIN_B2);  
   
   output_high(PIN_B1);                        
   delay_ms(1000);                               
   output_low(PIN_B1);  
   }

}

si alguein quiere el .hex se los puedo enviar.
sigamos con las aportaciones

Esta es una forma de hacer lo mismo, pero con un código mucho más corto.
Dependiendo del compilador, los nombres de las variables pueden ser diferentes
pero lo que me interesa es proponer la idea de multiplicar o dividir por 2
para girar el bit del puerto.

1.- Para girar el bit a izquierda:

Código:
void main()                                     // Programa Principal
{
   Ini_puertos();   // Mando a traer la funcion que inicia perifericos
   PORTB=1;         // Activamos a "1" el Pin (Colocamos 5Volts ó "1"Logico) 
                    // PORTB es el nombre del registro completo (8 bits)
   while(1)  // Ciclo infinito
   { 
   delay_ms(1000);    // Retardo de 1 segundo

   PORTB *= 2;          // Corre el bit a IZQUIERDA

   if(PORTB==0)  PORTB=1;   // Para el caso de desborde
   }
}

2.- Para girar el bit a derecha:

Código:
void main()                                     // Programa Principal
{
   Ini_puertos();  // Mando a traer la funcion que inicia perifericos
   PORTB=1;        // Activamos a "1" el Pin (Colocamos 5Volts ó "1"Logico)
   while(1)  // Ciclo infinito
   { 
   delay_ms(1000);    // Retardo de 1 segundo

   PORTB /= 2;            // Corre el bit a DERECHA

   if(PORTB==0)  PORTB=128;  // Para el caso de desborde
   }
}

Espero que les resulte útil este pequeño aporte.

Saludos!
 
Ojala fuera visto este foro una semana antes, no saben lo que luche con este pic para un parcial! y saben porque? Estaba trabajando con un cristal de 10 MHz y tenia dos capacitores de 100 nF No se porque me confundí y coloque esos capacitores, pero como por arte de magia cuando coloque los de 15 pF todo funciono como debia ser :LOL:

Estaba viendo el manual que esta en la primera pagina (no se si ya lo editaron) que no tiene las recomendaciones según el cristal, de los capacitores a utilizar. Seria ideal que agregaramos esos pero en grande, para que otras personas no cometan mi error.. :rolleyes:

Bueno por ahí veo que están programando en C, pues yo también lo intenté y con otro programa llamado NIPLE pero mis profesores de microcontroladores I y II me dijeron que con estos no podrás controlar los ciclos de maquina exactos, al menos que después editaras. Bueno es algo difícil de explicar escribiendo pero por lo general trato de hacer mis códigos con mplab.

Saludos!
 
Bueno ya me presente, acá va mi primer aporte a la causa!

Yo tengo un impreso de 5 cms x 6 cms en el cual tengo mi PIC16F877A le coloque unos pines de salida y así de esta forma utilizar los que necesito en una portoboard o en otro impreso.

Lo hice en EAGLE y esta con plano a tierra para que no se demoren media hora con la baquela dentro del ácido :eek: dentro de la carpeta esta un pdf con el impreso, no se preocupen si ven unas lineas blancas, no se porque se ven asi, pero hagan un zoom y verán que no tiene nada.

Ojo si van a imprimir el pdf en un computador tienen que quitar una opción que tiene por defecto Adobe Reader. Cuando vayan a imprimir el pdf, HACEN LO SIGUIENTE: FILE, Print, una vez se abre la ventana buscan la opción "PAGE SCALING" abren una lista y colocan "NONE", una vez hecho esto si pueden imprimir con toda seguridad. Si no lo hacen y dejan que Adobe imprima con otra opción se va dañar todo la escala y todo va quedar mal.

PD. les coloque tambien el resto de archivos de EAGLE por si lo quiere editar.

Saludos!
 

Adjuntos

  • foros_16f877_146.rar
    103 KB · Visitas: 289
hola fidodido18 que bien que te integres al equipo sobre lo que comentas del cristal que utilisaste a mi me
funcionado con cristales de 4,10,15 y 20 MHZ ademas de los capacitores de 22 ó 30pF.

Pero fijate que todo lo que he programado la mayoria esta en enzamblador, en C no me gusta mucho para
aplicaciones muy sencillas y he notado que si haces un programa muy sencillo como prender y apagar leds
o algo por el estilo en C, el codigo del archivo .exe que se graba al PIC es mas grande que si lo hicieras en enzamblador por eso digo que es mejor utilizar C para aplicaciones mas extensas o laboriosas.

Y con respecto al Programa NIPLE mejor cambia ese Programa lo checque una ves y creeme para aplicaciones
mas exigentes no sirve genera un codigo muy extenso y hace al microcontrolador lento.

Bueno eso es todo nos vemos y saludos desde mexico ¡hay me saludas a las chicas de colombia estan
muy bien!
 
Muy bueno este foro, les comento que hasta ahora he programado el PIC 16F84A pero utilizando basic, utilizo un programa llamado JAL, pero les confieso que he intentado hacer ciertas cosas y no he podido, tambien he programado en C usando una herramienta llamada HI-TECH que se instala con el MPLAB y me funciona muy bien, estoy muy interesado en programar en ASM pero se me ha hecho complicado... pero estoy seguro que lo lograre...

Lo que he hecho es un robot que funciona con dos motores de paso y dos sensores opticos reflectivos y me funciona bien para seguir una línea... lo unico es que los motores son muy pequeños y no mueven el robot muy bien... pero en cuanto a programacion esta bien... me Construí un programador, el JDM que es por puerto serie y me funciona bien...
 
hola snakewather, gracias por la bienvenida, pues si vengo con ganas de aportar al foro, ahora mismo estoy haciendo un convertidor analógico digital pero este tiene la facultad de filtrar el ruido, ahora que lo termine se los muestro por si acaso a alguien le sirve.

picrocker hiciste el proyecto del robot con el 16f84a? por ahí vi que estaban haciendo un concurso en una universidad de hacer un robot que pasara por un laberinto siguiendo una linea, y además fuera recogiendo unas latas en el camino, algo interesante si te das cuenta que ya hiciste una parte...
 
Se ve muy interesante... mas o menos es lo que busco hacer, estoy esperando que me llegen unos servos motores que encargue para reemplazar los steppers que utilizo para mover las ruedas y con estos steppers realizar algun mecanismo para recoger objetos...
 
hola amigos:
Bueno, estamos en un hilo de aprender. Cualquier aporte será estupendo
pero creo que deberia ceñirse al 16f87x.
si alguien tiene algún proyecto que quisiera desarrollar, entre todos podriamos aportar algo.
recomiento como entorno de trabajo el PROTEUS. Y así poder seguir la evolucion antes de grabar.
saludos y que n decaiga.
 
Atrás
Arriba