Beruflich Dokumente
Kultur Dokumente
Un microcontrolador, es un circuito integrado programable que contiene los elementos necesarios para controlar un sistema. PIC significa Peripheral Interface Controller, es decir un controlador de perifricos. Cuando hablamos de un circuito integrado programable que controla perifricos, estamos hablando de un sistema que contiene entre otras cosas una unidad arimtico-lgica, memorias de datos y programas, puertos de entrada y salida, es decir, estamos hablando de un pequeo ordenador diseado para realizar funciones especficas. Podemos encontrar microcontroladores en lavadoras, hornos de microondas, telfonos mviles, etc.
Un puerto es una interfaz fsica a travs del la cual pasan los datos hacia y desde los perifricos.
El microcontrolador PIC 16F877A del fabricante Microchip Technology Inc. es un sistema sencillo, barato y potente para muchas aplicaciones electrnicas.
PUERTO D
PUERTO C
PUERTO D
Paquete de plstico de doble lnea, PDIP (Plastic Dual In-Line Package) de 40 pines.
Algunas de las caractersticas del microcontrolador 16F877A son: -Memoria de programa Flash: 8K x 14 words. (8K localidades de memoria, cada una con una longitud de 14 bits). Memoria reprogramable, este tipo de memoria se puede borrar electrnicamente). Contiene el programa con las instrucciones que gobiernan al microcontrolador. Es del tipo no voltil. -Memoria RAM de datos: 368 Bytes. Almacena las variables y datos. Son registros de 8 bits. Es voltil. -Memoria EEPROM de datos: 256 Bytes. Memoria de datos de lectura y escritura no voltil que permite garantizar que determinada informacin estar siempre disponible al reinicializarse el programa. -Frecuencia de operacin de hasta 20 Mhz. -Puertos de Entrada/Salida: PORTA, PORTB, PORTC, PORTD, PORTE -Timers: 3 -Nmero de pines: 40
Asignacin de pines y propsito. Todo microcontrolador requiere de un circuito que le indique la velocidad de trabajo, llamado oscilador o reloj. Este genera una onda cuadrada de alta frecuencia que se utiliza como seal para sincronizar todas las operaciones del sistema. Los pines utilizados para este fin son: OSC1 (13): Entrada del oscilador de cristal de cuarzo. OSC2 (14): Salida del cristal de cuarzo.
X1 U1
CRYSTAL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19
C2
5V 22pF
C6
100nF
C1
22pF
R2
10k
R5
330
RESET
C2
5V 22pF
C6
100nF
C1
El microcontrolador se alimenta con 5 Volts aplicados entre los pines Vdd y Vss, que son respectivamente la alimentacin y la tierra del chip. VSS (12 y 31): Conexin a tierra. VDD (11 y 32): entrada de alimentacin positiva. MCLR (1): entrada de RESET. El reset provoca la reinicializacin del funcionamiento del microcontrolador. El pin del reset en los microcontroladores se denomina Master Clear (MCLR) y produce un reset cuando se le aplica un nivel lgico bajo (0 volts).
22pF
X1 U1
CRYST AL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/T HV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T 0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T 1OSO/T 1CKI RC1/T 1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/T X/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 5V
R2
10k
R5
330
RESET
BAT1
U2 D1
IN4007 7805 1 VI GND VO 3
9V
C3
100nF
C4
1000uF/25V
C5
100uF
Pines de entradas/salidas digitales, trabajan con niveles de 0 y 5 volts. PORTA: 6 pines (2 a 7). RA0 a RA5. PORTB: 8 pines (33 a 40). RB0 a RB7. PORTC: 8 pines (15 a 18 y 23 a 26). RC0 a RC7. PORTD: 8 pines (19 a 22 y 27 a 30). RD0 a RD7. PORTE: 3 pines. (8 a 10). RE0 a RE2. En resumen tenemos 33 patillas de entrada y salida. Cada una de ellas puede ser configurada como entrada para recibir datos o como salidas para gobernar dispositivos externos.
C2
5V 22pF
C6
100nF
C1
22pF
X1 U1
CRYST AL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/T HV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T 0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T 1OSO/T 1CKI RC1/T 1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/T X/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 5V
R1
330
R2
10k
x8
R5
330
RESET
BAT1
U2 D1
IN4007 7805 1 VI GND VO 3
9V
C3
100nF
C4
1000uF/25V
C5
100uF/16V
El diodo LED es un dispositivo que permite comprobar el funcionamiento de los circuitos mediante la emisin de luz. El PIC puede gobernar diodos leds, conectando el ctodo del diodo a la salida del microcontrolador y el nodo al positivo de la alimentacin a travs de una resistencia limitadora de corriente. En este caso el LED se ilumina con un nivel lgico bajo (0 V). Otra forma de encender el LED es conectando el nodo del diodo a la salida del microcontrolador a travs de una resistencia, y el ctodo a tierra, el LED se ilumina con un nivel alto de salida (5 V).
5V
D5
R7
330
D6 R6
330
La memoria RAM de datos del microcontrolador est particionada en mltiples bancos, los cuales contienen los Registros de Funciones Especiales. Para tener claro como debemos empezar a programar se debe conocer la tabla de registros. Esta tabla est dividida en 4 bancos.
C2
5V 22pF
100nF As mismo, los registros TRISB, TRISC, TRISD y TRISE se utilizan para configurar los puertos B (de 8 bits), C (de 8 bits), D (de 8 bits) y E (de 3 bits) respectivamente. 22pF
C1
Ejemplo:
U1
OSC1/CLKIN TRISB CRYSTAL = 0b00000000; OSC2/CLKOUT 4MHz // se configuraMCLR/Vpp/THV B el puerto // como salida para poder 2 RA0/AN0 R2 3 // encender los LEDs. RA1/AN1 13 14 1 10k 4 5 6 7 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T1OSO/T 1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30
X1
R1
330
x8
Los registros PORTA, 8 RE0/AN5/RD PORTB, PORTC, PORTD y PORTE, contienen el estado de los 9 RE1/AN6/WR 10 pines 330 entrada/salida correspondiente. de RE2/AN7/CS RESET Ejemplo: PORTB = 0b00001111;
R5
// Los pines RB0 a RB3 tienen 5 V y los pines RB4 a RB7 // tienen 0 V. Slo se encienden 4 LEDs.
PIC16F877
5V
Para leer (sensar) o escribir (enviar) seales slo en algunos pines de entrada/salida , estos se pueden referenciar usando el formato R&# , donde & representa el puerto y # representa el pin del puerto. Por ejemplo: RB4=0; RC5=1; // enva 0V por el pin 4 del puerto B, se enciende el LED. // enva 5V por el pin 5 del puerto C, se enciende el LED.
5V
D5
R7
330
D6 R6
330
C2
5V 22pF
C6
100nF
C1
22pF
void main() { unsigned int tiempo=250; TRISB=0; // Puerto B como salida while(1==1){ PORTB=0b00000010; DelayMs(tiempo); //PORTB=0b00000010; PORTB=0x02; DelayMs(tiempo); //PORTB=0b00000100; PORTB=0x04; DelayMs(tiempo); PORTB=0b00001000; DelayMs(tiempo); PORTB=0b00010000; DelayMs(tiempo); PORTB=0b00100000; DelayMs(tiempo); PORTB=0b01000000; DelayMs(tiempo); PORTB=0b10000000; DelayMs(tiempo);
U1
CRYST AL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/T HV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T 0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T 1OSO/T 1CKI RC1/T 1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/T X/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 5V
R1
330
R2
10k
x8
R5
330
RESET
BAT1
U2 D1
IN4007 7805 1 VI GND VO 3
9V
C3
100nF
C4
1000uF/25V
C5
100uF/16V
Bit 7 RD7
TRISD7
Bit 6 RD6
TRISD6
Bit 5 RD5
TRISD5
Bit 4 RD4
TRISD4
Bit 3 RD3
TRISD3
Bit 2 RD2
TRISD2
Bit 1 RD1
TRISD1
Bit 0 RD0
TRISD0
Bit 7 ---
Bit 6 ---
Bit 5 ---
Bit 4 ---
Bit 3 ---
Palabra de configuracin. Puede ser programada para seleccionar varias opciones del dispositivo. Bit 13
CP
Bit 12
--
Bit 11
DEBUG
Bit 10
WRT1
Bit 5
--
Bit 4
--
Bit 3
PWRTEN
Bit 2
WDTEN
Bit 1 Bit 0
Fosc1 Fosc2
1 3
1 F
1 3
1 1
Palabra de configuracin // Fosc0-Fosc1: Oscilador de cristal // WDTEN: Watchdog timer. (0) deshabilitado // PWRTEN: Timer de encendido. (0) habilitado // BORDEN: Reset por bajo voltaje. (0) deshabilitado // LVP: Programacion en bajo voltaje. (0) deshabilitado // CDP: Proteccin de cdigo en memoria EEPROM. (1) deshabilitado // WRT0- WRT1: Proteccin contra escritura. (1 1) deshabilitado. // DEBUG: depuracin de cdigo con el uC conectado al resto del circuito. (1) deshabilitado // CP: Proteccin de cdigo en la memoria Flash. (1) deshabilitado.
Para editar el programa se hace uso de MPLAB, software proporcionado por Microchip, si se edita el programa en lenguaje C, el archivo que se genera tiene extensin .c .
Clic en siguiente.
Crear nuevo proyecto. Clic en Browse. Escribir nombre del proyecto (ejemplo1.mcp) y clic en Guardar.
Clic en siguiente.
Capturar el programa. Guardar el programa como ejemplo1.c y activar la casilla Add file to project.
Agregar la librera htc.h. Clic derecho en Header Files de la ventana de proyecto. Seleccionar la librera de D:\Archivos de programa\HI-TECH Software\PICC\9.71a\include
Copiar los archivos delay.c y delay.h de la carpeta C:\Program files\HITECH Software \ PICC \ lite \ 9.71a \ samples \ LCDemo en la carpeta del cdigo fuente y agregarlos al proyecto.
Grabacin de PICs con PIC-600 y USBURN. Grabar el programa del ejemplo al PIC16F877A. Conectar el grabador PIC600 a la computadora. Insertar el microcontrolador en el zcalo ZIF (zero insertion force). Verificar la orientacin del microcontrolador. Ejecutar el programa USBURN. En la seccion IC-Socket / ICSP, seleccionar la opcin 28/40 Pins.
///////// EJEMPLO 2 #include<htc.h> #include"delay.h" #include <pic.h> __CONFIG(0x3F31); void main() { int tiempo=250; TRISC=0xFF; TRISB=0;
C2
22pF
C6
100nF
C1
22pF
X1 U1
CRYSTAL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T 0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T 1OSO/T1CKI RC1/T 1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/T X/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 5V 1 2 3 4 5 6 7 8 SW-DIP8
5V
R1
330
while(1==1){ if(RC1==0){ PORTB=0b00000001; DelayMs(tiempo); PORTB=0b00000010; DelayMs(tiempo); PORTB=0b00000100; DelayMs(tiempo); PORTB=0b00001000; DelayMs(tiempo); PORTB=0b00010000; DelayMs(tiempo); PORTB=0b00100000; DelayMs(tiempo); PORTB=0b01000000; DelayMs(tiempo); PORTB=0b10000000; DelayMs(tiempo); } else if(RC1==1){ PORTB=0b10000000; DelayMs(tiempo); PORTB=0b01000000; DelayMs(tiempo); PORTB=0b00100000; DelayMs(tiempo); PORTB=0b00010000; DelayMs(tiempo); PORTB=0b00001000; DelayMs(tiempo); PORTB=0b00000100; DelayMs(tiempo); PORTB=0b00000010; DelayMs(tiempo); PORTB=0b00000001; DelayMs(tiempo); } } }
R2
10k
x8
R5
330
10k
RESET
SW1
16 15 14 13 12 11 10 9
BAT1
U2 D1
IN4007 7805 1 VI GND VO 3
9V
C3
100nF
C4
1000uF/25V
C5
100uF/16V
5V
R?
///////// EJEMPLO 2 #include<htc.h> #include"delay.h" #include <pic.h> __CONFIG(0x3F31); void main() { int tiempo=250; TRISC=0b11111111; TRISB=0;
C2
22pF
C6
100nF
C1
22pF
X1 U1
CRYSTAL 4MHz 5V 13 14 1 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T 0CKI RA5/AN4/SS RE0/AN5/RD RE1/AN6/WR RE2/AN7/CS RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T 1OSO/T1CKI RC1/T 1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/T X/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 5V 1 2 3 4 5 6 7 8 SW-DIP8
5V
R1
330
while(1==1){ if(RC1==0){ PORTB=0b00000001; DelayMs(tiempo); PORTB=0b00000010; DelayMs(tiempo); PORTB=0b00000100; DelayMs(tiempo); PORTB=0b00001000; DelayMs(tiempo); PORTB=0b00010000; DelayMs(tiempo); PORTB=0b00100000; DelayMs(tiempo); PORTB=0b01000000; DelayMs(tiempo); PORTB=0b10000000; DelayMs(tiempo); } else if(RC1==1){ PORTB=0b10000000; DelayMs(tiempo); PORTB=0b01000000; DelayMs(tiempo); PORTB=0b00100000; DelayMs(tiempo); PORTB=0b00010000; DelayMs(tiempo); PORTB=0b00001000; DelayMs(tiempo); PORTB=0b00000100; DelayMs(tiempo); PORTB=0b00000010; DelayMs(tiempo); PORTB=0b00000001; DelayMs(tiempo); } } }
R2
10k
x8
R5
330
10k
RESET
SW1
16 15 14 13 12 11 10 9
BAT1
U2 D1
IN4007 7805 1 VI GND VO 3
9V
C3
100nF
C4
1000uF/25V
C5
100uF/16V
5V
R?
// los segmentos se encienden con 0 logico dado por el pic // se muestran los digitos 0 al 3 en el display #include<htc.h> #include<pic.h> #include"delay.h" __CONFIG(0x3F31);
void main() { const int numeros7seg[]={0b11000000, 0b11111001,0b10100100,0b10110000}; int tiempo=250; int c=0;
TRISC=0; // puerto C como salidas while(1==1){ c=0; while(c<=3){ PORTC=numeros7seg[c]; DelayMs(tiempo);DelayMs(tiempo); c=c+1; }