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
- J1; Jack USB 2 tipo B (see & buy)
- J2; Jack de Alimentación (see & buy)
- J3, J4, J5; pines espadines Hembra de 01 fila (see & buy)
- J6, Pines espadines Macho 90° de 01 fila (see & buy)
- J7, J8, pines espadines Hembra de 02 filas (see & buy)
- R1-R16; Resistencia SMD 470 Ohm, package 1206 (see & buy)
- R17, R19-R22; Resistencia SMD 10k Ohm, package 1206 (see & buy)
- R18; Resistencia SMD 220 Ohm, package 1206 (see & buy)
- D1-D17; Leds SMD, package 1206 (see & buy)
- D18; Diodo Schottky SS14-TP (see & buy)
- C1, C3; Capacitor cerámico 0.1µF, package 1206 (see & buy)
- C2, C4; Capacitor electrolítico 220µF/16V, (see & buy)
- C5, C6; Capacitor cerámico 22pF, package 1206 (see & buy)
- X1, Crystal 4MHz (see & buy)
- U1; Pic16f877A DIP (see & buy)
- U2,U3; CI 74hc245D SMD (see & buy)
- U4; Regulador de Voltaje 3.3V, AMS1117-3.3 (see & buy)
- U5; Regulador de Voltaje 5V, AMS1117-5.0 (see & buy)
- SW1-SW4; Pines espadines Macho de 01 fila (see & buy)
- RP1, RP2; Pack 8 resistencias (see & buy)
- BTN1; Pulsador dos pines (see)
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); } }