Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Curso tutorial del PIC16F877


       



#51  Ejemplos del tutorial
snakewather
Ubicación: mexico
Registrado: 31 Ene 2007
Mensajes: 31
citar
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.
Archivos Adjuntos

Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#52  Sistema minimo para los ejemplos
snakewather
Ubicación: mexico
Registrado: 31 Ene 2007
Mensajes: 31
citar
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.
Archivos Adjuntos

Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#53  
hhpp
Registrado: 02 Abr 2006
Mensajes: 12
citar
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

#54  Correccion de los ejemplos del tutorial
snakewather
Ubicación: mexico
Registrado: 31 Ene 2007
Mensajes: 31
citar
gracias alejandro que checo la informacion 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 informacion 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.

#55  
PedroPotter
Ubicación: Venezuela
Registrado: 15 Sep 2008
Mensajes: 1
citar
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...

#56  
Alejandro Sherar
Ubicación: Va. Martelli, Bs. As., Argentina
Registrado: 07 Abr 2008
Mensajes: 709
citar
carloscm escribió: 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: Seleccionar todo

//                        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: Seleccionar todo
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: Seleccionar todo
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!


Ultima edición por Alejandro Sherar el 04 Nov 2008, 12:32 pm, editado 1 vez

#57  Hola a todos
fidodido18
Ubicación: Barranquilla, mi COLOMBIA
Registrado: 13 Abr 2006
Mensajes: 45
citar
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 Surprised 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 Laughing

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.. Rolling Eyes

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!

#58  MI PRIMER APORTE
fidodido18
Ubicación: Barranquilla, mi COLOMBIA
Registrado: 13 Abr 2006
Mensajes: 45
citar
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 Shocked 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!
Archivos Adjuntos

Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#59  Que cristal usar
snakewather
Ubicación: mexico
Registrado: 31 Ene 2007
Mensajes: 31
citar
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!

#60  
picrocker
Ubicación: Venezuela
Registrado: 25 Jul 2008
Mensajes: 29
citar
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...

 Responder



 Otros temas de interés 
No hay mensajes nuevos Destacado: Programas de simulación y diseño de circuitos electrónicos
No hay mensajes nuevos chip PWM especifico
No hay mensajes nuevos Problema generado por programas Spyware y Adware
No hay mensajes nuevos Cargador para auto para IPOD ESPECIFICO
El tema está cerrado y no puedes editar mensajes o responder Programas de diseño de circuitos impresos

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||
Contacto | Acerca de | Ayuda | Normas de la Comunidad | Privacidad | Mapa de los foros
© Foros de Electrónica - Comunidad Internacional de Electrónicos