Hola, aquí les traigo un pequeño manual de como programar un PIC en MICROCODE. Pero antes de empezar con el ejemplo les dejare un poco de teoría para que se familiaricen un poco acerca de que trata este programador.
Microcóde es un lenguaje de instrucciones a nivel de hardware o estructuras de datos que intervienen en la ejecución de instrucciones de código máquina de nivel superior en las unidades centrales de procesamiento, y en la implementación de la lógica interna de muchos controladores de canal, los controladores de disco, controladores de interfaz de red, procesadores de red, unidades de procesamiento de gráficos, y otros equipos. Reside en especial de memoria de alta velocidad y traduce las instrucciones de la máquina en secuencias de operaciones detalladas a nivel de circuito. Se ayuda a separar las instrucciones de la máquina de la electrónica subyacentes de modo que las instrucciones pueden ser diseñados y alterados más libremente. También hace que sea factible construir instrucciones de pasos múltiples complejas reduciendo al mismo tiempo la complejidad de la circuitería electrónica en comparación con otros métodos. Escribir microcódigo es a menudo llamada la microprogramación y el microcódigo en una implementación particular del procesador es a veces llamado un microprograma.
MicroCode Estudio
MicroCode Studio es una poderosa, visual entorno de desarrollo integrado (IDE) con un Circuito de Depuración (ICD) capacidad diseñado específicamente para MicroEngineering Labs PICBASIC ™ y PICBASIC compilador PRO ™.
El editor principal proporciona resaltado de sintaxis completa de su código con ayuda sensible al contexto de palabras clave y sugerencias de sintaxis. El explorador de código le permite saltar automáticamente para incluir archivos, define, constantes, variables, alias y modificadores, los símbolos y etiquetas, que están contenidos dentro de su código fuente. Corte total, copiar, pegar y deshacer se proporciona, junto con la búsqueda y substituye características.
El compilador PicBasic Pro (PBP) es nuestro lenguaje de programación de nueva generación que hace mas fácil y rápido para usted programar micro controladores Pic micro de Microchip Technology .
El lenguaje Basic es mucho más fácil de leer y escribir que el lenguaje ensamblador Microchip.
El PBP es similar al “BASIC STAMP II” y tiene muchas de las librerías y funciones de los BASIC STAMP I y II. Como es un compilador real los programas se ejecutan mucho más rápido y pueden ser mayores que sus equivalentes STAMP.
PBP no es tan compatible con los BASIC STAMP como nuestro compilador PicBasic es con el BS I. Decidimos mejorar el lenguaje en general. Una de estas decisiones fue agregar IF ...THEN...ELSE...ENDIF en lugar de IF.. THEN (GOTO) de los Stamps. Estas diferencias se ven luego en este manual.
PBP por defecto crea archivos que corren en un PIC 16F84-04/P con un reloj de 4 Mhz. Solamente muy pocas partes son necesarias capacitores de dos capacitores de 22 pf para el cristal de 4Mhz un resistor de 4.7K en el pin/MCLR y una fuente de 5 volt. Otros micros PIC además del 16F84, así como otros osciladores de frecuencias distintas pueden ser usados por este compilador.
Estructura
de un programa
PIC
Definir PIC a usar, nos da la opción de elegir
el PIC en la siguiente barra desplegable:
Aquí
se debe escoger cual utilizaremos
En este ejemplo se usará el PIC16F628A
LIBRERIAS EXTERNAS Y FUSIBLES:
Para
colocar cualquier librería externa es necesario poner INCLUDE “nombre.bas ”
La
librería que siempre deben poner es
bs2defs.bas
Estas
deben colocarse al inicio del código del programa
Otros
son:
"modedefs.bas"
Existen otras pero depende de las aplicaciones que desarrolles saber cual usar, pero la librería bs2defs.bas es la más requerida por el momento.
FUSIBLES
(En lo personal programar fusibles yo me salto
esta parte porque con el programador le puede decir que fusibles utilizar,
aunque cada quien tiene su manera de trabajar.)
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic1XFXXX, FUSIBLE
Lo único
que cambia en cada PIC es lo parte del oscilador:
XT
cristal de cuarzo
INTRC
I/0 Interno
·
INTRC_OSC_NOCLKOUT
(Tambien se puede escribir como OSC_XT)
·
WDT_OFF (NO reiniciar si una se excedio el tiempo en
una rutina)
·
PWRT_ON
·
BOD_ON
·
MCLR_OFF
·
LVP_OFF (Bajo nivel de Programacion)
·
CPD_OFF
·
PROTECT_ON
(Evitar que otras personas pueden leer nuestro codigo)
VARIABLES
Son
temporalmente alojadas en la memoria RAM del PIC
Pic
Basic Pro (PBP) maneja tres tipos de variables
Tipo de Variable
|
Tamaño
|
Bit
|
1
|
Byte
|
8
|
Word
|
16
|
Sintaxis:
Etiqueta
VAR tipo (.modificador)
Ejemplo:
JUAN VAR BIT
OSCAR VAR BYTE
SAN VAR WORD
RENOMBRAR
Se puede
incluso nombrar una variable con otro nombre incluso algún registro o parte del
registro
Ejemplo:
FERNANDO VAR JUAN (Algo
innecesario pero solo volvemos a renombrar una variable)
HOLA VAR OSCAR.0 (Usa solo el primer bit de la variable
byte OSCAR)
AGUSTIN VAR SAN.BYTE0 (Usa solo el primer byte de la variable byte SAN)
JAVIER VAR SAN.BYTE1 (Usa solo el SEGUNDO byte de la variable byte
SAN)
LED VAR PORTB.0 (Esta si es muy usada, Son para nombrar los puertos
a palabras que nos faciliten como recordarlos)
CONSTANTES
Es muy
similar a como nombramos a las variables
Sintaxis:
Etiqueta
CON valor
Ejemplos:
·
RATON CON 3
·
RATAS CON RATON * 100
·
CONTROL CON %11001100
·
LEDS CON $CC
Tipos de
constantes:
Prefijo
|
Valor
|
Tipo
|
100
|
DECIMAL
|
|
%
|
01100100
|
BINARIO
|
$
|
64
|
HEXADECIMAL
|
Caracteres
por su valor en Decimal:
Caracter
|
Tipo
|
Valor
|
“A”
|
ASCII
|
65
|
“d”
|
ASCII
|
100
|
ARRAYS
Este
tipo de arreglos de declaran de manera similar a las variables.
Sintaxis:
Etiqueta
VAR tipo (# DE ELEMENTOS)
Tipo de Variable
|
# Max de
Elementos
|
Bit
|
256
|
Byte
|
96
|
Word
|
48
|
EJEMPLO
P1
CON 000010
P2
CON 001000
P3
CON 010000
P4
CON 000001
P5
CON 000001
P6
CON 010000
P7
CON 001000
P8
CON 000010
SECUENCIA
VAR BYTE [8]
X VAR BYTE
SECUENCIA[1]
= P1
SECUENCIA[2]
= P2
SECUENCIA[3]
= P3
SECUENCIA[4]
= P4
SECUENCIA[5]
= P5
SECUENCIA[6]
= P6
SECUENCIA[7]
= P7
SECUENCIA[8]
= P8
PUERTOS Y REGISTROS
Los
puertos y registros pueden modificarse e incluso asignarles su valor a una variable:
Ejemplos:
%10101010
= PORTB
Se le
asigna el valor en binario en sus ocho pines
VARIABLE = PORTB
& $0F
El valor
de los primeros 4 bits del PORTB se almacenan en VARIABLE
PINES
Al igual
que los puertos, a los pines se les puede asignar un valor y darle su valor a
una variable
Ejemplo:
·
PORTB.1
= 1
·
LED VAR PORTB.1
LED
= 1
·
LED VAR PORTB.1
HIGH LED
Los ejemplos anteriores todos son usados para
prender un LED
La forma de asignarle a un pin la funcion de salida
ò entrada; se realiza asignándole el valor directamente de los registros TRIS{puerto},
recordando que:
¢
1
– Función de entrada
¢
0
– Función de salida
Ejemplo:
·
TRISA
= %11110000 or TRISA = $F0
·
TRISB
= %01010101 or TRISB = $55
·
TRISA
= 000000 or TRISA = $00
·
TRISB
= %11111111 or TRISB = $FF
COMENTARIOS:
Se
pueden colocar comentarios en el compilador PBP con el fin de recordar o hacer
las comprensible al usuario en futuras revisiones el codigo de programa, dentro
del PBP estos se colocan posterior a una comilla.
EJEMPLO:
LED VAR
PORTB.0 ‘Al pin0 del puerto B se
llama LED
TRISB.0 = 0 ‘Bit 0 del puerto B pin de salida
PORTB.0 = 1 ‘Enciende el pin0 donde esta el LED
DEFINE
Se
utilizan principalmente para recursos predefinidos dentro del dispositivo a
programas (PIC), por ejemplo el PWM, ADC, LCD, OSCILADOR, entre otros.
Ejemplo:
DEFINE OSC 4 ‘Oscilador
a 4 Mhz
OPERADORES MATEMATICOS
El
compilador PBP incluye varios operadores matemáticos y realiza las operaciones en
forma jerárquica, es por ello la necesidad de utilizar paréntesis en algunos
casos, por ejemplo:
A
= (B+C) * (D-E)
Todas
las operaciones matemáticas se realizando con 16 bits de precisión
No
trabaja puntos decimales
OPERADOR
|
FUNCION
|
+
|
Suma
|
-
|
Resta
|
*
|
Multiplicación
|
**
|
Multiplicación con 16 Bits
|
*/
|
La mitad de la multiplicación a 16 Bits
|
/
|
División
|
//
|
Residuo
|
<<
|
Corrimiento Izquierda
|
>>
|
Corrimiento Derecha
|
ABS
|
Valor Absoluto* (completo)
|
COS
|
Regresa el coseno en 8 bits de un valor
|
DCD
|
Pone “1” la posición indicada y “0” las demás de una variable
|
DIG
|
Regresa el valor de una posición en decimal
|
DIV 32
|
Entrega el resultado de la operación anterior entre 100 y lo guarda
en una variable
|
MAX
|
Regresa el valor máximo respecto 2 numeros
|
MIN
|
Regresa el valor minimo respecto 2 numeros
|
REV
|
Invierte los 4 btis menos significativos
|
SIN
|
Regresa el valor del seno en 8 bits
|
SQR
|
Regresa el cuadrado de una variable
|
&
|
Operación AND
|
|
|
Operación OR
|
^
|
Operación OR EXCLUSIVA
|
~
|
Operación NOT
|
&/
|
Operación NAND
|
|/
|
Operación NOR
|
^/
|
Operación XNOR
|
MULTIPLICACIÓN:
W1 = W0 *
1000
Multiplica WO por 1000 y pone el resultado en W1
W2 = W0 **
1000
Multiplica W0 por 1000 y coloca los 8 bits mas
significativos de 16 bits en W2
W3 = W1 */
WO
Multiplica W1 por W0 y regresa la mitad de los 16
bits en W3
DIVISION
W1
= W0 / 1000
Divide
WO entre 1000 y pone el resultado en W1
W2
= W0 // 1000
Divide
W0 entre 1000 y coloca el residuo en W2
SHITF
B0 = B0 <<
3
Desplaza un “1” 3 posiciones a la Izquierda (como
multiplicar por 8) y guarda en B0
W1 = W0 >>
1
Desplaza ”1” una posición a la izquierda (como
dividir entre 2) y guarda en W1
OPERADORES
DE COMPARACIÓN
OPERADOR
|
DESCRIPCIÓN
|
= or ==
|
Igual
|
<>Or ¡=
|
Diferente
|
<
|
Menos que
|
>
|
Mayor que
|
<=
|
Menso o igual que
|
>=
|
Mayor o igual que
|
OPERADORES LOGICOS
OPERADOR
|
DESCRIPCIÓN
|
AND or &&
|
Efectúa una operación AND
|
OR or ll
|
Efectúa una operación OR
|
XOR or ^^
|
Efectúa una operación XOR
|
NOT AND
|
Efectúa una operación NOT AND
|
NOT OR
|
Efectúa una operación NOT OR
|
NOT XOR
|
Efectúa una operación NOT XOR
|
Ejemplos:
IF
(A==B) AND (B>C) THEN
……..
ENDIF
Si la variable A es igual que B y la variable B es
mayor que C, solo entonces haz…….
IF, FOR,
WHILE, CASE:
IF
IF...THEN
IF Comp {AND/OR Comp...} THEN Label
' PRO version only
IF Comp {AND/OR Comp...} THEN
Statements...
ELSE
Statements...
ENDIF
Ejemplos:
IF B0 <> 10 THEN
B0 = B0 + 1
B1 = B1 - 1
ENDIF
IF B0 = 20 THEN
led = 1
ELSE
led = 0
ENDIF
Lo
común en un if es poner la condición que se valla a cumplir, seguido por un
THEN que son todas las instrucciones que se realizaran si se cumple el if sino
se debe colocar un ELSE para que sepa que hacer en caso de que no se
cumpla. Aquí son muy usado los
operadores lógicos o de comparación
FOR
FOR X=1 TO 10
LED = 1
PAUSE 50
LED =
0
PAUSE 50
NEXT
Esta estructura es la mas básica de un FOR que es
básicamente realizar el conjunto de instrucciones hasta que la variable llegue
a la cantidad deseada. Existen mas
cosas, como el incremente que no sea de uno en uno.
WHILE
WHILE
Condition
Statements...
WEND
Statements...
WEND
Se realizará hasta que la condicion sea verdadera.
Ejemplo:
INICIO2:
ADCIN 0, adval
valor = 30 * adval
resul = valor/1024
LCDOUT $FE,1
LCDOUT
$FE,$80," ", #resul
LCDOUT
$FE,$C0,"mA1"
Pause 100 ' Wait .1 second
while PORTD.2 = 1
Goto INICIO2 ' Do it forever
wend
(GOTO significa en al lugar donde el nombre (en este
caso) INICIO2 aparezca)
Mientras el puerto d.2 sea igual a 1 realizará
siempre esta subrutina en caso de que sea 0 continuará con el resto del código.
CASE
SELECT CASE var
CASE expr1 {, expr...}
statements
CASE expr2 {, expr...}
statements
{CASE ELSE statements}
END SELECT
CASE expr1 {, expr...}
statements
CASE expr2 {, expr...}
statements
{CASE ELSE statements}
END SELECT
EJEMPLO:
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
SUBRUTNA
En nuestro código, pueden haber ciertas
instrucciones o conjunto de instrucciones que se repiten mucho por ello es
necesario de lugar de implementarla 10 veces en el código hacer una subrutina
para que ocupen muchos líneas de código a esto me refiero a que solo basta con
“llamar” a la subrutina para que el programa valla a ejecutarlo.
Nombrar a un subrutina es fácil, se colocan las
subrutinas fuera de nuestro programa principal y normalmente se colocan al
final, pero antes del end del programa,
se pueden nombrar de cualquier forma solo debe contener : al final;
ejemplo:
HOLA:
Al final de esta subrutina debe tener un GOTO a la
sección del programa principal o donde sea requerido que continue.
Si queremos llamarlas solo se debe colocar GOSUB
“nombre”
Ejemplo:
GOTO send
...
send:
send:
SEROUT 0,N2400,["Hi"]
Los programas se deben guardar con la extensión
.pbp
Al ejecutarlos correctamente no deberá aparecer
ningún error y deberá decir
Quiza se tarde un poco al buscar en sus carpetas
donde esta ubicado el compilador
Ahora solo deben colocar el punto .hex que genero
el programa a un PIC y probarlo pero sino puede ir a proteus armar un circuito
rápidamente y probarlo.
TU PRIMER PROGRAMA:
Una vez repasado todos los puntos anteriores solo queda hacer un primer programa
'Aprendiendo a hacer tu primer programa en MicroCode
'Como habras notado, para colocar mensajes se debe colocar '
'Ahora bien primeramente uno debe escoger el PIC que usara para programar
'Es escoge en la siguiente sección, escoges el que mas te agrade
'Empecemos
INCLUDE "bs2defs.bas" 'es la libreria mas usada y que siempre usaremos para lso programas
DEFINE osc 4 'Definimos que el crital de cuarzo a usar sera de 4MHz
'Fusibles
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_ON
'Aquí esta la manera de colocar los fusibles para este PIC 628A es necesario escoger bien el
'cristal de cuarzo interno
'Variables
LED1 VAR PORTB.0 'Colocamos nombres a cada uno de los puertos por comodidad, aunque se puede omitir
LED2 VAR PORTB.1
LED3 VAR PORTB.2
'Ahora definiremos que puertos serán de entradas o salidas por medio de los TRIS
TRISA = %11111111 'El uno significa entrada y el % es que es numero binario
TRISB = 000000 'Todo el puerto B será salida
'Programa principal
INICIO: 'es necesariamente poner : para que sepa que es una etiqueta
'Prenderemos LED's
LED1 = 1 ' colocar = 1 es poner ese PIN con un 1 logico
HIGH LED2 ' es otra manera de colocar un 1 lógico
LED3 = 3
PAUSE 1000 ' pause significa el tiempo de retardo que estaran prendidos, cada 1000 es 1 seg por tener un cristal de 4 Mhz
'Ahora apagaremos los led's
LED1 = 0 ' colocara en este pin un 0 logico
Pause 500
LOW LED2 ' Otra manera de colocar un 0 logico
PAUSE 500
LED3 = 0
PAUSE 500
GOTO INICIO ' Será el ciclo infinito para que se ejecute el programa siempre que este conectado
END
'Ahora a compilarlo, debemos escoger el compilador y guardar primeramente el programa con la extención .pbp
'Buscaremso el compilador,
'Ahora a compilarlo, sino ocurrieron errores nos aparecera en la esquina inferior derecha que lo hemos hecho bien :D
LINK DE DESCARGA DEL PROGRAMA:
http://melabs.com/resources/win_ide.htm
MANUAL DE USO:
http://melabs.com/resources/pbpmanual/
PARTE 2
http://batiz9.blogspot.mx/2014/06/primer-programa-microcode-pbp-2-pic.html
Que gran aporte tu blog. No te imaginas cuanto me ha servido. Sin saber nada de PIC gracias a tu ayuda hasta envío información por bluetooth desde mi 16F877A y el HC-05 bluetooth para Arduino
ResponderEliminarGracias muy bueno. Continua haciendo mas tutoriales de microcodestudio para los que solo sabemos programar en basic
ResponderEliminarme dijeron que puedo poner "portb=001100" que seria lo mismo que poner "high portb.3:portb.2" me pueden indicar que estaria mal xq según el compilador esta mal la sintaxis del %. Gracias
ResponderEliminarBuen tutorial. Para iniciar en este tema.
ResponderEliminar