INSTRUCCIONES DE PIC BASIC ELABORADO POR: ING. EDDIE E. GALARZA Z. ESPE LATACUNGA
1. VARIABLES Las variables son elementos temporales en los que los datos de un programa de PicBasic se almacenan. Estas variables se crean utilizando la palabra VAR. Las variables pueden ser bits, bytes o words. Los espacios de memoria requeridos para cada variable son asignados automáticamente en la memoria RAM de los microcontroladores PIC, por el programa. El formato para crear una variable es el siguiente: Etiqueta VAR Tamaño {.Modificadores} La “Etiqueta” es cualquier identificador excluyendo palabras utilizadas por PicBasic. ”Tamaño” puede ser la palabra BIT , BYTE o WORD. Se puede incluir modificadores adicionales para crear cierto control sobre las variables Algunos ejemplos: prueba VAR byte led VAR bit B0 VAR word
2. ARRAYS Las variables arrays pueden crearse de manera similar a las variables genéricas. Etiqueta VAR Tamaño [Número de elementos] elementos] “Etiqueta” es cualquier identificador, excluyendo palabras claves de PicBasic. “Tamaño” puede ser BIT, BYTE o WORD. Número de elementos define cuantos elementos se integren al arreglo. Algunos ejemplos son: datos VAR byte[10] prueba VAR bit[8] El primer elemento del array es el elemento0. En el arreglo “datos” del ejemplo, los elementos se numeran desde datos[0] hasta datos[7] estableciendo de esta manera 8 elementos en total. Debido a la forma en la que los elementos del arreglo son colocados en la memoria, existen límites para el número máximo de cada uno de ellos:
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
1
Tamaño
Máximo número de elementos
BIT
256
BYTE
96
WORD
48
Los arreglos deben caber dentro de un solo banco de la RAM en la mayoría de los micros PIC.
3. OPERADORES OPERADORES MATEMÁTICOS El compilador PicBasic realiza todas las operaciones matemáticas en completo orden jerárquico. Esto significa que existe una precedencia para los operadores. Las multiplicaciones y divisiones se realizan primero que las sumas y restas. Para asegurar que las operaciones se realicen en el orden deseado, es preferible utilizar paréntesis: A = (B + C) * (D - E) Todas las operaciones matemáticas son sin signo y se realizan con una precisión de 16 bits. Los operadores disponibles son:
Operador Matemáticos
Descripción
+
Suma
-
Resta
*
Multiplicación
**
16 Bits superiores de la Multiplicación
*/
16 Bits medios de la Multiplicación
/
División
//
Resto (Módulo)
DIV32
División de 32 bits
<<
Desplazamiento a la izquierda
>>
Desplazamiento a la derecha
ABS
Valor absoluto
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
2
COS
Coseno
DCD
2n Decodificación
DIG
Dígito
MAX
Máximo
MIN
Mínimo
NCD
Codifique
REV
Invierta Bits
SIN
Seno
SQR
Raíz Cuadrada
&
AND
|
OR
^
OR Exclusivo
~
NOT
&/
AND NOT
|/
NOT OR
^/
NOT OR Exclusivo
OPERADORES DE COMPARACIÓN Los operadores de comparación son utilizados en las instrucciones que utilizan IF..THEN para comparar dos expresiones. Los operadores utilizados son:
Operador de Comparación
Descri pción
= o ==
Igual
<> o !=
No Igual
<
Menor que
>
Mayor que
<=
Menor o Igual que
>=
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
Mayor o igual que
3
OPERADORES LÓGICOS Los operadores lógicos actúan sobre resultados de expresiones. Estos establecen un resultado verdadero o falso a partir de su operación. Los valores que son “0” se consideran falsos y cualquier otro valor se considera como verdadero. Se utilizan en la mayoría de los casos en conjunto con los operadores de comparación en una instrucción que utiliza IF .. THEN. Los operadores disponibles son:
Operador Lógico Operador
Descripción
AND o &&
AND Lógico
OR o ||
OR Lógico
XOR o ^^
Exclusive OR Lógico
NOT AND
NAND Lógico
NOT OR
NOR Lógico
NOT XOR
NXOR Lógico
Ejemplo IF (A == grande) AND (B > media) THEN ejecute Debe asegurarse de utilizar los paréntesis para indicarle a PicBasic el orden exacto en el que se desea que se realice la operación.
4. ADCIN Canal,Var Lee el canal del conversor análogo digital del circuito y guarda el resultado en la variable Var. Los registros del ADC pueden ser leídos directamente pero con ADCIN puede facilitarse el proceso. Antes de que ADCIN pueda ser utilizada, el registro TRIS correspondiente debe ser configurado para hacer que actúen como entradas los pines correspondientes. También el registro ADCON1 necesita ser configurado con los pines deseados como entradas análogas y en otros casos inclusive es necesario configurar el formato en el que se presenta el resultado así como el reloj fuente que se utiliza.
Ejemplo: DEFINE ADC_BITS 8 ' Define el número de bits para el resultado DEFINE ADC_CLOCK 3 ' Define la fuente de reloj (rc = 3) DEFINE ADC_SAMPLEUS 50 ' Define el tiempo de muestreo en microsegundos
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
4
TRISA = 255 ' Coloca el PORTA todos los pines como entradas ADCON1 = 2 ' PORTA es analógico ADCIN 0, B0 ' Lea canal 0 en la variable B0
5. ASM {assembler code}
ENDASM Las instrucciones ASM y ENDASM le dice al programa que el código entre estas dos directivas está en lenguaje ensamblador y no debe ser considerado como una sentencia de PicBasic. Estas instrucciones se utilizan para mezclar en forma libre instrucciones del lenguaje ensamblador con las instrucciones de PicBasic. El tamaño máximo para el código es de 8K, en los cuales se incluyen inclusive a los comentarios mas no solamente del código generado.
Ejemplo ASM bsf PORTA, 0 ; Coloque en alto al bit 0 del PORTA bcf PORTB, 0 ; borre el bit 0 del PORTB
ENDASM 6. CLEAR Coloca todos los registros de la RAM en “cero”. CLEAR coloca en cero todos los registros de la RAM en cada banco. Esta instrucción coloca todas las variables, incluyendo a las variables internas en “cero”.
Ejemplo CLEAR ' Borra todas las variables
7. COUNT Pin,Periodo,Var Cuenta el número de pulsos que ocurren en un pin durante el tiempo definido en “Periodo” y almacena el resultado en “Var”. El pin se coloca automáticamente como entrada. “Pin” puede ser una constante entre 0 y 15, o una variable que contiene un número entre 0 y 15. El Periodo se expresa en milisegundos. Considera la frecuencia del oscilador basado en la que se haya definido. COUNT verifica el estado del Pin contando las transiciones de bajo a alto. Con un oscilador de 4MHz el Pin se verifica cada 20us. Con un oscilador de 20MHz el pin se verifica cada 4us. A partir de esto, se puede determinar la máxima frecuencia que puede medirse que es de 25KHz para un oscilador de 4MHz y de 125KHz para un oscilador de 20MHz, siempre que el oscilador tenga una relación de trabajo del 50%.
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
5
Ejemplo 'Cuenta el # de pulsos en el Pin1 durante 100 milisegundos COUNT PORTB.1, 100, W1 ' Determine la frecuencia en un pin COUNT PORTA.2, 1000, W1 ' Cuenta por 1 segundo
8. DATA {@Localidad,}Constante{,Constante...} Almacena valores constantes en la EEPROM del PIC cuando se programa al circuito por primera vez. Si el valor de la Localidad se omite, la primera sentencia DATA inicia en la dirección “0” y los valores siguientes se almacenan en las localidades siguientes. Si la localidad se especifica, se iniciará en la que se indica. Las constantes pueden ser numéricas o cadenas de caracteres. Solamente se almacenan los bytes menos significativos de la constante siempre y cuando no se haya especificado el tipo de dato WORD. Las cadenas de caracteres se almacenan en bytes consecutivos como valores ASCII. No se incluye un dato terminal que indique la finalización o la longitud de los datos. DATA solamente trabaja con microcontroladores con EEPROM en el PIC tales como el PIC16F84 y el PIC16C84.
Ejemplo 'Almacene 10, 20 y 30 iniciando en la localidad 5 DATA @5,10,20,30 ' Asigne una etiqueta a una palabra en la siguiente localidad. dlabel DATA word $1234 ' Almacene $34, $12 ' Salte cuatro localidades y almacene 10 0s DATA (4), 0(10)
9. DIV32 Número Las instrucciones de multiplicación (*) de PicBasic operan en configuración de 16 bits x 16 bits obteniendo un resultado de 32 bits. Sin embargo, debido a que el compilador únicamente soporta variables de 16 bits como máximo, el acceso al resultado debe realizarse en dos pasos: c = b * a devuelve los 16 bits menos significativos de la multiplicación, mientras que d = b ** a devuelve los 16 bits más significativos. No hay forma de obtener los 32 bits del resultado de una sola. La instrucción DIV32 permite dividir el total de 32 bits del resultado de una multiplicación por un número de 16 bits para obtener resultados. DIV32 está
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
6
limitada a dividir enteros de 31 bits sin signo (máximo 2.147’483.647) por un entero sin signo de máximo 15 bits.
Ejemplo a VAR WORD b VAR WORD c VAR WORD result VAR WORD b = 500 c = 1000
DISABLE
' esta instrucción es necesaria si están habilitadas las
interrupciones result = b * c ' Puede utilizarse ** o */ a = DIV32 100 ' Es necesario si se utiliza una interrupción ENABLE
10. END Detiene la ejecución de un programa e ingresa al modo de bajo consumo. Todos los pines de entrada / salida permanecen en el estado en que se encontraban. END trabaja ejecutando una instrucción SLEEP continuamente en un lazo. Una instrucción END, STOP o GOTO debe colocarse al final de cada programa para controlar que no se pare y que se salga fuera de los límites de la memoria.
11. FOR Conteo = Inicio TO final {STEP {-} Inc} {Cuerpo} NEXT {Conteo} El lazo FOR…NEXT permite la ejecución de varias instrucciones un número de veces especificado, utilizando como contador a una variable.
Ejemplo FOR i = 1 TO 10 ' Cuente de 1 a 10 SEROUT 0,N2400,[#i,” “] ' envíe cada número al Pin0 en forma serial NEXT i ' Regrese y haga el siguiente conteo SEROUT 0,N2400,[10] ' Envíe un caracter nueva línea 12. FREQOUT Pin,Onms,Frecuencia1{,Frequencia2} Produce la Frecuencia(s) requerida sobre el pin especificado por Onms milisegundos. El pin automáticamente se define como salida. Una o dos frecuencias pueden ser producidas al mismo tiempo en valores de 0 a 32767 Hertz.
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
7
FREQOUT funciona de mejor manera con osciladores de 20MHz. Puede trabajar también con osciladores de 10MHz y con 4MHz.
Ejemplo 'Envíe un tono de 1KHz en el Pin1 durante 2 segundos FREQOUT PORTB.1,2000,1000
13. GOSUB Etiqueta Salta a la subrutina que se encuentra en “etiqueta” almacenado su dirección de retorno en la pila. El número de subrutinas que puede utilizarse es ilimitado y puede considerarse subrutinas anidadas. El número máximo de niveles en la subrutinas anidadas es de 4.
Ejemplo GOSUB beep ' Ejecute la subrutina llamada beep ... beep: HIGH 0 'Encienda el LED conectado en el Pin0 SOUND 1,[80,10] 'Haga sonar el parlante conectado en el Pin1 LOW 0 ' Apague el LED conectado al Pin0 RETURN ' Regrese a la rutina principal que llamó al programa en ejecución
14. GOTO Etiqueta La ejecución del programa continúa con las instrucciones que se encuentran después de “etiqueta”.
Ejemplo GOTO enviar ' Salta a la instrucción que se especifica en la etiqueta enviar. ... enviar: SEROUT 0,N2400,["Hola"] ' Envíe “Hola” por el Pin0 en forma serial
15. HIGH Pin Coloca el pin especificado en nivel lógico alto. En forma automática el pin se convierte en salida. El valor de pin puede ser una constante, o una variable que contiene un número de 0 a15 (ejem. B0) o el nombre de un pin (ejem: PORTA.0).
Ejemplo HIGH 0 ' Haga al pin 0 una salida y colóquelo en alto (~5 voltios) HIGH PORTA.0 ' Haga al pin 0 del PORTA una salida y colóquelo en alto led VAR PORTB.0 ' Defina el pin LED en el PORTB.0
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
8
HIGH led ' Haga que al pin LED una salida y colóquelo en alto. En forma alterna, si el pin está ya definido como una salida, una f orma más rápida para colocar en nivel alto a un pin sería: PORTB.0 = 1 'Coloque el pin 0 del PORTB en alto.
16. IF Comp { AND /OR Comp...} THEN etiqueta ' Solamente para la versión profesional
IF Comp { AND /OR Comp...} THEN Instrucciones...
ELSE Instrucciones...
ENDIF Realiza una o más comparaciones. Cada una de las comparaciones puede relacionar una variable con otra variable o una constante. Necesariamente debe incluir uno de los operadores de comparación. If..Then evalúa los términos que se comparan para determinar si la expresión es falsa o verdadera. Si se evalúa como verdadera, la operación que se encuentra luego de “Then” se ejecuta. Si se evalúa como falso, la operación que se encuentra luego de “Then” no se ejecuta. Las comparaciones que se evalúan como “0” se consideran falso, cualquier otro valor se considera verdadero. Todas las comparaciones se realizan sin signo. Debe asegurarse de utilizar los paréntesis para especificar en forma clara el orden de las operaciones que se verifican. Si no se considera, los resultados pueden ser erróneos. IF..THEN puede operar de 2 maneras. En una forma, el THEN en un IF..THEN es una sentencia GOTO. Si la condición es verdadera el programa irá a ejecutar la instrucción que se encuentra especificada en la etiqueta de salto. Si el falsa, el programa continuará con la siguiente línea luego de IF..THEN. Ninguna instrucción puede colocarse luego del THEN, esto debe ser siempre una etiqueta.
Ejemplo IF Pin0 = 0 THEN nuevo ' Si el pulsante conectado al Pin0 se presiona (0), el programa debe saltar a la etiqueta nuevo
IF B0 >= 40 THEN viejo 'Si el valor en la variable B0 es mayor o igual que 40, salte a viejo.
IF PORTB.0 THEN otro ' Si el pin = del PORTB, está en alto (1), salte a otro IF (B0 = 10) AND (B1 = 20) THEN lazo
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
9
En la segunda forma, IF..THEN pueden ejecutarse condicionalmente con un grupo de instrucciones siguiendo a THEN. Las instrucciones deben ser seguidas por un ELSE o ENDIF para completar la estructura.
IF B0 <> 10 THEN B0 = B0 + 1 B1 = B1 - 1
ENDIF IF B0 = 20 THEN led = 1
ELSE led = 0
ENDIF 17. INPUT Pin Define al Pin indicado como entrada. El pin puede ser una constante de 0 a15, una variable que contiene un número de 0 a 15 (ejem: B0) o el nombre del pin (ejem: PORTA.0).
Ejemplo INPUT 0 ' Defina al Pin0 como entrada INPUT PORTA.0 ' Defina al PORTA, pin 0 como entrada En forma alterna, el pin puede definirse como una entrada en una forma más rápida y sencilla con: TRISB.0 = 1 ' Defina el pin 0 del PORTB, como entrada Todos los pines de un Puerto pueden ser definidos como entradas especificando el contenido total del registro TRIS de una sola vez: TRISB = %11111111 'Defina a todo el PORTB como entrada
18. LCDOUT Elemento{,Elemento...} Presenta datos en la pantalla del display de cristal líquido (LCD). PicBasic incluye módulos de LCD para el controlador Hitachi 44780 o su equivalente. Si un signo de libras (#) le precede a un elemento, la representación en ASCII para cada dígito es enviada a la salida del LCD. LCDOUT puede utilizar modificadores que utiliza SEROUT2. Los Modificadores que dispone son:
Modificador
Operación
{I}{S}BIN{1..16}
Envía dígitos binarios
{I}{S}DEC{1..5}
Envía dígitos decimales
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
10
{I}{S}HEX{1..4}
Envía dígitos en hexadecimal
REP c\n
Envía el caracter c repetido n veces
STR ArrayVar{\n}
Envía una cadena de n caracteres
Un programa debe esperar por lo menos medio segundo antes de enviar el primer comando al LCD. Un LCD demora en inicializarse. Los comandos se dirigen al LCD mediante el código $FE seguido del comando. Algunos comandos que son útiles se indican en la tabla a continuación:
Comando
Operación
$FE, 1
Borre la pantalla
$FE, 2
Vaya al inicio (inicio de la primera línea)
$FE, $0C Apague el cursor $FE, $0E Subraye al cursor $FE, $0F Haga parpadear al cursor $FE, $10 Mueva el cursor una posición a la izquierda $FE, $14 Mueva el cursor una posición a la derecha $FE, $C0 Mueva el cursor al inicio de la segunda línea $FE, $94 Mueva el cursor al inicio de la tercera línea $FE, $D4 Mueva el cursor al inicio de la cuarta línea Note que existe un comando para mover el cursor al inicio de la segunda línea. Para la mayoría de LCDs, los caracteres presentados y las líneas no son consecutivos en la memoria de la pantalla – por lo que puede haber una interrupción entre las localidades. Para la mayoría de los displays de 16x2, la primera línea empieza en $0 y la segunda línea inicia en $40. El comando LCDOUT $FE, $C0, configura al display para que inicie escribiendo caracteres al inicio de la segunda línea.
Ejemplo LCDOUT $FE, 1, "Hola" 'Borra la pantalla del display y muestra “Hola” LCDOUT B0, #B1 El LCD ouede ser conectado a un microcontrolador PIC utilizando 4 u 8 líneas. Si se utilizan 8 líneas, estas deben estar en un único Puerto. Si se utilizan únicamente 4 bits estos deben conectados a los 4 bits más significativos o a los 4 menos significativos de un puerto. Las líneas Enable y Register Select pueden ser conectadas a cualquier pin de un puerto. R/W debe conectarse a tierra debido a que el comando LCDOUT es solamente de escritura. El programa PICBasic asume que el
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
11
LCD está conectado a los pines especificados al menos que se establezca de otra manera. Asume que el LCD será utilizado con el bus de 4 bits DB4 DB7 conectado al PIC en los pines PORTA.0 - PORTA.3, La conexión Register Select a PORTA.4 y el pin Enable al PORTB.3. Se define que el LCD presentará los datos inicialmente en la línea 2. Para cambiar esta configuración, debe colocar las siguientes instrucciones, todas ellas en mayúsculas en la parte inicial del programa. Para cambiar la configuración anteriormente indicada, indique lo siguiente: 'Defina el Puerto para el LCD DEFINE LCD_DREG PORTB 'Indique el bit en el que se inicia la connexion (0 o 4) si es un bus de 4-bits DEFINE LCD_DBIT 4 'Defina el Puerto para el Register Select del LCD DEFINE LCD_RSREG PORTB 'Defina el bit para el Register Select del LCD DEFINE LCD_RSBIT 1 'Defina el puerto para la señal Enable del LCD. DEFINE LCD_EREG PORTB 'Defina el bit Enable del LCD DEFINE LCD_EBIT 0 'Defina el tamaño del bus (4 u 8 bits) DEFINE LCD_BITS 4 'Defina el número de líneas en el LCD DEFINE LCD_LINES 2 'Defiina el comando de retardo en us DEFINE LCD_COMMANDUS 2000 'Defina el tiempo de retardo en us DEFINE LCD_DATAUS 50 Esta configuración le indica a PicBasic que se conectará un display de 2 líneas, que trabaja en el modo de 4 bits con el bus de datos en la parte superior del PORTB, el Register Select está en PORTB.1, y Enable en el PORTB.0.
19. LOW Pin Hace que el pin especificado se coloque en bajo. El pin se define en forma automática como salida. Este puede ser una constante de 0 a 15, o una
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
12
variable que contiene un número de 0 a 15 (ejem: B0) o el nombre de un pin (ejem: PORTA.0).
Ejemplo LOW 0 ' Haga al Pin0 una salida y colóquelo en bajo (0 volts) LOW PORTA.0 ' Haga el pin 0 del PORTA, una salida y colóquelo en bajo) VAR
PORTB.0 ' Defina el pin denominado LOW LED ' haga el pin LED como salida y colóquelo en bajo (0 volts) LED
LED
En forma alterna, si el pin ya es una salida, una manera corta y sencilla sería de la forma: PORTB.0 = 0 ' Coloque el pin 0 del PORTB, en bajo
20. ON INTERRUPT GO TO Etiqueta ON INTERRUPT permite el manejo de interrupciones del microcontrolador mediante una subrutina de PICBasic. Existen dos formas para manejar interrupciones, la primera es escribir en lenguaje asembler la rutina de la interrupción, la cual es la forma de manejar a las interrupciones con la menor latencia y con el mínimo uso de instrucciones. El segundo método es mediante el uso de la subrutina que se define con la instrucción ON INTERRUPT GO TO a continuación de la “Etiqueta”, la cual debe finalizar con la instrucción RESUME.
21. OUTPUT Pin Hace que funcione como una salida el pin indicado. El pin puede ser una constante de 0 a 15, una variable que contiene un número de 0 a 15 (ejem: B0) o el nombre de un pin (ejem: PORTA.0).
Ejemplo OUTPUT 0 'Haga al Pin0 una salida OUTPUT PORTA.0 ' Haga al pin 0 del PORTA, una salida En forma alterna, el pin puede ser definido como salida en una manera fácil y sencilla de la siguiente manera: TRISB.0 = 0 ' Defina el bit 0 del PORTB como salida Todos los bits del Puerto pueden ser definidos como salida colocando el registro TRIS de una sola acción: TRISB = %00000000 ' Defina todos los bits del PORTB como salida
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
13
22. POT Pin,Escala,Var Lee el valor de un potenciómetro (o algún otro elemento resistivo) en un Pin. El Pin puede ser una constante de 0 a 15, una variable que contiene un número de 0 a 15 (ejem: B0) o el nombre de un pin (ejem: PORTA.0). La resistencia es medida mediante la temporización de un capacitor por el que se descarga en conjunto con la resistencia (típicamente 5K a 50K). El valor “Escala” es utilizado para ajustar las constantes RC. Para grandes constantes RC, “Escala” debería definirse en bajo (una valor mínimo de uno). Para constantes RC pequeñas, “Escala” debería ser definido a su máximo valor de 255. Si se coloca “Escala” correctamente, “Var” debería para cero, ser un valor mínimo y para 255 un valor cercano a la máxima resistencia. Desafortunadamente, “Escala” debe ser determinado experimentalmente. Para esto, se coloca un elemento en medición a la máxima resistencia y se lee con la escala en 255. Bajo estas condiciones, “Var” producirá un valor apropiado para “Escala”.
Ejemplo POT 3,255,B0 ' Lee el potenciómetro que se encuentra en el pin 3 para determinar su escala SEROUT 0,N2400,[#B0] 'Envíe el valor del potenciómetro en forma serial por el pin 0.
23. PULSIN Pin,Estado,Var Mide el ancho del pulso que se ingresa en un pin. Si el estado es “bajo”, el ancho del pulso en bajo se mide. Si el estado es “alto”, se mide el ancho del pulso en alto. El valor medido se coloca en “Var”. Si no se produce un cambio o el ancho del pulso es muy grande, “Var” se coloca en “0”. Si se utiliza una variable de 8 bits, únicamente se registra los 8 bits menos significativos de la medida que de otra manera debería ser de 16 bits. El valor del pin puede ser una constante entre 0 y 15, una variable que contiene valor entre 0 y 15 (por ejemplo B0) o el nombre del pin (por ejemplo PORTA.0). La resolución de la medida de PULSIN depende de la frecuencia del oscilador. Si se utiliza un oscilador de 4MHz, el ancho del pulso se presenta en incrementos de 10us. Si el oscilador utilizado es de 20MHz, el ancho del pulso tendrá una resolución de 2us.
Ejemplo 'Mida el ancho del pulso en alto en el Pin4 y guarde el resultado en W3 PULSIN PORTB.4,1,W3
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
14
24. PULSOUT Pin,Periodo Genera un pulso de un periodo específico sobre un pin. El pulso se genera cambiando el estado del pin dos veces, de tal manera que la polaridad inicial del pulso determina la forma de la salida, El pin se define como salida en forma automática. El valor del pin puede ser una constante entre 0 y 15, una variable que contiene valor entre 0 y 15 (por ejemplo B0) o el nombre del pin (por ejemplo PORTA.0). La resolución de PULSOUT depende de la frecuencia del oscilador. Si se utiliza un oscilador de 4MHz, el periodo del pulso generado se presentará en incrementos de 10us. Si el oscilador es de 20MHz, el periodo tendrá una resolución de 2us.
Ejemplo 'Envíe un pulso de 1mSec de duración (a 4MHz) al Pin5 PULSOUT PORTB.5,100
25. PWM Pin,Duty,N Coloca a la salida un tren de pulsos modulados en ancho sobre un pin. Cada ciclo de PWM consiste de 256 pasos. La relación de trabajo (Duty) para cada ciclo PWM varía de 0 (0%) a 255 (100%). Este ciclo PWM se repite N veces. El valor del pin puede ser una constante de 0 a 15, una variable que contiene valor de 0 a 15 (por ejemplo B0) o el nombre del pin (por ejemplo PORTA.0). El tiempo del ciclo de PWM depende de la frecuencia del oscilador. Si se utiliza un oscilador de 4MHz, cada N será de alrededor de 5ms de duración. Si el oscilador es de 20MHz, cada N será de alrededor de 1ms en duración. El pin se hace salida antes de iniciar la generación del PWM y se convierte en entrada después de que termina la generación. La salida PWM en un pin parece ser información sin sentido, sin una forma exacta de onda cuadrada. Es necesario utilizar algún filtro para convertir a la señal en algo útil. Un circuito RC puede ser utilizado como un conversor D/A.
26. RESUME { Etiqueta} Permite a un programa regresar al lugar en el que lo dejo en el momento de aceptar una interrupción. RESUME es similar a RETURN pero se utiliza al final de una interrupción de PicBasic. Si se utiliza la Etiqueta, que es opcional, la ejecución del programa continuará en la “Etiqueta” en vez de continuar en donde abandonó para ejecutar la interrupción.
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
15
27. RETURN Regresa de una subrutina. RETURN regresa a la ejecución de la instrucción de la que fue llamado luego de la instrucción GOSUB.
Ejemplo GOSUB sub1 ' Vaya a la subrutina denominada sub1 ... sub1:
SEROUT 0,N2400,["Hola"] ' Envíe “Hola” en forma serial por el Pin0 RETURN ' Regrese al programa principal luego de Gosub 28. SERIN Pin,Modo,{Timeout,Etiqueta,}{[Control...],}{Señal..} Recibe una o más señales en el pin en formato asincrónico estándar utilizando datos de 8 bits, sin paridad y un bit de parada (8N1). Con SERIN el pin se convierte en forma automática en entrada. El valor del pin puede ser una constante entre 0 y 15, una variable que contiene un valor entre 0 y 15 (por ejemplo B0) o el nombre del pin (por ejemplo PORTA.0). El nombre del modo (por ejemplo T2400) se define en el archivo MODEDEFS.BAS. Para utilizarlo, debe incluir la línea de comando:
INCLUDE "modedefs.bas" Al inicio del programa que se realiza en PicBasic. BS1DEFS.BAS y BS2DEFS.BAS se incluyen en MODEDEFS.BAS. No debe incluirlo nuevamente si ya si incluyó uno de estos archivos. Los números de Modo pueden ser utilizados sin incluir este archivo. Modo
Modo No.
Velocidad en Baudios
T2400
0
2400
T1200
1
1200
T9600
2
9600
T300
3
300
N2400
4
2400
N1200
5
1200
N9600
6
9600
N300
7
300
Estado
Verdadero
Invertido
Un tiempo opcional “Timeout” en conjunto con una “etiqueta” pueden incluirse para permitir que continúe con la ejecución del programa si no se
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
16
recibe un caracter dentro de cierto intervalo de tiempo. “Timeout” se especifica en unidades de 1 milisegundo. Los bits de los datos a ser recibidos puede ser precedidos de uno o más “controles” que debe incluirse dentro de las llaves de la instrucción. SERIN debe recibir estos bytes en el orden exacto antes de recibir los bits de los datos. Si un byte recibido no se ajusta a los de control en la secuencia, el proceso de recepción se inicia nuevamente, es decir que el siguiente byte que se recibe se compara nuevamente con los bytes de control. La información de control puede ser una constante, una variable o una cadena de caracteres. Cada carácter de la cadena se lo considera como un control independiente. Luego de que se cumple con los controles, SERIN comienza a almacenar los datos en las variables asociadas con cada carácter. Si se utiliza únicamente el nombre de la variable, el valor del caracter ASCII recibido se almacena en la variable. Si la variable está precedida de por un símbolo (#), SERIN convierte el valor recibido en decimal a su correspondiente representación ASCII y almacena el resultado en esa variable. Aquellos caracteres que no son decimales antes de encontrar al primer dígito se ignoran y se eliminan. Los caracteres que no son dígitos decimales que se encuentran al final de la cadena recibida también son eliminados. SERIN considera un oscilador de 4MHz cuando genera la temporización para la duración de los bits. Para mantener la adecuada velocidad en baudios con otros valores de osciladores, debe asegurarse de definir el oscilador con el comando DEFINE indicando el nuevo valor del oscilador. La mayoría de las aplicaciones permiten la utilización de los PICs sin la necesidad de utilizar convertidores de niveles.
Ejemplo 'Espere hasta que el caracter “A” sea recibido en forma serial en el Pin1 y coloque este nuevo caracter en la variable B0
SERIN 1,N2400,["A"],B0 29. SEROUT Pin,Mode,[Item {,Item...}] Envía uno o más datos al pin en formato estándar asincrónico utilizando 8 bits, sin paridad y un bit de parada (8N1). SEROUT es similar al comando BS1. El pin se convierte en salida en forma automática. El valor del pin puede ser una constante entre 0 y 15, una variable que contiene un valor de 0 a 15 (por ejemplo B0) o el nombre del pin (por ejemplo PORTA.0). El nombre del modo (por ejemplo T2400) se define en el archivo MODEDEFS.BAS. para utilizarlo, debe incluir el comando:
INCLUDE "modedefs.bas" Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
17
Al inicio del programa en PicBasic. BS1DEFS.BAS y BS2DEFS.BAS ya están incluidos en MODEDEFS.BAS. No los incluya nuevamente si uno de estos archivos ya está incluido. El número de modo puede ser utilizado sin la necesidad de incluir este archivo. Modo
Modo No.
Velocidad en Baudios Estado
T2400
0
2400
T1200
1
1200
T9600
2
9600
T300
3
300
N2400
4
2400
N1200
5
1200
N9600
6
9600
N300
7
300
OT2400
8
2400
OT1200
9
1200
OT9600
10
9600
OT300
11
300
ON2400
12
2400
ON1200
13
1200
ON9600
14
9600
ON300
15
300
Salida sin inversión
Salida invertida
Salida abierta sin inversión
Salida abierta invertida
SEROUT permite manejar tres tipos diferentes de datos los cuales pueden combinarse y chequearse su correspondencia dentro de la instrucción SEROUT: 1. Una cadena de caracteres se coloca a la salida como una cadena de caracteres ASCII 2. Un valor numérico (sea constante o variable) se envía utilizando su correspondiente valor ASCII. Para este caso el valor 13 se considera como un “enter” y “10” como “siguiente línea”. 3. Un valor numérico precedido por el símbolo “#” enviará la representación en ASCII de su valor decimal. Por ejemplo, si W0=123, la instrucción con #W0 enviará los valores ASCII del 1, 2 y 3. SEROUT considera un oscilador de 4MHz cuando genera el tiempo de duración de los bits. Para tener la apropiada temporización de los bits de acuerdo a una velocidad en baudios, debe utilizar DEFINE para indicar el
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
18
oscilador a ser utilizado. En ciertos casos, las velocidades de transmisión de la instrucción SEROUT no pueden ser definidas adecuadamente. La instrucción de alargamiento de caracteres (character pacing) permite retardo de 1 to 65,535 microsegundos (.001 to 65.535 milisegundos) entre cada uno de los caracteres que se transmite. Por ejemplo, para incluir una pausa de 1 milisegundo entre la transmisión de cada carácter use:
DEFINE CHAR_PACING 1000 La mayoría de las aplicaciones que se utilizan con los PICs no requiere de conversores de niveles a RS-232, para esto, las salidas invertidas TTL (N300..N9600) pueden ser utilizadas. Una resistencia limitadora de corriente se sugiere utilizar (la interfase RS-232 se supone que soporta cortocircuitos en su entrada).
Ejemplo 'Envíe
en forma serial el valor ASCII de B0 seguido de un carácter “enter” por el pin 0
SEROUT 0,N2400,[#B0,13] REFERENCIAS -
PIC BASIC HELP
-
MICROENGINEERING LABS, INC
Ing. Eddie Galarza Z. MSc. - ESPE Latacunga
19