Icono del sitio ELECTROALL

ENTRENADOR PARA PIC 16F877A

YouTube
YouTube
Instagram
Instagram
GitHub
GitHub
INTRODUCCIÓN

Yo se que la mayoría de los electrónico conocemos las tarjetas de la familia Arduino, tales como; Arduino UNO, Arduino Mega, Arduino Nano, etc.

Debo admitir que estas tarjetas ya antes mencionadas, están dominando el mercado, debido a que  son fáciles de usar,  llegando al punto de que no se necesita tener conocimientos avanzados de electrónica para manejar estas tarjetas, prácticamente lo puede usar cualquier tipo de persona. Cabe señalar que estas tarjetas trabajan con los micro-controladores Atmel. Sin embargo, existen muchos microcontroladores que a día de hoy no tienen una tarjeta en especifico similar a los  µC ATmega, por eso, en este episodio crearemos una tarjeta entrenadora para el microcontrolador pic16f877A, cuyas características serán similar a los board de la familia de Arduino.

OBJETIVOS

Se sabe que para hacer prácticas con microcontroladores PIC necesariamente se tiene que implementar en un protoboard, es decir para poder ver el funcionamiento del PIC se requiere la instalación de otros dispositivos externos, tales como; resistencias, leds, reguladores de voltaje, capacitores, osciladores, etc. Por lo tanto, con la creación de esta tarjeta entrenadora ya no sería necesario la implementación de dispositivos primarios. Además, con esta tarjeta podrás realizar tus practicas en un menor  tiempo, ya que esta PCB tiene incluido dispositivos fundamentales para que funcione un µC PIC. 

ESPECIFICACIONES TÉCNICAS GENERALES
  • Voltaje de alimentación……….5-12V
  • Voltaje de salida……… …………3.3, 5, 12V
  • Entradas Analógica…………….08
  • Entradas/salidas digitales……32
  • Salidas PWM……………………..02
  • Pines con leds de prueba…….16
  • Serial COM(Tx, Rx)……………01
FUNCIONES PINES EXTERNOS
ESQUEMATICO ELECTRONICO
Descargar diseño esquematico y PCB, “proteus 8.8”
EXPLICACIÓN DEL CIRCUITO
  • U1, Es el microcontrolador pic16f877A
  • U2, circuito integrado 74hc245D. Este permite definir el modo para el puerto D (entrada/salida); Si se quiere usar como  salida el pin 1 (dir) tendrá que estar conectado a un alto(5v), ahora si se quiere usar como entrada el portD el pin 1(dir) tendrá que estar conectado a  un bajo(0v). Para poder cambiar los modos simplemente se realizará a través de un jumper(SW2).
  • U3, circuito integrado 74hc245D. Este permite definir el modo para el puerto B (entrada/salida); Si se quiere usar como  salida el pin 1 (dir1) tendrá que estar conectado a un alto(5v), ahora si se quiere usar como entrada el portB el pin 1(dir1) tendrá que estar conectado a  un bajo(0v). Para poder cambiar los modos simplemente se realizará a través de un jumper(SW4).
  • U4, es un regulador de voltaje de 3.3v lo cual si alimentamos con 12V o 5v tendremos salidas de 3.3v en los pines establecidos en la PCB
  • U5, es un regulador de voltaje de 5v lo cual si alimentamos con 12V tendremos salidas de 5v en los pines establecidos en la PCB.
DISEÑO PCB (JLCPCB)
Descargar Gerber y mandar a fabricar por $2 en (JLCPCB)
MATERIALES
CÓDIGOS DE PRUEBAS (pic CCS Compiler)

EJEMPLO 1: Salidas PuertoB, PuertoD

# include <16f877A.h>
# fuses NOWDT, XT, NOPUT, NOCPD , NOBROWNOUT, NOPROTECT, NOLVP, NODEBUG, NOWRT
# use DELAY (CLOCK =4M)
# use STANDARD_IO (a,b,c,d,e)

int B0  =PIN_B0;
int B1  =PIN_B1;
int B2  =PIN_B2;
int B3  =PIN_B3;
int B4  =PIN_B4;
int B5  =PIN_B5;
int B6  =PIN_B6;
int B7  =PIN_B7;
int D0  =PIN_D0;
int D1  =PIN_D1;
int D2  =PIN_D2;
int D3  =PIN_D3;
int D4  =PIN_D4;
int D5  =PIN_D5;
int D6  =PIN_D6;
int D7  =PIN_D7;

void main(){
while (true){

output_high (B0);
delay_ms(1000);

output_high (B1);
delay_ms(1000);

output_high (B2);
delay_ms(1000);

output_high (B3);
delay_ms(1000);

output_high (B4);
delay_ms(1000);

output_high (B5);
delay_ms(1000);

output_high (B6);
delay_ms(1000);

output_high (B7);
delay_ms(1000);

output_high (D0);
delay_ms(1000);

output_high (D1);
delay_ms(1000);

output_high (D2);
delay_ms(1000);

output_high (D3);
delay_ms(1000);

output_high (D4);
delay_ms(1000);

output_high (D5);
delay_ms(1000);

output_high (D6);
delay_ms(1000);

output_high (D7);
delay_ms(1000);

output_low (D7);
delay_ms(1000);

output_low (D6);
delay_ms(1000);

output_low (D5);
delay_ms(1000);

output_low (D4);
delay_ms(1000);

output_low (D3);
delay_ms(1000);

output_low (D2);
delay_ms(1000);

output_low (D1);
delay_ms(1000);

output_low (D0);
delay_ms(1000);

output_low (B7);
delay_ms(1000);

output_low (B6);
delay_ms(1000);

output_low (B5);
delay_ms(1000);

output_low (B4);
delay_ms(1000);

output_low (B3);
delay_ms(1000);

output_low (B2);
delay_ms(1000);

output_low (B1);
delay_ms(1000);

output_low (B0);
delay_ms(1000);
}
}

 

EJEMPLO 2: Entradas puertoB, Salidas puertoD

# include <16f877A.h>
# fuses NOWDT, XT, NOPUT, NOCPD , NOBROWNOUT, NOPROTECT, NOLVP, NODEBUG, NOWRT
# use DELAY (CLOCK =4M)
# use STANDARD_IO (a,b,c,d,e)
int B0  =PIN_B0;
int B1  =PIN_B1;
int B2  =PIN_B2;
int B3  =PIN_B3;
int B4  =PIN_B4;
int B5  =PIN_B5;
int B6  =PIN_B6;
int B7  =PIN_B7;
int D0  =PIN_D0;
int D1  =PIN_D1;
int D2  =PIN_D2;
int D3  =PIN_D3;
int D4  =PIN_D4;
int D5  =PIN_D5;
int D6  =PIN_D6;
int D7  =PIN_D7;
void main(){
while (true){

if(input(B0)==1){
output_high (D0);
}
if(input(B0)==0){
output_low (D0);
}

if(input(B1)==1){
output_high (D1);
}
if(input(B1)==0){
output_low (D1);
}

if(input(B2)==1){
output_high (D2);
}
if(input(B2)==0){
output_low (D2);
}

if(input(B3)==1){
output_high (D3);
}
if(input(B3)==0){
output_low (D3);
}
if(input(B4)==1){
output_high (D4);
}
if(input(B4)==0){
output_low (D4);
}
if(input(B5)==1){
output_high (D5);
}
if(input(B5)==0){
output_low (D5);
}

if(input(B6)==1){
output_high (D6);
}
if(input(B6)==0){
output_low (D6);
}

if(input(B7)==1){
output_high (D7);
}
if(input(B7)==0){
output_low (D7);
}

}
}

EJEMPLO 3: Pantalla LCD (16×2) con sensor Ultrasonido

#include <16F877a.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP     
#use delay(clock=4000000)

#include <lcd.c>

float distancia, tiempo;
#define trig pin_B1
#define echo pin_B0
#USE standard_io(b)

void main()
{
   lcd_init();                             
printf(LCD_PUTC, "\f WELCOME.");
delay_ms(1000);
printf(LCD_PUTC, "\f TO ELECTROALL..");
delay_ms(1000);                           
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

while(true)
{

output_high(trig);                   
delay_us(10);                       
output_low(trig);
while(!input(echo))                     
{}
set_timer1(0);                         
while(input(echo))                     
{}
tiempo=get_timer1();
distancia=(tiempo/2)/(29.15);
             lcd_gotoxy(1,1);
             printf(lcd_putc,"Distancia =%f",distancia);
             lcd_gotoxy(2,2);
             printf(lcd_putc, "tiempo =%f", tiempo);
             delay_ms(500);

}
}

 

 

VIDEO
Salir de la versión móvil