Escolar Documentos
Profissional Documentos
Cultura Documentos
uC PIC16F877A
La idea de este tutorial es empezar a programar los uC PIC, solo se necesita tener una
pequeña base o conocimiento de las instrucciones de los PIC's, ya que no pretendo
escribir un libro, sino mostrar las aplicaciones más comunes desde las ideas más
básicas como "encender un LED" hasta "manejar el bus I2C para conectar un RTC (Reloj
de tiempo real)". Empezaremos con las características principales del PIC16F877A y en
los siguientes posts ya estaremos programando.
Caraterísticas:
Memoria de Programa tipo Flash 8Kx14
Memoria Datos 368 bytes
EEPROM 256 bytes
33 pines de Entrada/Salida
Encapsulado: 40 pines DIP, 44 pines PLCC y 44 pines TQFP
Soporta Xtal 20MHz
Voltaje de Operación: 2.0 hasta 5.5VDC
Periféricos:
1 Conversor A/D de 10-bits (8 canales)
2 Módulos CCP (Captura, Comparador, PWM)
1 Modulo I2C
1 USART (Puerto Serie)
2 Timers de 8 bits
1 Timer 16 bits
1. PIC 16f877
2. Características
3. Diagrama de bloques
4. Descripción de pines
5. Aplicación
PIC 16F877
Se denomina microcontrolador a un dispositivo programable capaz de realizar
diferentes actividades que requieran del procesamiento de datos digitales y
del control y comunicacióndigital de diferentes dispositivos.
Los microcontroladores poseen una memoria interna que almacena dos tipos de datos;
las instrucciones, que corresponden al programa que se ejecuta, y los registros,
es decir, los datos que el usuario maneja, así como registros especiales para el control
de las diferentes funciones del microcontrolador.
CARACTERÍSTICAS 16F877
Puertos E/S A,B,C,D,E
Número de pines 40
Interrupciones 14
Timers 3
Módulos CCP 2
Arquitectura Harvard
CPU Risc
Canales Pwm 2
Pila Harware -
Puerto B:
Puerto e/s 8 pines
Resistencias pull-up programables
RB0 è Interrupción externa
RB4-7 èInterrupcion por cambio de flanco
RB5-RB7 y RB3 è programacion y debugger in circuit
Puerto C:
Puerto e/s de 8 pines
RC0 è RC0, T1OSO (Timer1 salida oscilador) y T1CKI (Entrada de reloj del
modulo Timer1).
RC1-RC2 è PWM/COMP/CAPT
RC1 è T1OSI (entrada osc timer1)
RC3-4 è IIC
RC3-5 è SPI
RC6-7 è USART
Puerto D:
Puerto e/s de 8 pines
Bus de datos en PPS (Puerto paralelo esclavo)
Puerto E:
Puerto de e/s de 3 pines
RE0 è RE0 y AN5 y Read de PPS
RE1 è RE1 y AN6 y Write de PPS
RE2 è RE2 y AN7 y CS de PPS
Dispositivos periféricos:
Timer0: Temporizador-contador de 8 bits con preescaler de 8 bits
Timer1: Temporizador-contador de 16 bits con preescaler que puede
incrementarse en modo sleep de forma externa por un cristal/clock.
Timer2: Temporizador-contador de 8 bits con preescaler y postescaler.
Dos módulos de Captura, Comparación, PWM (Modulación de Anchura de
Impulsos).
Conversor A/D de 1 0 bits.
Puerto Serie Síncrono Master (MSSP) con SPI e I2C (Master/Slave).
USART/SCI (Universal Syncheronus Asynchronous Receiver Transmitter) con 9
bit.
Puerta Paralela Esclava (PSP) solo en encapsulados con 40 pines
DIAGRAMA DE BLOQUES
Para ver el gráfico seleccione la opción "Descargar" del menú superior
DESCRIPCIÓN DE PINES
Para ver el gráfico seleccione la opción "Descargar" del menú superior
BUFFER
39 I/O TTL/ST
40 I/O TTL/ST
RD5/PSP5 27 ST/TTL
RD6/PSP6 28 ST/TTL
RD7/PSP7 29 ST/TTL
30 ST/TTL
REO/RD/AN5 8 I/O ST/TTL PORTE es un puerto I/O bidireccional
APLICACIÓN
Primeros Programas
El símbolo $ se usa junto con goto para saltar sobre la misma linea de comando. Como
se darán cuenta empiezo a ingresar los datos de atrás para adelante, es decir, primero
ingresé 8 y al último 50, eso se debe a a sintáxis de las instrucciones de operaciones
con literales.
org 0000H
incf 20H,1 ;Incremento en 1 el dato almacenado en la dirección
20H
decf 21H,1 ;Decremento en 1 el dato almacenado en la direccion
21H
movlw 52H ;Almaceno en W el dato hexadecimal 52H (W=52H)
addwf 22H,1 ;Sumo al dato almacenado en 22H el dato almacenado
en W y el resultado lo almaceno en la dirección 22H
subwf 23H,0 ;Resto al dato almacenado en la dirección 23H el
dato almacenado en W y el resultado lo almaceno en W
movlw 13H ;Almaceno el dato 13H en W
iorwf 24H,1 ;El dato almacenado en 24H hace un OR con W y el
resultado se almacena en 24H
swapf 24H,1 ;Intercambio de posición el dato almacenado en 24H,
el dato AB ahora será BA
rlf 24H,0 ;Desplazo un bit a la derecha del dato almacenado
en 24H y el resultado lo almaceno en W
goto $ ;Bucle infinito
Para visualizar mejor la ejecución de estos 3 ejemplitos debes usar las opciones Watch
y File Registers del MPLAB. Fijate aquí: MPLAB
Revisar en la Biblioteca el tema Bancos de Memoria del PIC para entender mejor el
último programita.
bsf .3,.5
solo que el primer ejemplo lo entendemos mejor, nos indica que estamos
configurando el bit RP0 del Registro STATUS.
Por ahora solo nos interesa conocer como cambiar de Banco, para esto se utilizan
los bits RP1 y RP0.
| RP1| RP0 | Banco |
|--0--|---0--| Banco 0 |
|--0--|---1--| Banco 1 |
|--1--|---0--| Banco 2 |
|--1--|---1--| Banco 3 |
bsf STATUS,RP0 ;RP1=0 y RP0=1 con lo que estamos pasando al Banco 1 según
la tabla anterior (RP1=0 por defecto luego de resetear el uC).
Bueno vamos aprovechar también para conocer para que sirven los bits Z y C.
Z: más conocido como señalizador de 0, se activa o pone en nivel alto "1" cuando
el resultado de una operación es 0, por ejemplo:
movlw .10
sublw .10
esta operación da como resultado 0, en ese instante el bit Z del Registro STATUS
cambia a "1".
C: más conocido como señalizador de acarreo, se pone en nivel alto "1" en las
operaciones de suma cuando existe acarreo y se pone en nivel bajo "0" en las
operaciones de resta cuando también existe acarreo por lo general cuando se
resta un numero mayor de uno menor, por ejemplo:
movlw .255
addwl .1
la suma supera los 8 bits, por lo tanto se activa "1" el señalizador de acarreo
indicando que se ha superado el límite de registro, es decir, hubo un
desbordamiento y por consiguiente un acarreo.
movlw .5
sublw .4
movlw B'10000000'
movwf 22H
rlf 22H,7
3. Puertos A, B, C, D y E
movlw B'00000110'
movwf ADCON1
bsf STATUS,RP0
movlw B'11110000'
movwf TRISA
bcf STATUS,RP0
Esto significa que los bits 0..3 están configurados como Salidas Digitales y los
pines 4..7 están configurados como Entradas Digitales.
Puerto B: Este puerto es netamente Digital, tiene 8 bits y solo basta con
modificar el Registro TRISB para especificar que bits son de Entrada y cuales de
Salida. Por defecto, luego de un Reset todos los puertos están configurados como
entradas (TRISX=11111111).
Puerto E: Este puerto tiene 3 bits y se puede configurar como E/S Digitales o
como entradas analógicas.Por defecto es Digital y hay que configurar si son
Entradas o Salidas por medio del Registro TRISE.
Problema 4. Colocamos una resistencia de 220ohms en serie con un LED a la salida del
pin RB0, el ánodo del LED se conecta con la resistencia y el cátodo a tierra. Se pide
encender el LED.
Código: [Descargar] [Ocultar] [Seleccionar]
;Activar el LED del pin RB0. A la salida del Pin RB0 se coloca una
;resistencia en serie con el ánodo del LED y el cátodo del LED a tierra.
LIST P=16F877A
INCLUDE<P16F877A.INC> ;Librería para el PIC16F877A
bsf PORTB,0 ;Mandando una señal ALTA "1" por RB0 para
encender
;el LED
goto $ ;Bucle infinito
ORG 0000H
bsf STATUS,RP0 ;Banco-1
bcf TRISB,0 ;RB0 como salida
bcf STATUS,RP0 ;Banco-0
REPITE ;Etiqueta REPITE
btfss PORTB,0 ;Es RB0=1?
goto ACTIVAR ;NO lo es -> salto hasta ACTIVAR
bcf PORTB,0 ;SI lo es -> RB0=0 (Apago el LED)
goto REPITE
ACTIVAR ;Etiqueta ACTIVAR
bsf PORTB,0 ;RB0=1 (Enciendo el LED)
goto REPITE ;Salto hasta REPITE
ORG 0000H
bsf STATUS,RP0 ;Banco-1
bsf TRISB,0 ;RB0 como entrada
clrf TRISD ;PORTD como salida
bcf STATUS,RP0 ;Banco-0
;=========================================
clrf PORTD ;PORTD=00 (Apago todos los LEDs)
REPITE
btfss PORTB,0 ;Es RB0=1? (Se presionó el pulsador?)
goto $-1 ;NO -> Regreso a la instrucción anterior
incf PORTD,1 ;SI -> PORTD=PORTD+1 (Encienden los LEDs)
btfsc PORTB,0 ;Es RB0=0? (Se soltó el pulsador?)
goto $-1 ;NO -> Regreso a la instrucción anterior
goto REPITE ;SI -> Repito el proceso o bucle
END ;Fin de Programa.
Bytes.
Llamado a Rutinas
instruccion1
instruccion2
ETIQUETA
instruccion3
instruccion4
.
.
.
instruccionN
GOTO ETIQUETA
.
.
Explicación: Las instrucciones 1,2,3,..N se ejecutan y luego del GOTO el contador de
programa PC se dirige hasta la posición ETIQUETA y se vuelven a ejecutar las
instrucciones 3,4,5,...N.
instruccion1
instruccion2
CALL RUTINA1
instruccion4
instruccion5
.
.
.
RUTINA1
instruccionN
instruccion(N+1)
.
.
RETURN
ORG 0000H
nop ;0
call RUTINA1 ;1
nop ;2
call RUTINA2 ;3
nop ;4
goto $ ;5
;****************************************
RUTINA1
nop ;6
return ;7
;****************************************
RUTINA2
nop ;8
call RUTINA1 ;9
call RUTINA3 ;A
nop ;B
return ;C
;****************************************
RUTINA3
return ;D
END
Luego de hacer un programa es lógico que queramos grabarlo en nuestro PIC para
poder probar su funcionamiento, para esto existen infinidad de grabadores y softwares
que nos permiten hacer esta tarea. Una vez grabado el programa muchas veces nos
damos con la sorpresa que no funciona nuestra aplicación y en muchos casos se debe a
que no configuramos antes el software para grabar el PIC, y nos dicen que se trata de
los FUSES, que debemos configurarlos, a que se refieren?
Bueno, los PIC's incluyen en una posición reservada de memoria (2007H) la famosa
Palabra de Configuración y a la cual solo se accede durante la grabación. El como
configuremos este registro determinará las características de funcionamiento del PIC.
Palabra de Configuración:
/ CP1 / CP0 / DEBUG / --- / WRT / CPD / LVP / BODEN / CP1 / CP0 / PWRTE#
/ WDTE / FOSC1 / FOSC0 /
- 13 -- 12 -- 11 -- 10 -- 9 -- 8 -- 7 -- 6 -- 5 -- 4 -- 3 --
2 -- 1 -- 0 -- bits
WDTE: Bit de Permiso del Timer del Perro Guardián. Se activa cuando se usa el Perro
Guardián o WDT en nuestras aplicaciones, se verá más adelante.
de esta manera nos aseguramos de tener configurados los FUSES usemos el software
que usemos (Ese código hace lo mismo que la configuración en WinPIC800 que
mostramos arriba).
Bytes.