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 Dim i As Byte Dim dato As Word Dim j As Long
‘ se declara la variable n como bit
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
Wend
‘ mientras la variable i sea mayor que cero
i=i-1
‘ sustrae 1 a la variable i
WaitMs 100
‘ espera durante 100 mS ‘ 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) Next j im = 0 For j = 0 to 4
‘ guarda 4 datos en el vector i
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 Goto loop ‘ 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”
‘ envío la instrucción para borrar contenido de la pantalla LCD
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 activobajo 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.