Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROGRAMACION PIC
16F877A CON PICBASIC
BASICO I
2009
Trujillo-Perú
Ing. Rene E. Gonzales Vásquez
Contenido
FAMILIA DE MICROCONTROLADORES PIC .............................................................................2
RECONOCIMIENTO DE PUERTOS DEL MICROCONTROLADOR ...............................................7
RESUMEN DE DECLARACIONES BÁSICAS DEL PBP ................................................................16
IDENTIFICADORES .................................................................................................................18
ETIQUETAS DE LINEA (LABELS) ..............................................................................................18
VARIABLES.................................................................................................................................18
ARRAYS (ARREGLOS) ................................................................................................................18
CONSTANTES ............................................................................................................................19
CONSTANTES NUMÉRICAS ......................................................................................................19
SARTA DE CONSTANTES: .........................................................................................................19
PINS: .........................................................................................................................................20
COMENTARIOS .........................................................................................................................20
DECLARACIONES MÚLTIPLES ................................................................................................21
INCLUDE ...................................................................................................................................21
DEFINE .....................................................................................................................................21
OPERADORES MATEMÁTICOS ..................................................................................................22
Operadores de comparación ..................................................................................................23
Operadores lógicos ...............................................................................................................23
ESTRUCTURAS DE CONTROL ...................................................................................................24
FOR – NEXT ..........................................................................................................................24
IF - THEN ..............................................................................................................................25
WHILE - WEND ........................................................................................................................26
SELECT – CASE.....................................................................................................................27
UNTIL - REPEAT .................................................................................................................29
ANTES DE EMPEZAR..................................................................................................................29
REQUERIMIENTO MINIMOS ...................................................................................................30
...................................................................................................................................................30
INTRODUCCIÓN A LOS PERIFERICOS ..............................................................................31
INDICADORES ......................................................................................................................31
LEDS.......................................................................................................................................31
EJEMPLO CON MATRIZ 5X7 ................................................................................................43
EJEMPLO CON LCD ...................................................................................................................47
Se describe los puertos y pines del microcontrolador, así mismo algunos ejemplos en PBP
con las puertas de E/S digitales usando Led, Display, Matrices, LCD.
Así mismo se pueden reemplazar Led, Display, Matrices por Transistores, Opto acopladores,
Relay y otros que solo requieran un nivel alto o bajo, igual activar sistemas de potencia
con Triac, SCR, Mosfet.
PIC 16F877A
PUERTA A
05h PORTA - - RA5 RA4 RA3 RA2 RA1 RA0 -0x 000 -0u 000
85h TRISA - - Registro de configuración de la Puerta A -11 1111 -11 1111
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 -0- 0000 -0- 0000
x significa desconocido
u significa que no cambia
x significa desconocido
u significa que no cambia
significa que no está implementado y se lee como 0
PUERTA C
Consta de 8 líneas bidireccionales cuyo sentido se configura mediante el
registro TRISC. Todas las patas de esta puerta tienen multiplexadas
diferentes funciones:
PUERTA E
Solo la tienen los PIC de 40 pines. Dispone de tres pines multifunción, que
se configuran como entrada o salida, según el valor de los tres bits de menos
peso del registro TRISE
Ejemplo 2.1:
Por el portb.0 de un microcontrolador está conectado un led que deseamos que
encienda y apague 5 veces cada vez que se presione un pulsador conectado al
porta.0
Esquema:
INICIO / FIN
El diagrama de flujo del ejemplo 2.1 podría quedar de esta forma siguiendo de
forma clara el seudocódigo
Inicializa
contador
Inicializar C=1
variables
Portb.0 =1
Encender
led
Leer
switch
Pausar 10
segundos
N
Porta.0=1
Portb.0 =
Y 0
Apagar
Subrutina led
prender
apagar
Pausar 10
segundos
Incementar
contador c =
c+1
N
Contador = 5
Regres ar A
inicialización variables
C VAR BYTE
SW1 VAR PORTA.0
LED VAR PORTB.0
TRISA = 1
TRISB = 0
LED = 0
BUCLE: IF SW1 = 0 THEN BUCLE
GOSUB PRENDEYAPAGA
GOTO BUCLE
Etiqueta:
Serout 0, N2400, [“Hola, Mundo!”, 13, 10]
Goto Etiqueta
VARIABLES
Son creadas usando la palabra VAR. Pueden ser bits , bytes ó word.
El espacio para cada variable es automáticamente almacenado en la memoria
del microcontrolador.
ARRAYS (ARREGLOS)
Los arreglos de variables pueden ser creados en una manera similar a las
variables.
Etiqueta VAR tipo (número de elementos)
CONSTANTES
Las llamadas constantes pueden ser creadas de manera similar a las variables.
Etiqueta CON expresión constante
SO con 3
FI con l0
CONSTANTES NUMÉRICAS
PBP permite definir constantes numéricas en tres bases: decimal, binario y
hexadecimal.
SARTA DE CONSTANTES:
Una sarta contiene uno o más caracteres y es delimitado entre comillas.
“
HOLA” ‘ String (forma abreviada de “H”, “O”, “L”, “A”)
Las sartas son usualmente tratadas como una lista de valores de caracter
individual.
referidos por un número, 0-15. Estos números hacen referencia a los pins
que distribuidos sobre diferentes puertos del hardware del
microcontrolador dependiendo del número de pins tiene el microcontrolador
TRISC = % 10101010 los pins pares como salidas y los impares como
entradas.
COMENTARIOS
Comienza con la palabra clave REM o el apóstrofe (´). los caracteres de esa
línea se ignoran.
W2 = W0
W0 = W1
W1 = W2
Es lo mismo que:
W2 = w0 : W0 = W1 : W1 = W2
INCLUDE
Se puede agregar archivos fuente BASIC a un programa PBP usando INCLUDE.
Solo en programas que se necesite definir el modo serial u tra.
El código fuente del archivo incluido son insertadas dentro del programa
donde se coloca el INCLUDE.
INCLUDE “modedefs.bas”
DEFINE
Algunos elementos, como el oscilador y las ubicaciones de los pin LCD, son
predefinidas en PBP.
Sin embargo, DEFINE permite a un programador cambiar estas definiciones
si lo desea.
Define puede ser usado para cambiar el valor predefinido del oscilador, los
pins de DEBUG, el baud rate y las ubicaciones del pin LCD además de otras
definiciones, deberá estar en mayúsculas.
OPERADORES MATEMÁTICOS
Operaciones matemáticas en orden jerárquico.
Significa multiplicación y división son efectuados antes que suma y resta,
por ejemplo. Para asegurarse que las operaciones son efectuadas en el orden
que se desea , use paréntesis para agrupar las operaciones.
A=(B+C)*(D-E)
Todas las operaciones matemáticas se realizan sin signo y con una precisión
de 16 bit.
Operadores de comparación
Se usan en declaraciones IF ... THEN para comparar una expresión con otra
.Los operadores soportados son :
Operador Descripción
= o == Igual
<> o != No igual
< Menor
> Mayor
<= Menor o igual
>= Mayor o igual
Operadores lógicos
Entregan un resultado CIERTO / FALSO de su operación. Valores 0 son
tratados como falso. Cualquier otro valor es cierto. Se usan junto a
operadores de comparación en una declaración IF ... THEN.
Operador Descripción
AND o && AND lógico
OR o I I OR lógico
XOR o ^ ^ OR exclusivo lógico
NOT AND NAND lógico
NOT OR NOR lógico
NOT XOR NXOR lógico
FOR – NEXT
Permite ejecutar repeticiones de declaraciones un número de veces, usando
una variable como contador.
FOR i = 1 To 10
Serout 0, N2400, [#i, “ ”]
NEXT i
Serout 0, N2400, [10]
DESDE EL INICIO
HASTA EL FIN
ACCION 1
ACCION 2
FIN
IF - THEN
Efectúa comparaciones, es esencialmente un Goto si la condición es cierta,
el programa ira hacia la etiqueta que sigue al THEN; Si la condición es falsa
el programa va a continuar hacia la próxima línea después del IF – NEXT.
Otra declaración no puede ser puesta después del THEN si no que debe ser una
etiqueta
IF B0 = 10 THEN Visor
PORTB.0=0
N
CONDICION
Para IF doble o doble condicional es cuando queremos que dos valores juntos
se cumplan
IF B0=10 THEN
IF B1=10 THEN
LCDOUT $FE, 1, “ALERTA”
ENDIF
ENDIF
WHILE - WEND
Para ejecutar repeticiones tantas veces sean necesarias siempre y cuando
se evalué una condición y esta sea cierta, cuando deja de ser cierta
continuara con la declaración siguiente a WEND
INSTRUCCIONES
Y CONDICION
CRITERIO
VERDADERO
SELECT – CASE
Sirve para asignar y clasificar en función de una única variable, pero con
varios posibles resultados
variable
FIN
i=0
REPEAT
PORTB.0[i] = 0
i=i+1
UNTIL i > 7
ANTES DE EMPEZAR
HARDWARE
Primero, asegurar que el pin MCLR está conectado a 5 voltios protegido con
una resistencia de 10 k, es posible que falle si no se pone dicha resistencia
Sexto, acordarse que el Pic se coloca como entrada cuando arranca, asegúrese
de configurar adecuadamente el PIC al inicio del programa
SOFTWARE
Una vez visto algunas propiedades del microcontrolador PIC 16f877a, y lo básico en
programación podemos iniciar a programar.
ADVERTENCIA
En estos apuntes no se va considerar colocar los fusibles por ser ejemplos
básicos y demostrativos.
La fuente de alimentación es de 5v dc y debe colocarse el positivo VDD en los
pines 11 y 32, negativo VSS pines 12 y 31, así mismo se puede colocar energía
en un solo pin de ambos (VDD, VSS)
REQUERIMIENTO MINIMOS
INDICADORES
LEDS
Led “light emitting diode” diodo emisor de luz
R=(V-Vled) / I
Entonces para un led indicador color rojo de Vled = 1.2v, en el pin del pin de
salida es 5v idealmente pero con carga podría bajar a 4.8 v aproximadamente
y una corriente de 20ma, resultara
R=(5v-1.2) / 20ma
R= 180 ohmios
1.- Se requiere que un led prenda y apague cada medio segundo (Titilea led ), en el pin 0 del
puerto b
2.- se requiere que por el puerto D simule las luces del auto fantástico (leds ida y vuelta)
X VAR BYTE
LEDS VAR PORTD
TRISD = 0
LEDS = 1
PROG:
FOR X = 1 TO 7
LEDS = LEDS << 1
PAUSE 50
PORTD = LEDS
NEXT
FOR X = 1 TO 7
LEDS = LEDS >> 1
PAUSE 50
PORTD = LEDS
NEXT
GOTO PROG
END
REPETICION:
PORTD = CUENTA
PAUSE 250
CUENTA=CUENTA + 1
GOTO REPETICION
END
X VAR BYTE
NUM VAR BYTE
OPTION_REG=0
INICIO:
TRISB=%00000000
PORTB=%00000000
BUCLE:
FOR X=9 TO 0 STEP-1
GOSUB CONVERTIR
PORTB = NUM
PAUSE 100
NEXT
HIGH NUM
PAUSE 100
GOTO BUCLE
CONVERTIR:
LOOKUP X,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F], NUM
NUM= NUM ^ $FF
RETURN
END
TRISB= $80
BUCLE:
ALEATORIO = 0
GOSUB CONVERT
PORTB = VALOR
GENERADOR:
RANDOM ALEATORIO
IF PORTB.7 = 1 THEN GENERADOR
GOTO RANGO
RANGO:
ALEATORIO = ALEATORIO & 7
IF ALEATORIO <> 7 THEN OTRO
RANDOM ALEATORIO
GOTO RANGO
OTRO:
GOSUB CONVERT
PORTB = VALOR
PAUSE 100
GOTO GENERADOR
CONVERT:
LOOKUP DADO, [$3F,$06,$5B,$4F,$66,$7D,$07,$7F,$6F], VALOR
VALOR = VALOR ^ $FF
RETURN
END
N VAR BYTE
VALOR VAR BYTE
PORTB=0
TRISB=0
REPETIR:
N=0
DISPLAYAR:
GOSUB CONVERTIR
PORTB=VALOR
N=N+1
PAUSE 500
IF N=10 THEN REPETIR
GOTO DISPLAYAR
CONVERTIR:
LOOKUP N, [ $3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], VALOR
RETURN
END
9.- Programar PIC para que visualice por display de 9 a– 0 de forma repetitiva con FOR
NEXT (DECRECE)
N VAR BYTE
VALOR VAR BYTE
PORTB=0
TRISB=0
REPETIR:
FOR X=9 TO 0 STEP -1
GOSUB CONVERTIR
PORTB=N
PAUSE 500
NEXT
DISPLAYAR:
HIGH N
PAUSE 500
LOW N
PAUSE 500
GOTO REPETIR
CONVERTIR:
LOOKUP N, [ $3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], VALOR
RETURN
END
‘ Declaracion de variables
uni var byte
dece var byte
cente var byte
mili var byte
uni=0
dece=0
cente=0
mili= 0
goto ultimo
primero:
for uni=0 to 9 ' contar unidades
gosub unidades ' saltar e imprimir
if uni=9 then segundo ' si uni=9 salta a segundo
next uni ' otra unidad
unidades:
PORTB = 16 + uni ' imprime unidades
PAUSE 100
return ' retorna
segundo:
for dece=1 to 9
for uni=0 to 9
pause 100
gosub decenas ' salta e imprime decenas y unidades
next uni
if dece=9 then tercero
next dece
decenas:
PORTB = 16 + uni ' imprime unidades y decenas
pause 2
PORTB = 32 + dece
pause 2
return
tercero:
for cente = 1 to 9
for dece = 0 to 9
for uni = 0 to 9
pause 100
gosub centenas
next uni
next dece
if cente = 9 then ultimo
next cente
centenas:
PORTB = 16 + uni
PAUSE 3
PORTB = 32 + dece
PAUSE 3
portb = 64 + cente
1 0 0 0 1 1 0 0
1 0 0 1 1 0 0
1 0 0 1 0 0 0 1 0
1 0 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 0 1 0 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 0
1 0 1 1 0 0
1 0 1 0 0 0 1 0
1 0 1 0 0 1 0 0
1 0 1 0 0 1 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 0 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0 0 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 1
1 0 1 0 0 1
1 0 1 0 0 1
1 0 0 0 0 1 0 0 1
1 0 1 0 0 0 1
1 0 1 0 1
1 0 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
DEFINE LOADER_USED 1
OPTION_REG = 0
ADCON1=7
TRISA=0
TRISB=0
X VAR BYTE
inicio:
FOR X = 1 TO 20
PORTA=%000001 : PORTB=%10000001 : PAUSE 2
PORTA=%000010 : PORTB=%11100110 : PAUSE 2
PORTA=%000100 : PORTB=%11100110 : PAUSE 2
PORTA=%001000 : PORTB=%10000001 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X
FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11001001 : PAUSE 2
PORTA=%000010 : PORTB=%10110110 : PAUSE 2
PORTA=%000100 : PORTB=%10110110 : PAUSE 2
PORTA=%001000 : PORTB=%10000000 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X
FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11011101 : PAUSE 2
PORTA=%000010 : PORTB=%10111110 : PAUSE 2
PORTA=%000100 : PORTB=%10111110 : PAUSE 2
PORTA=%001000 : PORTB=%11000001 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X
FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11100011 : PAUSE 2
PORTA=%000010 : PORTB=%11011101 : PAUSE 2
PORTA=%000100 : PORTB=%10111110 : PAUSE 2
PORTA=%001000 : PORTB=%10000000 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X
FOR X = 1 TO 20
PORTA=%000001 :PORTB=%10110110 : PAUSE 2
PORTA=%000010 :PORTB=%10110110 : PAUSE 2
PORTA=%000100 :PORTB=%10110110 : PAUSE 2
PORTA=%001000 :PORTB=%10000000 : PAUSE 2
PORTA=%100000 :PORTB=%11111111 : PAUSE 2
NEXT
GOTO inicio
END
Existen en varios formatos de 14 pines, los de 16 pines con retro iluminados, así mismo 2x8,
2x16, 4x20 (filas por columnas). Estos módulos responden a un conjunto de instrucciones o
comandos de control que son enviadas por el microcontrolador
COMANDOS DE CONTROL
Con este ejemplo, vamos a utilizar el puerto D del PIC, configurando los pines de datos
(DREG), los pines de Habilitación (E) y selección de registro (RS)
12*- VISUALIZAR EN LCD HOLA AMIGO PRIMERA LINEA, USAR PUERTO B PARA EL LCD
INICIO:
LCDOUT $FE, 1
LCDOUT $FE, 2
LCDOUT “HOLA AMIGO”
PAUSE 1000
GOTO INICIO
X VAR BYTE
DATOS VAR BYTE
LCDOUT $FE, $7
LCDOUT $FE, 1
INICIO:
LCDOUT $FE,$80
FOR X=0 TO 25
LOOKUP X, [“PRACTICANDO CON LCD”], DATOS
LCDOUT, DATOS
PAUSE 200
NEXT
GOTO INICIO
CONV1 CON 19
CONV2 CON 53
TRISA = 1
TRISB = 0
PAUSE 500
ADCON1 = 0
ADCON0 = %11000001
LCDOUT $FE, 1
INICIO:
ADCIN 0, RES
VOLTS1 = RES * CONV1
VOLTS2 = RES * CONV2
VOLTS2 = VOLTS2 / 100
VOLTS1 = VOLTS1 + VOLTS2
LCDOUT $FE, 1, "V=",DEC4 VOLTS1,"v"
LCDOUT $FE, $C0, "VOLTIMETRO"
PAUSE 100
GOTO INICIO
END