Date post: | 15-Oct-2014 |
Category: |
Documents |
Upload: | antonio-martinez |
View: | 77 times |
Download: | 7 times |
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 periféricos.
Cuando hablamos de un circuito integrado programable que controla periféricos, estamos hablando de un sistema que contiene entre otras cosas una unidad arimético-lógica, memorias de datos y programas, puertos de entrada y salida, es decir, estamos hablando de un pequeño ordenador diseñado para realizar funciones específicas.
Podemos encontrar microcontroladores en lavadoras, hornos de microondas, teléfonos móviles, etc.
INICIACIÓN A LOS MICROCONTROLADORES PIC
Un puerto es una interfaz física a través del la cual pasan los datos hacia y desde los periféricos.
INICIACIÓN A LOS MICROCONTROLADORES PIC
Paquete de plástico de doble línea,PDIP (Plastic Dual In-Line Package)de 40 pines.
MCLR/VppRA0
PUERTO A RA1RA2RA3RA4RA5RE0
PEURTO E RE1RE2
VDDVSS
OSC1OSC2
RC0PUERTO C RC1
RC2RC3
PUERTO D RD0RD1
RB7RB6RB5RB4 PUERTO B RB3RB2RB1RB0VDDVSSRD7RD6 PUERTO DRD5RD4RC7RC6 PUERTO CRC5RC4RD3 PUERTO DRD2
El microcontrolador PIC 16F877A del fabricante Microchip Technology Inc. es un sistema sencillo, barato y potente para muchas aplicaciones electrónicas.
Algunas de las características 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 electrónicamente). Contiene el programa con las instrucciones que gobiernan al microcontrolador. Es del tipo no volátil.-Memoria RAM de datos: 368 Bytes. Almacena las variables y datos. Son registros de 8 bits. Es volátil.-Memoria EEPROM de datos: 256 Bytes. Memoria de datos de lectura y escritura no volátil que permite garantizar que determinada información estará siempre disponible al reinicializarse el programa.-Frecuencia de operación de hasta 20 Mhz.-Puertos de Entrada/Salida: PORTA, PORTB, PORTC, PORTD, PORTE-Timers: 3-Número de pines: 40
Asignación de pines y propósito.
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 señal para sincronizar todas las operaciones delsistema.
Los pines utilizados para este fin son:
OSC1 (13): Entrada del oscilador de cristal de cuarzo. OSC2 (14): Salida del cristal de cuarzo.
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5V
C6
100nF
RESET
El microcontrolador se alimenta con 5 Volts aplicados entre los pines Vdd y Vss, que son respectivamente la alimentación y la tierra del chip.
VSS (12 y 31): Conexión a tierra.
VDD (11 y 32): entrada de alimentación positiva.
MCLR (1): entrada de RESET.
El reset provoca la reinicialización del funciona-miento del microcontrolador. El pin del reset en los microcontroladores se denomina Master Clear (MCLR) y produce un reset cuando se le aplica un nivel lógico bajo (0 volts).
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5V
C6
100nF
RESET
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 deentrada y salida. Cada una de ellas puede ser configurada como entrada para recibir datos o como salidas para gobernar dispositivos externos.
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5V
C6
100nF
RESET
D6
R6
330
D5 R7
330
5V
Nivel lógico bajo, 0 v
Nivel lógico alto, 5 v
MICROCONTROLADOR
El diodo LED es un dispositivo que permite comprobar el funcionamiento de los circuitos mediante la emisión de luz.
El PIC puede gobernar diodos leds, conectando el cátodo del diodo a la salida del microcontrolador y el ánodo al positivo de la alimentación a través de una resistencia limitadora de corriente. En este caso el LED se ilumina con un nivel lógico bajo (0 V).
Otra forma de encender el LED es conectando el ánodo del diodo a la salida del microcontrolador a través de una resistencia, y el cátodo a tierra, el LED se ilumina con un nivel alto de salida (5 V).
La memoria RAM de datos del microcontrolador está particionada en múltiples 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.
PUERTOS DE ENTRADA/SALIDA (I/O PORTS)
Los puertos del microcontrolador son puertos bidireccionales, es decir, pueden ser configurados como puertos de entrada o de salida digital, capaz de sensar o producir señales binarias 1 ó 0 (5V ó 0V respectivamente). El puerto A tiene un ancho de 6 bits (6 pines).
La asignación de pines como entradas o salidas digitales del puerto A, se hace programando el registro llamado TRISA. En este registro se almacenan los bits que asignan los pines del puerto A como entradas o salidas.
Si se asigna un 0 a un pin este será configurado como salida (Output), mientras que si se asigna un 1 a un pin este será configurado como entrada (Input).
PUERTOS DE ENTRADA SALIDA (I/O PORTS)
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.
Ejemplo:
TRISB = 0b00000000; // se configura el puerto B // como salida para poder // encender los LEDs.
Los registros PORTA, PORTB, PORTC, PORTD y PORTE, contienen el estado de los pines de entrada/salida correspondiente.
Ejemplo:
PORTB = 0b00001111; // Los pines RB0 a RB3 tienen 5 V y los pines RB4 a RB7 // tienen 0 V. Sólo se encienden 4 LEDs.
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5V
C6
100nF
RESET
PUERTOS DE ENTRADA SALIDA (I/O PORTS)
Existen varios formatos para asignarle un valor constante a un registro:
Definición del valor constante
Formato Ejemplo
Decimal ## TRISB=73;
Hexadecimal 0x## TRISB=0x49;
Binario 0b######## TRISB=0b01001001;
PUERTOS DE ENTRADA SALIDA (I/O PORTS)
En ocasiones sólo es necesario configurar sólo algunos pines de un puerto y no todo el puerto. Para esto los bits de los registros TRIS se pueden referenciar como TRIS&#, donde & representa el puerto y # el pin de ese puerto.
Por ejemplo: TRISB4 = 0 ; // configura el pin 4 del puerto B como salida. TRISC5 = 0; // configura el pin 5 del puerto C como salida.
Para leer (sensar) o escribir (enviar) señales sólo 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; // envía 0V por el pin 4 del puerto B, se enciende el LED. RC5=1; // envía 5V por el pin 5 del puerto C, se enciende el LED.
D6
R6
330
D5 R7
330
5V
Nivel lógico bajo, 0 v
Nivel lógico alto, 5 v
MICROCONTROLADOR
RB4
RC5
// Ejemplo1#include<htc.h>#include"delay.h"#include <pic.h> __CONFIG(0b11111100110001);
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);}}
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5V
C6
100nF
RESET
PUERTOS DE ENTRADA SALIDA (I/O PORTS)
Resumen de registros asociados con los puertos del microcontrolador.
PUERTOAregistros
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTA -- -- RA5 RA4 RA3 RA2 RA1 RA0
TRISA -- -- TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
PUERTOBregistros
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
PUERTOCRegistros
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
TRISC TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0
PUERTOS DE ENTRADA SALIDA (I/O PORTS)
Resumen de registros asociados con los puertos del microcontrolador.
PUERTODRegistros
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
TRISD TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0
PUERTOERegistros
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTE -- -- -- -- -- RE2 RE1 RE0
TRISE -- -- -- -- -- TRISE2 TRISE1 TRISE0
Palabra de configuración. Puede ser programada para seleccionar varias opciones del dispositivo.
Bit 13
Bit 12
Bit 11 Bit 10
Bit 9 Bit 8 Bit 7 Bit 6 Bit 5
Bit 4
Bit 3 Bit 2 Bit 1 Bit 0
CP -- DEBUG WRT1 WRT0 CDP LVP BOREN -- -- PWRTEN WDTEN Fosc1 Fosc2
1 1 1 1 1 1 0 0 1 1 0 0 0 1
3 F 3 1
Palabra de configuración// 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: Protección de código en memoria EEPROM. (1) deshabilitado// WRT0- WRT1: Protección contra escritura. (1 1) deshabilitado.// DEBUG: depuración de código con el uC conectado al resto del circuito. (1) deshabilitado// CP: Protección de código 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 extensión .c .
Iniciar el asistente de proyecto.
Clic en siguiente. Seleccionar el PIC 16F877A
Seleccionar el compilador HI-TECH C Compiler
Crear nuevo proyecto. Clic en Browse. Escribir nombre del proyecto (ejemplo1.mcp) y clic en Guardar.
Clic en siguiente. Se ha creado el proyecto, clic en finalizar.
Crear un nuevo archivo.
Capturar el programa. Guardar el programa como ejemplo1.c y activar la casilla Add file to project.
Agregar la librería htc.h. Clic derecho en Header Files de la ventana de proyecto. Seleccionar la librería 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 código fuente y agregarlos al proyecto.
Compilar el proyecto. Clic en el botón Build project.
Grabación 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 zócalo ZIF (zero insertion force). Verificar la orientación del microcontrolador.Ejecutar el programa USBURN.En la seccion IC-Socket / ICSP, seleccionar la opción 28/40 Pins.
Clic en Identify PIC in Programmer. Clic en Select HEX File as source.
Clic en write FEX-File into PIC.
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL
4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5VC6
100nF
RESET
1
2
34
56
7
8
16
15
1413
1211
10
9
SW1
SW-DIP8
R?
10k
5V
///////// EJEMPLO 2#include<htc.h>#include"delay.h"#include <pic.h> __CONFIG(0x3F31);
void main(){int tiempo=250;TRISC=0xFF; // Puerto C como
//entradaTRISB=0; // Puerto B como salida
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); }} }
RA0/AN02
RA1/AN13
RA2/AN2/VREF-4
RA4/T0CKI6
RA5/AN4/SS7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RD0/PSP019
RD1/PSP120
RB7/PGD40
RB6/PGC39
RB538
RB437
RB3/PGM36
RB235
RB134
RB0/INT33
RD7/PSP730
RD6/PSP629
RD5/PSP528
RD4/PSP427
RD3/PSP322
RD2/PSP221
RC7/RX/DT26
RC6/TX/CK25
RC5/SDO24
RC4/SDI/SDA23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI15
MCLR/Vpp/THV1
U1
PIC16F877
X1
CRYSTAL
4MHz
x 8
R1
330
C2
22pF
C1
22pF
R2
10k
5V
R5
330
BAT1
9V
D1
IN4007
C3100nF
C41000uF/25V
VI1
VO3
GND
2
U27805
C5100uF/16V
5V
5VC6
100nF
RESET
1
2
34
56
7
8
16
15
1413
1211
10
9
SW1
SW-DIP8
R?
10k
5V
///////// EJEMPLO 2#include<htc.h>#include"delay.h"#include <pic.h> __CONFIG(0x3F31);
void main(){int tiempo=250;TRISC=0b11111111; // Puerto C como
//entradaTRISB=0; // Puerto B como salida
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); }} }
// 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; }
}