Академический Документы
Профессиональный Документы
Культура Документы
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.
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.
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.
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
{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
Ejemplo:
Dim i As Byte
Dim j as Bit
j=i.1
j=i.7
i.0=i.5
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
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
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
Ejemplo:
Asm: NOP
Asm: LABEL1: MOVLW 0xFF
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}
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
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.
While {condición}
{instrucciones}
Wend
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
Ejemplo:
TRISB = 0
Loop:
If PORTA.0=1 Then
PORTB.0=1
Else
PORTB.0=0
Endif
Goto Loop
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.
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
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
Ejemplo:
Define Clock_frequency = 20 ‘ configura el reloj del microcontrolador a
20MHz
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
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]
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
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.
Ejemplo:
Define Count_mode = 1
Dim num_de_pulsos As Word
Count PORTB.0, 1000, num_de_pulsos
Ejemplo:
Eeprom 0, 0x55
Eeprom 253, 0x01, 0x02, 0x03
E.1.2.22. Instrucción Procedure
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
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
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
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.
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
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.
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 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
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.
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}
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.
‘ 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
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.
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
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.
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
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).
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 {}
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
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.
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.
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 .
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
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.
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