Curso tutorial del PIC16F877

me parece buena la idea de este curso ya q estoy estydiando microcontroladores y me ha tocado trabajar con este pic 16f877 y he podido ver lo completo y facil de maniobrar q es
 
Camara bros!
Este tema me ha llamado la atención y y también me ha emocionado, puesto que yo estudie este pic en la escuela, aunque solo fue ensamblador y es mi primer contacto con los PICs por lo tanto no se aun de todo lo que son capaces.
El Internet me ha ofrecido mucha información y por todo eso siento la necesidad de regresar algo a la comunidad y por eso me apunto pa contribuir en este "tuto".
Pero la neta no se desde donde comenzar, deberia de comenzar desde lo básico?, en el documento de snakeW vi que ha explicado como esta integrado el 877 la conexion del reset y del cristal y tambien explico el set de instrucciones.
Pero pues para ocupar los pics es necesario saber utilizar el sistema binario y el hexadecimal, también saber las funciones lógicas, los diferentes tipos de memoria, lo que son la pila, los registros de uso general y específicos, el acumulador, el contador de programa, las banderas.... etc, etc. Todos saben que es eso? debería de tratar de explicarlo? o deberia de comenzar un poco mas adelante?
A los iniciados en los PICs (igual para todos) les pido su opinión
 
Hola de nuevo, aquí les dejo mi primer contribución del tuto.
Pero pa que sigan este tuto es indispensable que comienzen a conseguir un PIC16F877/A, algún quemador de pics para 40 pines con su respectivo software o controlador, el MPLAB (Windows) o el PikLab (Linux), una protoboard y el respectivo material para armar los circuitos requeridos o armar una tarjeta entrenadora.

Aun no comenzare con practicas, apenas con la teoría así que tienen tiempo pa conseguir lo necesario.

Pa los que ya saben de PICs espero que corrijan mis equivocaciones.

Hasta la próxima compas.

Nota: El archivo fue hecho en OpenOffice espero que pueda ser abierto correctamente en Word.
 

Adjuntos

  • configuration_word_190.doc
    237 KB · Visitas: 652
Pues nadie a comentado nada pero de todos modos seguiré subiendo documentos ya que me sirve de repaso.

Ahora el documento se trata del registro STATUS y repasaremos el set de instrucciones, además se ven unas cuantas cosillas más que siempre es bueno saber.
Tal vez en el siguiente documento se vea un programa de ejemplo.

Si alguien tiene dudas de lo que presento por favor notifiquenlo en este foro.

Hasta luego!
 

Adjuntos

  • set_de_instrucciones_787.doc
    268 KB · Visitas: 472
Hola "sangreaztk":
Veo que lo que has subido hasta ahora es para toda la familia 16X87X.
Está bueno tener lo básico a la vista.
Te comento que ando con el 876 pero pienso incursionar en el 877 en mi camino
hacia algo más potente.
Cuando entres en la parte específica del 877 seguro te seguiré más de cerca.
Por ahora ya me suscribí a este tema.
Saludos.
 
El primer ejemplo en ensamblador, es un programa fácil pero no estoy seguro de haberlo explicado muy bien, a los que tengan dudas pues pregunten.
Después pondré más ejemplos y luego pondré como usar el MPLAB.
Hasta luego kamaradas!

Nota: Si el archivo no tiene una buena presentación notifiquenmelo puesto que estoy usando OpenOficce y a veces no hay buena compatibilidad entre formatos.
 

Adjuntos

  • ejemplo0x00_112.doc
    110.5 KB · Visitas: 460
Hola yo copero con un sencillo codigo en mc18 de mplab para encender un led con un boton-
# include <p18f1320.h>
# include <delays.h>
# pragma config IESO=OFF, FSCM=OFF, OSC=HSPLL
# pragma config BORV=42, BOR=ON, PWRT=ON
# pragma config WDTPS=32768, WDT=OFF
# pragma config MCLRE=ON
# pragma config DEBUG=OFF
# pragma config LVP=OFF, STVR=OFF
# pragma config CP1=OFF, CP0=OFF
# pragma config CPD=OFF, CPB=OFF
# pragma config WRT1=OFF, WRT0=OFF
# pragma config WRTD=OFF, WRTB=OFF, WRTC=OFF
# pragma config EBTR0=OFF, EBTR1=OFF
# pragma config EBTRB=OFF
# define SW1 LATAbits.LATA0
# define D1 PORTBbits.RB0
//todas estas directivas son "fuses" del pic 18f1320, las cuales son necesarias para programar el pic.
void main(void ){

ADCON1=0b01111111;
TRISA=1;//porgramamos puerto A 1 input 0 output
LATA=0;//ponemos en 0 lógico el puerto A
TRISB=0;//puerto porgramado como salia
LATB=0;//ponemos en 0 el puerto B
INTCON2bits.RBPU=0;//Activamos resistencias de pull-up
while(1){ //bucle infinito
if(SW1==1){ //si se presiona el switch aqui se puede agregar un funcion para evitar el rebote pero
//por ahora solo trato de definir funciones muy basicas para que vean como es este rollo.
D1=1; //prendemos el led
}

Delay10KTCYx(10); //fucnion de delay es lo mas basico pero mas util usar interrupciones
D1=0; //apagamos el led
}

}//este programa esta funcionando y es demasiado sencillo, espero les sirva como inicio.
espero les sirva
un saludo
 
Tus anexos se me hacen interesante, pero hay muchas cosas que no se entienden muy bien, por ejemplo esta linea " INTCON2bits.RBPU=0;//Activamos resistencias de pull-up "a que se refiere esto? y en el que esta en word tambien, en que lenguaje esta? o como lo explicas?
 
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

// 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
 
Ok refiriendome al codigo que yo puse, es lenguaje c que se programa con mplab con un compilador que se llama mcc 18 si no lo consigues yo te lo puedo subir al skydrive y de ahi te lo bajas.
Respecto a las resistencias de pull-up, son resistencias que se colocan entre una señal loigca y la fuente de alimentacion, y sirven simplemente para evitar una confusion entre un uno y un cero logico, solamente que con este pic y otros mas, no es necesario colocar esas resitencias sino que ya las trae colocadas internamente. Una ventaja no?
 
Ok, he escuchado de mplab, pero la verdad no he trabajado con el, te agradeceria que lo subieras y me pasaras el link para ver si nos podemos familiarizar, y por lo que veo tu ya estas con uno de la familia 18f, es un gran avance, en ese tipo de micros como activo la conexion usb?
sigamos adelante con las aportaciones
 
Carlos no comprendo bien tu pregunta pero el dispositivo cuenta con puerto de recepcion y transmisión sincrona y asincrona, respecto a lo del usb no quisiera contestarte algo incorrecto.
Yo subiré hoy el mplab y todo eso al skydrive y seguro mañana posteo el link para todos.
Un saludo
 
Mi pregunta es como declaro para activar la conexion usb en la familia de los 18f, para poderse comunicar con la pc y viserversa. , por ejemplo en la familia de los 16f, es la que he ocupado y para activar la conexion serial, es <include>rs232..., pero ahora estoy empezando con los 18f y no se como activar el usb. si es mucho pedir haber si tambiensi tienes algun diagrama te lo agradeceria mucho
gracias por tu atensión
 
Bueno si a eso te refieres el Mcc18 tiene la libreria usart.h y sw_uart.h con una trae las definiciones de las funciones y la sw es software uart ahí vienen esas librerías, disculpa respecto al diagrama pero no he realizado programas que manejen esta característica del pic.
un saludo.
 
Bueno, ya lei todo este hilo y me he encontrado con muchas cosas que desconocia, como por ejemplo la forma en la que ustedes crean el codigo... gracias y a leer se ha dicho.

Pasando a otras cosas y espero me puedan ayudar, hace como 2 años usaba MPLAB y PICCLITE para crear y simular codigo, para el 16F877solo que lo habia dejado un buen rato, y ahora que he dejado de usar el s.o. de las ventanas y me he instalado con el pingüino me ha vuelto ha entrar el gusanito por el tema de los microcontroladores, me he encontrado con que hay ides como piklab (ya lo he descargado, al igua que sdcc) pero no he podido configurarlo correctamente, y este es el problema, que no puedo compilar el codigo que creo, aqui les pongo un ejemplo de lo que es mi ultimo proyecto y que deje inconcluso...:

Código:
#include<pic.h>

/*Definición de entradas y salidas*/

#define		v1	RB0

#define		v2	RB1

#define		v3	RB2

#define		v4	RB3

#define	       paro	RD0

#define	      arranque	RD1

#define		m1	RD2

#define		m2	RD3

#define		m3	RC4

#define		m4	RC5



/*Inicio de Programa.*/



void ciclo (void);

void main (void)

{

/*Declaración de los puertos como entradas o salidas.*/

TRISD=255;TRISC=255;TRISB=0;

/*Declaración de variables.*/

v1=0;v2=0;v3=0;v4=0;

/*Inicio de secuencia.*/

while(1)

   { 

   if(arranque==0)

      {

      while(paro==1)

         {

         v1=1;

         v2=0;

         v3=0;

         v4=1;ciclo1();

         v1=1;

         v2=0;

         v3=0;

         v4=0;ciclo2();

	 v1=1;

         v2=0;

         v3=1;

         v4=0;ciclo3();

	 v1=0;

         v2=1;

         v3=1;

         v4=0;ciclo1();

	 v1=0;

         v2=0;

         v3=1;

         v4=0;ciclo2();

	 v1=1;

         v2=0;

         v3=1;

         v4=0;ciclo3();

         }

      }

   if (arramque==1)

      {

      while (paro==0)

         {

	 v1=1;

	 v2=0;

	 v3=1;

	 v4=0;

 	 }

      while (paro==1)

	 {

	 while (m1==0)

      }

   }

}

void ciclo1 (void)

{

int cont=0,cont2=0;

OPTION=8;TMR0;T0IF=0;

for (cont=0;cont<120;cont++)

	{

	for (cont2=0;cont2<255;cont2++)

		{

		if (paro==0)

			{

			cont=1250;

			cont2=64;

			}

		else

			{

			while (T0IF==0);T0IF=0;

			}

		}

	}

}

void ciclo2 (void)

{

int cont=0,cont2=0;

OPTION=8;TMR0;T0IF=0;

for (cont=0;cont<48;cont++)

	{

	for (cont2=0;cont2<255;cont2++)

		{

		if (paro==0)

			{

			cont=1250;

			cont2=64;

			}

		else

			{

			while (T0IF==0);T0IF=0;

			}

		}

	}

}

void ciclo3 (void)

{

int cont=0,cont2=0;

OPTION=8;TMR0;T0IF=0;

for (cont=0;cont<1;cont++)

	{

	for (cont2=0;cont2<255;cont2++)

		{

		if (paro==0)

			{

			cont=1250;

			cont2=64;

			}

		else

			{

			while (T0IF==0);T0IF=0;

			}

		}

	}

}

falta simplicficar procesos, pero debe de funcionar correctamente... bueno, si pongo ese codigo en piklab y trato de compilar con sdcc simplemente se cierra piklab, pero si pongo el siguiente codigo (un preliminar del codigo anterior):

Código:
#include<pic.h>

#define		v1	RB0

#define		v2	RB1

#define		v3	RB2

#define		v4	RB3

#define	       paro	RD0

#define	      arranque	RD1

void ciclo (void);

void main (void)

{

TRISD=255;TRISB=0;

v1=0;v2=0;v3=0;v4=0;

while(1)

   { 

   if(arranque==0)

      {

      while(paro==1)

         {

         v1=1;

         v2=0;

         v3=0;

         v4=1;ciclo();

         v1=1;

         v2=0;

         v3=0;

         v4=0;ciclo();

         }

      }

   }

}

void ciclo (void)

{

int cont=0,cont2=0;

OPTION=8;TMR0;T0IF=0;

for (cont=0;cont<1;cont++)

	{

	for (cont2=0;cont2<255;cont2++)

		{

		if (paro==0)

			{

			cont=1250;

			cont2=64;

			}

		else

			{

			while (T0IF==0);T0IF=0;

			}

		}

	}

}

aparecen los siguientes errores:

sdcc -mpic14 -p16f877 -V --debug -I/home/erko/Piklab/ -c Seca.c
+ "/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"
Seca.c:1: 16: error: pic.h: No such file or directory

Seca.c:21: error 20: Undefined identifier 'TRISD'
Seca.c:21: error 20: Undefined identifier 'TRISB'
Seca.c:23: error 20: Undefined identifier 'RB0'
Seca.c:23: error 20: Undefined identifier 'RB1'
Seca.c:23: error 20: Undefined identifier 'RB2'
Seca.c:23: error 20: Undefined identifier 'RB3'
Seca.c:29: error 20: Undefined identifier 'RD1'
Seca.c:33: error 20: Undefined identifier 'RD0'
Seca.c:37: error 20: Undefined identifier 'RB0'
Seca.c:39: error 20: Undefined identifier 'RB1'
Seca.c:41: error 20: Undefined identifier 'RB2'
Seca.c:43: error 20: Undefined identifier 'RB3'
Seca.c:45: error 20: Undefined identifier 'RB0'
Seca.c:47: error 20: Undefined identifier 'RB1'
Seca.c:49: error 20: Undefined identifier 'RB2'
Seca.c:51: error 20: Undefined identifier 'RB3'
Seca.c:67: error 20: Undefined identifier 'OPTION'
Seca.c:67: error 20: Undefined identifier 'TMR0'
Seca.c:67: error 20: Undefined identifier 'T0IF'
Seca.c:77: error 20: Undefined identifier 'RD0'
Seca.c:91: error 20: Undefined identifier 'T0IF'
Seca.c
Seca.c:91: error 20: Undefined identifier 'T0IF'

*** Salida con estado: 1 ***

A que se debera esto...? por mas que busco y busco no he encontrado mucha información sobre como configurar piklab, se debera a que la forma en la que creo el codigo es diferente a como ustedes lo hacen...?

bueno, me despido y espero me puedan ayudar o guiarme y postear algunos links donde se explique como configurar piklab, que yo intento mientras con algun codigo de ejemplo que aqui an posteado y de antemano gracias por su tiempo...
 
Atrás
Arriba