Sunteți pe pagina 1din 44

E.1.

PIC 18 Simulator IDE

E.1.1. Instalación y configuración del software PIC Simulator IDE (PSI)

La instalación del software es simple, basta hacer doble click en el icono y se


instalará automáticamente. Se debe elegir donde va alojarse el software, generando un
icono en el escritorio para fácil acceso. Son incluidas ademas unas guías de usuario en
idioma ingles para comprender de forma fácil la propiedades y bondades que este
software entrega al usuario.

Para configurar el software PIC 18 Simulator IDE, se debe comenzar con el tipo
de microcontrolador que se desea trabajar. Para el proceso de este proyecto de titulo se
elige el microcontrolador PIC 18F4550, el cual se escoge de entre la gama disponible en
la ventana. Ver Figura A.33.

Figura A.33. Elección de Microcontrolador 18F4550.

A continuación se elige el cristal, que genera la base de tiempo para todas las
operaciones, para ello se dirige a Option, luego a Change Clock Frequency y aparece la
siguiente ventana, cambiando manualmente la velocidad del cristal. Ver Figura A.34.

Figura A.34. Elección de frecuencia del cristal oscilador.

Si se va recibir datos provenientes de las entradas análogas, se configura el


dispositivo para que realice la conversión análoga a digital en cierto intervalo de tiempo,
esto se puede modificar en el siguiente parámetro en Options. Ver Figura A.35.
Figura A.35. Elección del tiempo de conversión para ADC.

Dependiendo del lenguaje a usar para programar el microcontrolador, en este


caso se utiliza el lenguaje Basic, para ello se elige en la opción Tools, la ventana para
trabajar en lenguaje Basic. Ver Figura A.36.

Figura A.36. Elección de programación, en lenguaje Basic.

Cuando se realiza la compilación, el software PSI, compila, genera y guarda


archivos con extensión .bas, .hex, .lst y .asm, y es necesario guardar el programa hecho
en la ventana de programación en Basic, es por esto, que se debe crear una carpeta
donde se vaya alojar el programa principal y las demás extensiones. Ver Figura A.37.

Figura A.37. Archivos generados al compilar en PSI.


Si se desea ver los pines del microcontrolador y saber que se está manipulando al
programar en Basic, es posible abrir una ventana con la distribución de los pines y la
interacción con el simulador incorporado, para ello es necesario ir a la opción de Tools.
Ver Figura A.38.

Figura A.38. Mostrar distribución de pines del microcontrolador.

E.1.2. Comandos básicos

Algunos de los comandos utilizados se muestran a continuación con algunos


ejemplos de su utilización. Ademas para saber como identificar a cada uno de ellos o
cada tipo de estructura escrita en la ventana de programación de Basic, se muestra una
lista de como son representadas cada uno de ellos con un color especifico de escritura:
• Los comandos de configuración y programación que son mostrados en la
ventana de programación Basic se caracterizan por ser presentados de color
azul;
• Las variables utilizadas, nombres de subrutinas, numeraciones son
representadas por el color negro;
• Los comentarios escritos posterior del la comilla “ ‘ ” en las lineas de comando
se destacan al ser escritas en la ventana de Basic con el color verde;
• Para agregar texto a la linea de programación se utiliza “ ‘ ” y a continuación el
texto que describe lo que se esta haciendo.

Es importante destacar que las variables numéricas son escritas en formato


binario, decimal y hexadecimal anteponiendo ciertos comandos:
• b’XXXXXXXX: Declara un byte en binario;
• 0xXX: Declara un byte de 00 a FF;
• XXX: Declara un valor decimal de 0 a 255, por defecto el programa reconoce
los números decimales.
Los puerto del microcontrolador pueden tener valores lógicos “0” o “1” cuando son
configurados com puerto digital. En la lógica positiva, el estado lógico “0” equivale tener o
reconocer 0 [VDC] en un puerto específico y el estado lógico “1” equivale a tener o
reconocer 5 [VDC] en un puerto especifico.

E.1.2.1. Declaración de Variables

Dim {variable} As {tipo de variable}.

Para utilizar este software, es necesario conocer los comandos en lenguaje Basic
con el cual es posible la configuración y programación del microcontrolador PIC 18F4550.
A continuación se presenta una lista de comandos , como se emplean y un ejemplo de su
utilización.

En lenguaje Basic tenemos distintos tipos de variables, según el dato que se


pueda almacenar:
• Bit: un bit de longitud, almacena 0 o 1 únicamente;
• Byte: un byte de longitud almacena números enteros entre 0 y 255;
• Word: dos bytes de longitud, almacena números enteros entre 0 y 65.535;
• Long: cuatro bytes de longitud, almacena números enteros entre 0 y
4.294.967.295.

El tipo Long solo está disponible mediante un módulo opcional al PSI. A diferencia
de otros Basic, la declaración de variables pueden ser hechas en cualquier parte del
programa, y todas son consideradas globales, es decir, su valor es accesible desde todas
las subrutinas y zonas del programa. El número de variables está lógicamente limitado a
la cantidad de memoria RAM disponible en cada microcontrolador.

Ejemplo:
Dim n As Bit ‘ se declara la variable n como bit
Dim i As Byte
Dim dato As Word
Dim j As Long
También es posible utilizar vectores, que son una matriz de dimensiones 1xN,
(Dim i(10) As Byte). Declara un vector, al que refieren en algunos textos como Array, de
diez elementos del tipo Byte, se acceden mediante el uso de subíndices, puesto entre
paréntesis del 0 al 9.

Ejemplo:
Serout i(4) ‘ se envía el byte ubicado en la posición 5
del vector

E.1.2.2. Instrucción Reserve

{variable}.HB
{variable}.LB.

Las variables tipo word están compuestas por dos bytes. El primero de ellos es
llamado byte “alto” y el otro “bajo”, dado que el primero contiene 8 bits mas significativos,
podemos acceder individualmente a cada uno de ellos mediante las extensiones .HB
(High Byte o byte alto) y .LB (Low Byte o byte bajo).

Ejemplo:
Dim i As Byte
Dim j As Word
i=j.HB
i=j.LB
j.HB=i
j.LB=i

Los bits individuales de cada variable pueden ser accedido individualmente


también simplemente poniendo com extensión .n donde n es el número de bits.

Ejemplo:
Dim i As Byte
Dim j as Bit
j=i.1
j=i.7
i.0=i.5

E.1.2.3. Instrucción para registros

TRIS{puerto} = %{valor binario de puerto como E/S}


TRIS{puerto,numero del puerto} = {valor binario del puerto E/S}
PORT{puerto} = b’{valor binario de puerto activado o no}
PORT{puerto, numero del puerto = {valor binario del puerto activo o no}

Todos los registros del microcontrolador están disponibles para ser usados en
programas hechos en Basic, como si se tratase de variables del tipo byte con el nombre
del registro utilizado en el manual del dispositivo (PORTA, TRISA, PORTB, TRISB,
PORTC, TRISC, PORTD, TRISD ,PORTE, TRISE). Se pueden acceder a bits individuales
de los registros.

Ejemplo:
TRISA.1 = 0 ‘ se configura el puerto RBA1 como salida
TRISB = 0 ‘ se configura todo el puerto B como salida
TRISB=%11100000 ‘ se clara cara puerto individual como
salida o entrada
PORTA.1 = 1 ‘ en el puerto RA1 está en estado lógico
“1”
STATUS.RP0 = 1 ‘ verifica el estado de los puertos
INTCON.INTF = 0 ‘ verifica la interrupción este en estado
lógico “0”

Existe otra forma de acceder a los bits individuales de cada puerto, simplemente
usando la variable Basic tipo byte RA, RB, RC, RD, RE o bien las tipo bits RA0, RA1,...,
RE7.

Ejemplo:
RA = 0XFF ‘ el puerto A está en estado lógico “1”
RB = 1 ‘ el puerto B está en estado lógico “1”
E.1.2.4. Instrucción para punteros

Pointer ({variable})

Es posible utilizar punteros, cualquier variable definida como tipo byte o word
puede ser usada com un puntero de memoria, usándose como argumento de la función
Pointer. El valor contenido por la variable debe tener un valor comprendido entre 0 y 511.

Ejemplo:
Dim x As Word
Dim y As Byte
x = 0x3F
y = Pointer (x)
Pointer (x) = y

E.1.2.5. Instrucción para símbolos

Symbol {nombre} = {puerto asignado}

Una forma de escribir programas que resulte mas fácil de entender es el uso de
nombres simbólicos, o Symbol. Un Symbol es una cadena que contiene código, asignado
a un nombre. Al momento de compilar, PSI hace la búsqueda y reemplazo del símbolo y
luego genera el código ASM y HEX.

Ejemplo:
Symbol LED1 = PORTB.0 ‘ asigna al símbolo LED1 el puerto RB0
PORTB.0 = 1 ‘ ponemos en estado “1” al puerto RB0
LED1 = 1 ‘ ponemos en estado “1” al puerto RB0

E.1.2.6. Instrucción para constantes

Const {nombre variable} = {valor variable decimal}


Las constantes o valores que son usados para hacer un programa que asignamos
a las variables, pueden ser escritas en decimal, en hexadecimal o en binario, y se pueden
asignar nombres a las constantes, con la instrucción Const.

Ejemplo:
Dim i As Word
Const pi = 314 ‘ asignamos el nombre pi al numero 314
i = pi ‘ cargamos el valor de pi en la variable i

Ademas hay tres instrucciones para el manejo individual de bits, si bien no hacen
nada que no se puede resolver con otras instrucciones o símbolos, ayudan al
entendimiento de la lectura del código. Se tratan de High, Low, Toogle, que ponen el bit
en alto, bajo o lo invierte, respectivamente.

Ejemplo:
High PORTB.0 ‘ el puerto RB.0 esta en estado lógico “1”
Low ADCON.ADON ‘ deja en estado bajo la entrada análoga

Si el bit implicado como argumento de una de estas instrucciones es un bit de un


PORT, el mismo bit en el TRIS correspondiente es puesto en “0”, y dicho pin queda
configurado como salida.

E.1.2.7. Instrucciones en ensamblador

Asm: {código en ensamblador}

Líneas de código en lenguaje Ensamblador pueden ser incluidas en cualquier


parte del programa en Basic, comenzando con la instrucción Asm.

Ejemplo:
Asm: NOP
Asm: LABEL1: MOVLW 0xFF

E.1.2.8. Operaciones lógicas y matemáticas


PIC Simulator IDE, dispone de cinco operaciones matemáticas básicas,
disponibles para las variables tipo Byte y Word. Estas son:
• La suma: operador +;
• La sustracción: operador -;
• El producto: operador *;
• El cociente: operador /;
• Y el modulo: operador Mod.

Por supuesto, el compilador es capaz de combinarlas para obtener operaciones


matemáticas mas complejas. Además es posible calcular raíces cuadradas, aunque el
resultado debe ser entero, con la función Sqr.

Ejemplo:
Dim i As Word
i = 3600
i = Sqr (i)

Para la variable tipo bit, existen siete operaciones lógicas disponibles. Solo es
posible efectuar una operación lógica por instrucción. Estas operaciones también están
disponibles para variables tipo Word o Byte.

Ejemplo:
Dim i As Bit
Dim j As Bit
Dim k As Bit
Dim n As Word
Dim m As Word
k = Not i
k = i Or j
k = i Xor j
k = i Nor j
k = i Nxor j
n = n Or m
PORTB = PORTC And %11110000
E.1.2.9. Instrucción Goto

{nombre de rutina}
{instrucciones}
Goto {nombre de rutina}

Esta instrucción se utilizara para realizar un salto incondicional. Después de la


instrucciones debe ir el nombre de la subrutina donde se realiza el salto. De esta manera
se puede hacer repetir de forma infinita la rutina Loop.

Ejemplo:
Loop: ‘ se nombra una subrutina con el nombre
de Loop
PORTB.0 = 1 ‘ se activa el puerto RB0
WaitMs 100 ‘ se espera durante 100 mS
Goto Loop ‘ salta a la subrutina Loop

E.1.2.10. Instrucción For-To-Step-Next

For {variable} = {valor inicial} to {valor final} Step {valor}


{instrucciones}
Next {variable}

Esta instrucción permite repetir un número finito de veces una rutina, generar un
vector o matriz, dependiendo del valor de la variable. La instrucción Step, permite
determinar la cantidad de pasos a dar hasta llegar al limite.

Ejemplo:
TRISB = %00000000
Dim i As Byte
Loop:
For i = 1 to 10 Step 2 ‘ cuenta desde 1 hasta 10 con un salto de
a 2 números
PORTB.0=1
Next i
End.

En el programa comienza el contador del ciclo For a contar cada 2 numero hasta
llegar a 10, es decir, cuenta: 1, 3, 5, 7, 9. Y termina el ciclo de repetición de la instrucción
PORTB.0=1 hasta llegar a 10, luego el programa termina con la instrucción End. Ademas
con la instrucción Step se puede ir ascendiendo o descendiendo el contador For.

E.1.2.11. Instrucción While-Wend

While {condición}
{instrucciones}
Wend

Con esta instrucción es posible condicionar ciertas características del


microcontrolador, así como condicionar la acción de subrutinas que estén asociadas.
Pueden ser usados múltiples operadores al hacer la comparación después de la
instrucción While, con un máximo de ocho comparaciones (1 byte).

Mientras la condición sea verdadera, el grupo de instrucciones dentro del cuerpo


del While-Wend se ejecuta.

Ejemplo:
Dim i As Byte
TRISB = 0
i = 255
While i > 0 ‘ mientras la variable i sea mayor que cero
i=i-1 ‘ sustrae 1 a la variable i
WaitMs 100 ‘ espera durante 100 mS
Wend ‘ termina instrucción While

E.1.2.12. Instrucción If-Then-Else-Endif


If {variable, puerto} = {valor esperado} Then
{realiza acción}
Else
{realiza acción}
Endif

Con la instrucción If-Then-Else, se condicionan alternativas para acceder a


subrutinas, de acuerdo a la selección por medio de If, se logra la acción después de Then,
teniendo mas opciones alternativas con Else. Pueden ser usados múltiples operadores al
hacer la comparación después de la instrucción If, con un máximo de ocho
comparaciones (1 byte).

Ejemplo:
TRISB = 0
Loop:
If PORTA.0=1 Then
PORTB.0=1
Else
PORTB.0=0
Endif
Goto Loop

E.1.2.13. Instrucción Select Case-Case-Case-Endselect

Select Case {variable o condición}


Case {instrucciones}
EndSelect

Es muy similar al funcionamiento de la instrucción While-Wend.

Ejemplo:
Dim i As Byte
Loop:
Select Case i
Case 255
i=1
Case <= 127
i=i+1
Case Else
i = 255
Endselect

Es posible separar múltiples condiciones con una coma (,), de esta forma agregar
varias opciones a la instrucción Case.

E.1.2.14. Instrucción Gosub

Gosub {nombre subrutina}


Return

Es posible trabajar programando en Basic con PIC Simulator IDE utilizando


subrutinas, siendo estas llamadas por medio de la instrucción Gosub, previamente
declaradas y solo es posible utilizarlas cuando la rutina principal termina con la instrucción
End.

Para retornar a la rutina principal, se utiliza la instrucción Return, colocada en la


linea final de la subrutina, cuando retorna la programa principal lo hace a la linea de
instrucciones siguientes.

Ejemplo:
Symbol ad_accion = ADCON.GO_DONE
Symbol display = PORTB
TRISB = %00000000
TRISA = %111111
ADCON = 0xC0
ADCON1 = 0
High ADCON.ADON
principal:
Gosub resultado
Display = ADRESH
Goto principal
End.
Rresultado:
High ad_accion
While ad_accion
Wend
Return

E.1.2.15. Instrucción Lookup

{nombre variable} Lookup (numeración de variable), {indice}

La instrucción Lookup puede ser utilizada para seleccionar un byte desde una lista
de constantes del mismo tipo, de acuerdo al valor de un índice, también del tipo byte. El
resultado de la selección se almacena también en una variable tipo byte.

Ejemplo:
Dim indice As Byte
Dim variable As Byte
indice = 3
Variable = Lookup (25,35,100), indice

E.1.2.16. Instrucción Define

Define {instrucción o comando}

Con esta instrucción se definen los parámetros para configurar el


microcontrolador y las distintas propiedades y aplicaciones que puede hacer, como la
conversión análoga digital, frecuencia del reloj del microcontrolador, puerto USB, puerto
serie, uso de pantalla LCD.

Ejemplo:
Define Clock_frequency = 20 ‘ configura el reloj del microcontrolador a
20MHz

E.1.2.17. Instrucción Config

Config {instrucción de configuración}

Con esta instrucción es posible configurar los puerto del microcontrolador, es una
alternativa al uso de las instrucciones TRIS y PORT.

Ejemplo:
Config PORTB = output
Config RA0 = output
Config PORTC.3 = input
Config RD = input

E.1.2.18. Instrucción WaitMs y WaitUs

WaitMs {variable o valor decimal}


WaitUs {variable o valor decimal}

Las instrucciones WaitMs y WaitUs son utilizadas para generar un retardo de


tiempo especifico medidos en milisegundos y microsegundos, respectivamente. Es
posible usar una variable del tipo byte o word. Esta instrucción utiliza la frecuencia de reloj
como parámetro de medida, por tanto debe de coincidir la velocidad de reloj en la
configuración con el cristal puesto en el circuito eléctrico.

Ejemplo:
Dim i As Word ‘ se declara una variable del tipo Word
i = 100 ‘ se carga el valor 100 en la variable i
WaitMs x ‘ se genera un retardo de 100 [mS]
WaitUs 50 ‘ se genera un retardo de 50 [uS]

E.1.2.19. Instrucciones Shiftleft y Shiftright


Shiftleft {puerto, grado de desplazamiento}
Shiftright {puerto, grado de desplazamiento}

Shiftleft y Shiftright son funciones a nivel bit que pueden ser utilizadas para
desplazar el contenido de una variable a la izquierda o a la derecha. Cada uno de los bits
que componen la variable se desplaza una posición, a la izquierda o a la derecha, de
acuerdo a que funciones se utilice. Esto tiene dos consecuencias. En primer lugar, el bit
de mas a la izquierda o derecha se pierde. Y el espacio creado en el otro extremo se
completa con un “0”.

Ejemplo:
TRISB = 0x00
PORTB = %00000001
a_izq:
WaitMs 250
PORTB = Shiftleft (PORTB, 1)
If PORTB.7 Then Goto a_der
Goto a_izq
a_der:
WaitMs 250
PORTB = Shiftright (PORTB, 1)
If PORTB.0 Then Goto a_izq
Goto a_der

E.1.2.20. Instrucción Count

Count {puerto, tiempo, variable}

Si es necesario contar un cierto numero de pulsos que viene hacia algún pin del
microcontrolador durante un cierto periodo de tiempo, se utiliza la instrucción Count.

Posee tres argumentos:


• puerto: se declara el pin conectado a la fuente de pulsos, debe ser declarado
con un puerto digital;
• tiempo: tiempo de observación expresado en milisegundos entre 1 y 10000;
• variable: donde es almacenado el numero de pulso contados después de ser
ejecutada la instrucción.

La instrucción Count usa el modulo interno Timer0.

El parámetro Count_mode esta disponible cuando se usa con la instrucción


Define. Si se iguala al valor 1 (por defecto), la instrucción Count cuenta el numero de
flancos de subida. Si Count_mode es igual 2, cuenta el numero de flanco de bajada.

Ejemplo:
Define Count_mode = 1
Dim num_de_pulsos As Word
Count PORTB.0, 1000, num_de_pulsos

E.1.2.21. Instrucción EEPROM

Eeprom {dirección de la memoria, dato}

Si se desea utilizar memorias EEPROM para almacenar información obtenida por


el microcontrolador y que no es posible almacenarlas en él, con esta instrucción es
posible seleccionar la memoria y almacenar la información que se desee.

El primero argumento indica la dirección del primer byte en la lista de datos, el


segundo argumento es el dato a ingresar. Escribiendo repetidamente este par de
argumentos, se pude llenar las diferentes áreas de la memoria.

Ejemplo:
Eeprom 0, 0x55
Eeprom 253, 0x01, 0x02, 0x03
E.1.2.22. Instrucción Procedure

Proc {argumento1, ..., argumento5}


End Proc

Con la instrucción Procedure se pueden declarar hasta cinco procedimientos,


separados con una coma. Funcionan de manera local tanto los argumentos como las
variables declaradas, de esta forma no es necesario declararlas al principio del programa
principal y es fácil de reutilizar. Se puede volver a llamar a la instrucción Procedure con la
instrucción Call.
Ejemplo:
Dim i As Byte
TRISB = 0
For i = 0 to 255
Call puertob_display (x)
WaitMs 100
Next i
End.

Proc puertob_display (arg1 As Byte)


PORTB = arg1
End Proc

E.1.2.23. Instrucción Function

Function {argumento1, ..., argumento5}


End Function

Para poder realizar operaciones especificas, se utiliza la instrucción Function, los


argumentos son declarados globalmente, hasta un máximo de cinco.
Se termina la instrucción Function utilizando la instrucción End Function.

Ejemplo:
Dim i As Byte
Dim j As Word
For i = 0 to 255
j = square (x)
Next i
End
Function square (arg1 As Word) As Word
square = arg1 * arg1
End Function

E.1.2.24. Instrucción Include

Include “{nombre de archivo .BAS}”

Un archivo externo de Basic puede ser incluido en el programa usando la


instrucción Include, donde el argumento es una cadena que contiene la dirección donde
está ubicado el archivo externo con extensión .BAS, Siempre y cuando el archivo esté
dentro de la misma carpeta donde se genere el programa en PSI. El contenido de las
variables y las declaraciones son del tipo global.

Ejemplo:
Programa principal en PSI:
Dim i As Word
Dim j As Word
Include “inc1.bas”
Include “inc2.bas”
For i = 1 to 10
j = func1 (i, 100)
Call proc1 (j)
Next i
End

Programa contenido en inc1.bas:


Dim total As Word
Proc proc1 (i As Word)
Total = total + i
End Proc

Programa contenido en inc2.bas:


Function func1 (i As Word, j As Word) As Word
Func1 = i + j
End Function

E.1.2.25. Instrucciones Read, Write

Read {dirección del dato en la memoria, dato}


Write {dirección del dato en la memoria, dato}

Para tener acceso a los datos de una memoria EEPROM es posible leer y escribir
en ella con las instrucciones Read y Write. El primer argumento para ambas instrucciones
indica la dirección en un byte de la memoria EEPROM, puede ser una constante o un byte
variable. El segundo argumento es el dato que será escrito o leído en la memoria
EEPROM, para leer la variable tiene que ser un byte. Se sugiere que las interrupciones
estén deshabitadas cuando se utilice durante la ejecución de la instrucción Write o
escribir.

Ejemplo:
Dim i As Byte
Dim j As Byte
i = 10
Read i, j ` el dato contenido en la variable j es
almacenado en la dirección de memoria i
Write 11, j ` e n l a d i r e c c i ó n d e m e m o r i a 11 , s e
almacena el dato j

E.1.2.26. Instrucción ADC

Define ADC_Clock = {fuente de reloj}


Define ADC_Sampleus = {tiempo en milisegundos}
ADCIN {canal ADC, variable}

Para adquirir datos por medio de las entradas análogas, o utilizar la conversión
análoga a digital que el microcontrolador posee, se utiliza la instrucción ADCIN la cual
posee dos argumentos. El primero de ellos indica la entrada análoga a utilizar,
dependiendo del microcontrolador. El segundo argumento indica donde va a almacenarse
el dato convertido, puede ser un byte, word, o una cadena o string.

Con la instrucción ADC_Clock, se elige el reloj a utilizar en la conversión, esto


depende del tipo de microcontrolador y el reloj que se este usando para generar la base
de tiempo.

Con la instrucción ADC_Sampleus, se elige el parámetro para hacer la


adquisición de datos, es decir, el tiempo en microsegundos entre una muestra tomada y la
siguiente, entre 0 y 255.

La instrucción ADCIN, estará sujeta como es declarado el pin en el


microcontrolador, siendo que este pin debe de estar configurado con una entrada
análoga, con los registros TRIS, ADCON1.

Ejemplo:
Dim i(5) As Byte ‘ declara un vector i
Dim im As Word
Dim j As Byte
Define ADC_Clock = 3
Define ADC_Sampleus = 50 ‘ muestreo cada 50 uS
TRISA = 0xff ‘ puerto A como entrada
TRISB = 0 ‘ puerto B como salida
ADCON1 = 0 ‘ configura puerto RA0 como análogo
For j = 1 to 4
Adcin 0, i (j) ‘ guarda 4 datos en el vector i
Next j
im = 0
For j = 0 to 4
im = im + v(j)
Next j
im = im / 5
PORTB = im.LB ‘ saca por el puerto B, la parte baja de im

E.1.2.27. Instrucciones de interrupción

On Low Interrupt
{instrucciones}
Resume
On High Interrupt
{instrucciones}
Resume

Las instrucciones de interrupción tiene alta y baja prioridad y estas pueden ser
activadas o desactivadas con la respectiva instrucción y terminar las sentencias con la
instrucción Resume. Si operaciones aritméticas, vectores y cualquier otro complejo son
usadas con las instrucciones de interrupción, es necesario incluir la instrucción Save
System a la derecha, después de On Low/High Interrupt haya sido cargado en el registro
de sistema.

Las instrucciones Enable Low, Enable High, Disable Low y Disable High pueden
ser usadas ene l programa principal para controlar los bits de los registros INTCON, GIEH
y GIEL.

Ejemplo:
Dim i As Byte
i = 255
TRISA = 0
PORTA = i
INTCON.INT0IE = 1
Enable High
End
On High Interrupt
i=i-1
PORTA = i
INTCON.INT0IF = 0
Resume
E.1.2.28. Instrucciones comunicación serie UART.

Hserpen {velocidad en baudios}


Hserout {variable, ..., variable}
Hserin {variable, ..., variable}
Hserget {variable}

Con las instrucciones es posible comunicarse de manera serie con otros


dispositivos que soporten comunicación serie UART

Las velocidades permitidas en la instrucción Hseropen son de: 300, 600, 1200,
2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 56000 y 57600 baudios. Por
omisión transmite a una velocidad de 9600 baudios.

La instrucción Hserout puede contener múltiples argumentos separados con una


coma (,). También es posible usar variables de tipo vector. Cuando es usado el símbolo
“#” antes del nombre de una variable, el contenido es considerado un valor decimal para
ser enviado por el puerto serie. Si son utilizadas las comillas “”, es `posible enviar datos
en código ASCII por el puerto serie. CrLf, retorna el carro

La instrucción Hserin puede ser usada para cargara una lista de variable de los
tipos byte o word provenientes del puerto serie. Esta instrucción espera hasta que el
requerido numero de bytes o word hayan sido recibido por el puerto serie.

La instrucción Hserget posee un argumento que puede ser una variable del tipo
byte, y su característica es esperar en el buffer de recepción si se está cargando una
variable, en otro caso el valor cero “0”, es cargado.

Ejemplos:
Uno:
Dim i As Byte
Hseropen 38400 ‘ asigna la veloc. de 38400baud
WaitMs 1000
For i = 20 to 0 Step -1 ‘ decrementa de 20 a 0
Hserout “Number: ”, #i, CrLf
WaitMs 500
Next i

Dos:
Dim i As Byte
Hseropen 19200
Loop:
Hserin i
Hserout “Number: ”, #i, CrLf
Goto loop

Tres:
Dim i As Byte
Hseropen 19200
Loop:
Hserget i
If i > 0 Then
Hserout “Number: ”, #i, CrLf
WaitMs 50
Endif
Goto loop

E.1.2.29. Instrucción serie UART simple

SEROUT_DELAYUS = {}
Serout {puerto especifico, velocidad baudios, variable o ASCII}
Serin {puerto especifico, velocidad baudios, variable o ASCII}
SeroutInv {puerto especifico, velocidad baudios, variable o ASCII}
SerinInv {puerto especifico, velocidad baudios, variable o ASCII}
Estas instrucciones puede utilizar cualquier pin del microcontrolador, ya que están
diseñadas para no tener la limitación de la comunicación de los pines diseñados para ese
propósito en el microcontrolador RX y TX respectivamente.

Para la instrucción Serin, el primer argumento indica el puerto especifico que va a


ser usado para la transmisión serial asincrónica. El segundo argumento indica la
velocidad de transmisión o recepción que tiene los valores: 300, 600, 1200, 2400, 4800,
9600 o 19200. El usar una velocidad de transmisión alta y una frecuencia de reloj baja
puede causar errores de cuadro. Posterior a esto, es posible enviar varios argumentos ya
sean variable, ASCII, numero.

Para la instrucción Serout, es similar los argumentos a la instrucción anterior,


primero se selecciona el puerto de comunicación, luego la velocidad en baudios permitida
y los argumentos referente a información que van a ser transmitida. Ademas es posible
agregar las instrucciones de CrLF, de retorno de carro. Si es usado el símbolo “#” antes
de l nombre de una variable, representa a que será transmitida un dato decimal por el
puerto serie.

Las instrucciones SerinInv y SeroutInv, se puede invertir los niveles lógicos


cuando son usado interfaces que trabajan de esta manera.

Ejemplos:
Uno:
Define SEROUT_DELAYUS = 5000
Serout PORTC.6, 1200, “Hola Mundo”, CrLf

Dos:
Dim i As Byte
loop:
Serin PORTC.7, 9600, i
Serout PORTC.6, 9600, “Numero: ”, #i, CrLf
Goto loop
E.1.2.30. Instrucciones para LCD

Lcdinit {instrucción}
Lcdcmdout {instrucciones}
Lcdout {instrucciones}

El microcontrolador PIC18F4550 puede manipular una interface alfanumérica tipo


LCD, con la cual se pueden desplegar información son necesidad de estar conectado a
un computador. Para ello PIC Simulator IDE, ha desarrollado instrucciones para configurar
los parámetros del microcontrolador para ser usado de este modo, así también
instrucciones para utilizar un display LCD, específicamente los LCD basados en el chip
controlador HD44780 de Hitachi o compatible.

Primero se tiene que configurar la interface LCD a usar,para ellos se explica cada
uno las instrucciones que son usadas para la configuración:
• LCD_BITS: define el numero de lineas de la interface, siendo de 4 y 8 bits, por
defecto está configurada en 4 bits;
• LCD_DREG: define el puerto al cual será conectado las lineas de datos, por
defecto es asignado el puerto B o PORTB;
• LCD_DBIT: define la posición donde comienza la interface en el puerto
asignado, pudiendo ser 0 (para 8 bits) o 4 (para 4 bits);
• LCD_RSREG: define el puerto por el cual será conectada la linea RS;
• LCD_RSBIT: define el pin del puerto al cual se conectara la linea RS;
• LCD_EREG: define el puerto por el cual será conectada la linea E;
• LCD_EBIT: define el pin del puerto al cual se conectará la linea E;
• LCD_RWREG: define el puerto por el cual será conectada la linea R/W;
• LCD_RWBIT: define el pin del puerto al cual se conectará la linea RW;
• LCD_COMMANDUS: define el retardo después de la instrucción
LCDCMDOUT en microsegundos, por defecto tiene el valor de 5000;
• LCD_DATAUS: define el retardo después de la instrucción LCDOUT en
microsegundos, por defecto tiene el valor de 100;
• LCD_INIMS: define el retardo después de la instrucción LCDINIT en
milisegundos, por defecto tiene el valor de 100.
La instrucción Lcdinit debe ser puesta antes de cualquier instrucción Lcdout
(usado para enviar datos) y Lcdcmdout (usado para enviar comandos) para poder habilitar
el uso de las instrucciones para manipular un LCD. Constantes numérica son usadas
como argumentos para esta instrucción:
• 0: sin cursor;
• 1: parpadeo de cursor;
• 2: linea inferior;
• 3: parpadeo y linea inferior.

Las instrucciones Lcdout y Lcdcmdout pueden contener múltiples argumentos


separados por una coma (,). Vectores, constantes y variables pueden ser usadas como
argumento en la instrucción Lcdout. Si es usado el símbolo “ # ”, antes de cualquier
nombre de una variable es una representación decimal que es enviada al modulo LCD.

Constantes y variables pueden ser usadas como argumento con la instrucción


Lcdmcdout, además es posible agregar instrucciones como:
• LcdClear: borra modulo LCD;
• LcdHome: se ubica al inicio de la primera linea del modulo LCD;
• LcdLine2Home: se ubica al inicio de la segunda linea del modulo LCD;
• LcdDisplayOn: activa el cursor;
• LcdDisplayOff: desactiva el cursor;
• LcdCurOff: apaga el cursor;
• LcdCurBlink: hace que el cursor parpadee;
• LcdCurUnderline: ubica al cursor en la linea mas baja;
• LcdLeft: escribe el texto a la izquierda del modulo LCD;
• LcdRight: escribe el texto a la derecha del modulo LCD;
• LcdShiftLeft: desplaza el texto hacia la izquierda;
• LcdShiftRight: desplaza el texto hacia la derecha;
• LcdLine1Clear: borra el contenido de la primera linea del modulo LCD;
• LcdLine2Clear: borra el contenido del la segunda linea del modulo LCD;
• LcdLine1Pos(): ubica el texto en la posición puesta entre los paréntesis de la
primera linea del modulo LCD;
• LcdLine2Pos(): ubica el texto en la posición puesta entre los paréntesis de la
segunda linea del modulo LCD.
Ejemplos:
‘ Uno:
Define LCD_BITS = 8 ‘ los datos son de 8 bits
Define LCD_DREG = PORTB ‘ uso el puerto B para datos
DefineLCD_DBIT = 0 ‘ comienzo desde RB0
Define LCD_RSREG = PORTD ‘ RS por puerto D
Define LCD_RSBIT = 1 ‘ uso el puerto RD1
Define LCD_EREG = PORTD ‘ E por puerto D
Define LCD_EBIT = 3 ‘ uso el puerto RD3
Define LCD_RWREG = PORTD ‘ RW por puerto D
Define LCD_RWBIT = 2 ‘ uso el puerto RD2
Lcdinit LcdCurBlink ‘ inicio uso de LCD con el cursor
parpadeando
loop:
Lcdout “Hola Mundo” ‘ escribo “hola mundo” en modulo
WaitMs 1000
Lcdcmdout LcdCealr ‘ envío la instrucción para borrar
Goto loop contenido de la pantalla LCD

‘ Dos:
Define LCD_BITS = 8
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 3
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 2
Dim i As Word
i = 65535
Lcdinit 3
WaitMs 1000
loop:
Lcdout “Estoy contando”
Lcdcmdout LcdLine2Home
Lcdout #i
i=i-1
WaitMs 250
Lcdcmdout LcdClear
Goto loop

E.1.2.31. Instrucciones para I2C

I2CWrite {puerto SDA, puerto SCL, dirección dispositivo, dirección dato,


dato}
I2CRead {puerto SDA, puerto SCL, dirección dispositivo, dirección dato,
dato}

La comunicación I2C puede se implementada en Basic, usando las instrucciones


I2CWrite y I2CRead. El primer argumento para ambas instrucciones indica cual es pin del
microcontrolador que es usado para conectar la linea SDA hacia un dispositivo externo
I2C. El segundo argumento para ambas instrucciones indica cual es el pin del
microcontrolador que es usado para conectar a linea SCL hacia un dispositivo externo I2C.
El tercer argumento para ambas instrucciones puede ser una constante o una variable
del tipo byte llamada dirección de esclavo o Slave, este formado descrito en el Datasheet
del fabricante del dispositivo I2C. El cuarto argumento para ambas instrucciones puede
ser una variable del tipo byte o word, dependiendo del dispositivo a usar, la cual contiene
la dirección de la locación a la cual se va a acceder. si es usada una constante para el
parámetro de la dirección debe ser del tipo byte. el quinto y ultimo argumento para la
instrucción I2CWrite puede ser una constante del tipo byte o una variable donde va a ser
escrita la dirección especifica. y para la instrucción I2CRead debe ser una variable del tipo
byte para almacenar el valor que es leído desde la dirección especifica.

Para algunos dispositivos esclavos I2C, es necesario agregar algún tipo de retardo
para asegurarse que le dispositivo este listo para responder a la instrucción I2CRead.

Ejemplo:
Dim dir As Word
Dim dato As Byte
Dim dato1 As Byte
Symbol sda = PORTC.2
Symbol scl = PORTC.3
WaitMS 1000
I2CWrite sda, scl, 0xa0, dir, dato
WaitMs 50
I2CRead sda, scl, 0xa0, dir, dato1
WaitMs 50
End

Si se desea trabajar en bajo nivel con I2C, de esta manera se tiene mas control
sobre el proceso de comunicación con I2C. la instrucción I2CPrepare posee dos
argumentos que pueden ser usados para controlar los pines del microcontrolador. El
primer argumento define la linea SDA y el segundo argumento define la linea SCL. estas
instrucciones preparan la comunicación por I2C.

La instrucción I2CStart genera la condición de inicio, y la instrucción I2C Stop


genera la condición de detención de la comunicación.

Para enviar un byte se usa la instrucción I2CSend. Después que esta instrucción
ha sido ejecutada, el bit C en el registro de estado mantiene una copia del estado en la
linea SDA durante el ciclo de reconocimiento.

Para recibir un byte del puerto I2C de un esclavo, se puede ocupar dos
instrucciones I2CReca o I2CReceiveack pueden generar la señal de conocimiento
durante el ciclo de conocimiento después que el byte haya sido recibido. I2CRecn o
I2CReceivernack puede generar la señal de no conocimiento durante el ciclo de
conocimiento después que el byte haya sido recibido.

Ejemplo:
Dim dir As Word
Dim dato(31) As Byte
Symbol sda = PORTC.2
Symbol scl = PORTC.3
dir = 0
I2CPrepare sda, scl
I2CStart
I2CSend 0xa0
I2CSend dir.HB
I2CSend dir.LB
I2CStop
I2CStart
I2CSend 0xa1
For dir = 0 to 30
I2CReceiveAck dato(dir)
Next dir
I2CRecN dato(31)
I2CStop

E.1.2.32. Instrucciones para interface de dispositivos seriales o SPI

A priori para usar las instrucciones SSPI, la interface SPI debe estar lista al ser
definida las directivas correspondientes:
• SPI_SCK_REG: define el puerto por el cual es conectada la linea SCK;
• SPI_SCK_BIT: define el pin donde se conecta la linea SCK;
• SPI_SDI_REG: define el puerto por el cual es conectada la lineaSDI;
• SPI_SDI_BIT: define el pin donde se conecta la linea SDI;
• SPI_SDO_REG: define el puerto por el cual es conectada la linea SDO;
• SPI_SDO_BIT: define el pin donde se conecta la linea SDO;
• SPI_CS_REG: define el puerto por el cual es conectada la linea CS;
• SPI_CS_BIT: define el pin donde se conecta la linea CS.
Para asumir que la configuración esta activo-alto para la linea de Clock y activo-
bajo para la linea de ChipSelect. estas pueden cambiar por la asignación del valor 1 en
los parámetros SPICLOCK_INVERT y/o SPICS_INVERT en la directivas Define. para
dispositivos SPI lentos, es necesario usar pulsos de reloj muy largos.
La instrucción SPIPrepare, solo prepara las lineas de la interface de comunicación
SPI.

Las instrucciones SPICSON y SPICSOFF son usadas para activar o desactivar la


linea de ChipSelect de la interface.

Para recibir un byte desde un periférico debe ser usada la instrucción


SPISENDBITS. si el primer argumento indica el número de bits que serán enviados (1-8) y
el segundo argumento puede ser una constante o variable del tipo byte.

Ejemplo:
Define SPI_CS_REG = PORTC
Define SPI_CS_BIT = 0
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
SPIPrepare
Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit
Dim dir As Byte
Dim dato As Byte
For dir = 0 to 10
dato = 200 - dir
SPICSSOn
SPISend 0x06
SPICSOff
SPICSOn
SPISend 0x02
SPISend dir
SPISend dato
SPICSOff
Lcdout “escribir en EEPROM”
Lcdcmdout LcdLine2Home
Lcdout “ ( ”, #dir, “ ) = ”, #dato
WaitMs 500
Next dir
For dir = 0 to 10
SPICSOn 0x03
SPISend dir
SPIReceive dato
SPICSOff
Lcdcmdout lcdClear
Lcdout “Leyendo desde EEPROM”
Lcdcmdout LcdLine2Home
Lcdout “ ( ”, #dir, “ ) = ”, #dato
WaitMs 500
Next dir

E.1.2.33. Instrucciones para modulo PWM

PWMon {numero del modulo, modo}


PWMdutty {numero de modulo, ciclo útil}

El módulo interno PWM (modos de PWM en módulos CCP) son activados para
usar el argumento PWMon. Esta instrucción posee dos argumentos. El primero indica el
número del módulo, debe ser una constante entre 1 y 5. El segundo argumento es usado
para asignar la selección del modo. El módulo interno PWM puede ser usado en tres
diferentes salidas de frecuencias por cada cuatro ciclos útiles de resolución (10, 9, 8 y 7
bits).

Los modos son:


• mode 1: 10 bits, 244Hz;
• mode 2: 10 bit, 977 Hz;
• mode 3: 10 bit, 3906Hz;
• mode 4: 9 bit, 488Hz;
• mode 5: 9 bit, 1953Hz;
• mode 6: 9 bit, 7813Hz;
• mode 7: 8 bit, 977Hz;
• mode 8: 8 bit, 3906Hz;
• mode 9: 8 bit, 15625Hz;
• mode 10: 7 bit, 1953Hz;
• mode 11: 7 bit, 7813Hz;
• mode 12: 7 bit, 31250Hz.

El modulo PWM se inicia comenzando con 0 ciclo útil, además la salida puede
mantener en estado bajo hasta que el ciclo útil sea cargado. El modulo PWM puede ser
apagado con la instrucción PWMOff.

El ciclo útil de la señal de PWM puede ser cargada con la instrucción PWMDuty.
El primer argumento indica el número del módulo. El segundo argumento es el ciclo útil, y
es una constante entre el rango 0 a 1023 o una variable tipo byte o word.

Ejemplo:
Dim util As Byte
PWMon 1, 9
loop:
Adcin 0, util
PWMduty 1, util
Goto loop
E.1.2.34. Instrucciones para servo

Servoin {}

para escribir programas de aplicaciones que utilicen servos, existen dos


instrucciones disponibles. Servoin y Servoput con las cuales se puede manipular un tren
de pulsos, entre 15 y 20 pulsos por segundo. La longitud valida para el pulso esta en el
rango de 1 a 2 milisegundos. Estas dos instrucciones poseen dos argumentos. El primero
argumentos para ambas instrucciones asigna el pin por el cual va a ser transmitida o
recibida la señal de control del servo. Para la instrucción Servoin, el pin debe ser
configurado previamente como una entrada y para la instrucción Servoout, el pin debe ser
configurado como una salida. El segundo argumento para la instrucción Servoin debe ser
una variable del tipo byte, en el cual el largo del pulso es almacenado. Los pulsos están
medidos en unidades de 10 microsegundos, así que es posible medir pulsos en el rango
de 0,01 y 2,55 milisegundos. El segundo argumento para la instrucción Servoout es una
constante o variable del tipo byte que determina el largo del pulso generado.

Ejemplo:
Dim largo As Byte
TRISB.0 = 1
TRISB.1 = 0
Loop:
ServoIn PORTB.0, largo
If largo < 100 Then largo = 100
If largo > 200 Then largo = 200
largo = largo - 100
largo = largo - 100
largo = largo + 100
ServoOut PORTB.1, largo
Goto Loop

E.1.2.35. Instrucciones para motores paso a paso


StepCW {número de pasos, retardo entre pasos}
StepCCW {número de pasos, retardo entre pasos}

Para manipular un motor paso a paso es necesario declarar ciertas directivas con
la instrucción Define. A continuación los parámetros de configuración:
• STEP_A_REG: define el puerto donde será conectado la bobina A;
• STEP_A_BIT: define el pin donde será conectada la bobina A;
• STEP_B_REG: define el puerto donde será conectada la bobina B;
• STEP_B_BIT: define el pin donde será conectada la bobina B;
• STEP_C_REG: define el puerto donde será conectada la bobina C;
• STEP_C_BIT: define el pin donde será conectada la bobina C;
• STEP_D_REG: define el puerto donde será conectada la bobina D;
• STEP_D_BIT: define el pin donde será conectada la bobina D.

Con la instrucción STEP_MODE es usada para definir el modo de manipulación.


Si tiene el valor 1, el motor se manipula en paso completo, si tiene el valor 2, trabaja a
medio-paso.

La instrucción Stephold configura los pines usados como salida y alimenta las
bobinas A y B para situarlas en la posición inicial.
Las instrucciones StepCW, hace girar el motor en sentido horario, mientras que la
instrucción StepCCW, hace girar el motor en sentido antihorario.

El primer argumento para StepCW y StepCCW indica el numero de pasos del


rotor, puede ser una constante o una variable del tipo byte. El segundo argumento define
el retardo entre los pasos, expresado en microsegundos en una constante o variable del
tipo byte o word.

Ejemplo:
‘Uno:
ADCON1 = 0x0e
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 7
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 6
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 5
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 4
Define STEP_MODE = 2
WaitMs 1000
StepHold
WaitMs 1000
Dim an0 As word
Loop:
Adcin 0, an0
an0 = an0 * 60
ano = an0 + 2000
StepCW 1, an0
Goto Loop

‘Dos:
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 7
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 6
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 5
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 4
Define STEP_MODE = 2
WaitMs 300
StepHold
WaitUs 1000
Loop:
StepCCW 16, 300
WaitUs 1000
StepCW 24, 300
WaitUs 1000
Goto Loop
E.1.2.36. Instrucciones para dispositivos 1-Wire

1wireSendBit {argumentos}
1wireGetBit {argumentos}
1wireSendByte {argumentos}
1wireGetByte {argumentos}
DS18s20ReadT {variable, variable}

Para utilizar dispositivos 1-Wire, es necesario definir ciertos parámetros dentro del
microcontrolador, los cuales son:
• 1WIRE_REG: define el puerto a usar con un dispositivos 1-Wire;
• 1WIRE_BIT: define el pin a usar con un dispositivo 1-Wire .

Para iniciar la secuencia se debe usar la instrucción 1wireInit. Ademas se tiene


como opción agregar un argumento donde se asigna a una variable del tipo byte, la cual
puede ser puesta a 0, si la presencia del dispositivo ha sido detectada o puesta a 1, si no
hay dispositivos en la linea 1-Wire.

Pueden ser enviados y recibidos bits de forma independiente usando las


instrucciones 1wireSendBit y 1wireGetBit. Ambas instrucciones pueden manipular varios
argumentos separados por una coma (,), de esta manera se puede listar variables o
constantes del tipo bit.

Para enviar y recibir bytes de dispositivos 1-Wire, se utilizan las instrucciones


1wireSendByte y 1wireGetByte. Ambas instrucciones pueden manipular varios
argumentos separados por una coma (,), de esta manera se puede listar variables o
constantes del tipo byte.

Ejemplo:
Dim final As Bit
Dim temp As Byte
Dim signo As Byte
1wireInit
1wireSendByte 0xcc, 0x44
WaitMs 1
Loop:
1wireGetBit final
If final = 0 Then Goto Loop
1wireInit
1wireSendByte 0xcc,0xbe
1wireGetByte temp, signo

Ademas se posee dos instrucciones, las cuales trabajan de forma inmediata con
el sensor de temperatura DS18S20. Usando la instrucción DS18s20Start, se inicia el
dispositivo 1-Wire, para comenzar la conversión de temperatura en dato. De acuerdo con
el datasheet del dispositivo, la conversión es completada al pasar unos 750 [mS].

Después del periodo de medición puede ser leído el dispositivo con la instrucción
DS18s20ReadT, el cual envía dos argumentos del tipo byte. El primero de ellos contiene
el valor de la temperatura en unidades de 0,5 grados centígrados por unidad (por ejemplo,
para un valor igual a 100, representa la temperatura de 50 grados). El segundo
argumento contiene el valor 0x00 para temperaturas positivas y 0xff para temperaturas
negativas.

Ejemplo:
Dim temp As Byte
Dim signo As Byte
DS18s20Start
WaitMs 1000
DS18s20readT temp,signo
E.1.2.37. Instrucciones para comunicación vía USB

Para soportar aplicaciones basadas en la comunicación USB, es necesario


agregar un add-on de soporte para USB que posee el programa PIC 18 Simulator IDE,
este puede ser usado para desarrollar aplicaciones de USB de alta velocidad, de acuerdo
al Firmware, es posible utilizarlo con dispositivos USB del tipo HID.
El add-on que soporta USB, consiste en comandos USB para la serie de PIC 18F,
que son compiladas por el PIC18 y los controles HidTermin de ActiveX para desarrollar
aplicaciones de comunicación con un PC. Estos parámetros son validos para los modelos
18F de Microchip: 18F2455, 18F2550, 18F4450 y 18F4550.

El intercambio de datos es implementado para el dispositivo USB, con reportes de


datos de entrada y salida de 8 bytes. Con el control HidTerm pueden ser activadas las
aplicaciones para PC sobre los reportes de Send Features y Request Features, para
enviar y recibir reportes desde el hardware (en este caso del PIC 18F). La compilación en
lenguaje Basic se hace fácil al momento de enviar o recibir los reportes provenientes del
hardware del dispositivo USB.

Para habilitar el modulo USB de los microcontroladores PIC18, se utiliza la


instrucción UsbStart. Luego de esto, el hardware es reconocido por Windows como un
dispositivo genérico o HID. No es necesario la instalación de Driver adicional. El hardware
puede desconectarse del PC con la instrucción UsbStop.

La instrucción UsbService puede ser ejecutada las veces posible, debido a que
esta procesa cada evento USB o rutina que se necesite utilizar la comunicación USB. El
Firmware trabaja correctamente siempre y cuando se ejecute la instrucción UsbService
solamente con un tiempo máximo de un segundo entre una instrucción y la siguiente.

Para identificar el dispositivo USB por el PC Host, pueden ser usadas constantes
numéricas y cadenas, y mediante las instrucciones UsbSetVendorId, UsbSetProductId,
U s b S e t Ve r s i o n N u m b e r , U s b S e t M a n u f a c t u r e r S t r i n g, U s b S e t P r o d u c t S t r i n g ,
UsbSetSerialNumberString.

El reporte de salida que es enviado desde el PC, puede ser almacenado


automáticamente en el sistema, en arreglo UsbIoBuffer (0-7). Los datos recibidos con
reportes Feature enviados por el PC son almacenados en el arreglo UsbFtBuffer (0-7).

Dos subrutinas pueden ser llamadas por el Firmware del USB, después de estos
dos eventos pueden ser especificados con las instrucciones UsbonIoOutGosub y
UsbOnFtOutGosub. Además se pueden especificar otras dos subrutinas con las
instrucciones UsbOnIoInGosub y UsbOnFtInGosub y el Firmware del USB puede
llamarlas para enviar entradas y reportes Features al PC, además el programa puede
cargar al mismo tiempo el dato deseado en el buffer correspondiente del arreglo.

Ejemplo:
UsbSetVendorId 0x1235
UsbSetProductId 0x1235
UsbSetversionNumber 0x1111
UsbSetManufacturerString “Uantof - DIE”
UsbSetProductString “TD-USB”
UsbSetSerialNumberString “11111111”
UsbOnIoInGosub usbonioin
UsbOnIoOutGosub usbonioout
UsbOnFtInGosub usbonftin
UsbOnFtOutGosub usbonftout
ADCON1 = 0x0e
TRISB = 0
PORTB = 0xff
UsbStart
PORTB = 0
Dim an0 As Byte
Loop:
Adcin 0, an0
If an0 < 50 Then
PORTB = 0
UsbStop
While an0 < 100
Adcin 0, an0
Wend
PORTB = 0xff
UsbStart
PORTB = 0
Endif
UsbService
Goto Loop
End
Usbonftout:
Toggle PORTB.7
Return
Usbonftin:
UsbFtBuffer (0) = UsbFtBuffer (0) - 1
UsbFtBuffer (1) = UsbFtBuffer (1) - 1
UsbFtBuffer (2) = UsbFtBuffer (2) - 1
UsbFtBuffer (3) = UsbFtBuffer (3) - 1
UsbFtBuffer (4) = UsbFtBuffer (4) - 1
UsbFtBuffer (5) = UsbFtBuffer (5) - 1
UsbFtBuffer (6) = UsbFtBuffer (6) - 1
UsbFtBuffer (7) = UsbFtBuffer (7) - 1
Return
Usbonioout:
Toggle PORTB.6
Return
Usbonioin:
UsbIoBuffer (0) = UsbIoBuffer (0) + 1
UsbIoBuffer (1) = UsbIoBuffer (1) + 1
UsbIoBuffer (2) = UsbIoBuffer (2) + 1
UsbIoBuffer (3) = UsbIoBuffer (3) + 1
UsbIoBuffer (4) = UsbIoBuffer (4) + 1
UsbIoBuffer (5) = UsbIoBuffer (5) + 1
UsbIoBuffer (6) = UsbIoBuffer (6) + 1
UsbIoBuffer (7) = UsbIoBuffer (7) + 1

E.1.3. Compilación y errores

La comprobación del programa hecho en lenguaje Basic, lo realiza el compilador


integrado al software PIC 18 Simulator IDE, el cual indica los errores tipográficos de las
instrucciones, ademas indica las variables declaradas que no son utilizadas, la cantidad
de memoria utilizada, y generando los archivos con extensiones .bas (programa
basic), .hex (programa para grabar en PIC). Todo esto se puede realizar con la tecla F9
del teclado en el menú de la ventana de programación en Basic. Ver Figura A.39.
Figura A.39. Compilación de programa en Basic.

Ademas, es posible hacer la simulación del programa realizado, ya que el


software es capaz de cargar el programa hecho con extensión .hex y comprobar las
rutinas generadas son las correctas de manera simple. Cada linea de código cambia de
color al momento de ser ejecutada. Si son utilizadas las entradas o salidas tanto análogas
como digitales del microcontrolador, estas pueden ser vistas a través de un diagrama de
la distribución de pines que el microcontrolador posee, cambiando de color al momento de
ser usadas, ver Figura A.40 y Figura A.41. Los distintas velocidades de simulación se
pueden elegir en el menú principal:
• Slow: el intervalo es de 1500 [mS];
• Normal: el intervalo es de 250 [mS];
• Fast: el intervalo es alrededor de 50 [mS];
• Extremely Fast: el intervalo es muy corto y linealmente depende de la
capacidad del PC;
• Ultimate: en la ventana principal del simulador, no refresca continuamente los
eventos, pero es posible configurarlo en las opciones del menú.

Figura A.40. Elección de velocidad de simulación.


Figura A.41. Comenzar simulación de programa compilado.

S-ar putea să vă placă și