PROTON IDE http://protoncompiler.blogspot.pe/2010/05/proton-ide.html
1 may. 2010
FUNDAMENTOS DE PROTON BASIC El compilador Proton Basic es un lenguaje de programación de nueva generación que hace mas fácil y rápido el manejo de microcontroladores Pic micro de Microchip. El lenguaje Basic es mucho más fácil de leer y escribir que el lenguaje ensamblador Microchip. El Proton Basic produce un código que puede ser programado para una variedad de micro controladores PIC que tengan de 8 a 68 pins y varias opciones en el chip incluyendo convertidores A/D, temporizadores y puertos seriales. Bases del Protón Basic Identificadores Un identificador es simplemente un nombre. Son usados en Pronto Basic como etiquetas de líneas y nombres de variables. Un identificador es cualquier secuencia de letras, dígitos y símbolos, aunque no deben comenzar con un dígito. Los identificadores no distinguen las letras mayúsculas de las minúsculas, por lo que etiqueta, ETIQUETA, Etiqueta son todas tratadas como equivalentes. Aunque las etiquetas pueden tener cualquier número de caracteres de longitud, Protón Basic solamente reconoce los primeros 32. Etiquetas Para marcar líneas que el programa puede desear referenciar con comandos GOTO ó GOSUB, Proton BAsic usa tiquetas de línea y no permite número de línea y no requiere que cada línea sea etiquetada. Cualquier línea puede comenzar con una etiqueta de línea que es simplemente un identificador seguido por dos puntos (:) ejemplo here: Goto here Variables Variables es donde se guardan datos en forma temporaria en el programa. Son creadas usando la palabra clave DIM. Pueden ser bits , bytes, word, dword, float y string. El Espacio para cada variable es automáticamente destinado en la memoria RAM del microcontrolador. El formato para crear una variable es el siguiente: DIM etiqueta AS tipo
Etiqueta es cualquier identificador excluyendo palabras claves como se describe anteriormente. Tipo es bit, byte , word , dword or float. Algunos ejemplos de declaracion de varibles de cada tipo son: DIM Var1 DIM DIM DIM DIM DIM
AS BYTE ' Crea una variable de 8-bit sin signo (0 - 255)
Var2 AS BIT ' Crea una variable de un simple bit (0 - 1) Var3 AS WORD ' Crea una variable de 16-bit sin signo (0 - 65535) Var4 AS DWORD ' Crea a variable de 32-bit con signo (-2147483647 , +2147483647) Var5 AS FLOAT ' Crea una variable de 32-bit punto flotante. ST AS STRING * 20 ' Crea una cadena con capacidad de 20 caracteres (8-bit)
Alias DIM también puede ser usado para crear un alias para una variable. Esto es muy útil para acceder al interior de una variable. Dim Var1 as Var2 ´Var2 es otro nombre de var1 Dim VAr3 as Portb.1 ´asigna el alias Var3 a la patilla RB0 Arreglos Los arreglos de variables pueden ser creados en una manera similar a las variables. Dim Etiqueta [tamaño] as tipo Etiqueta es cualquier identificador, excluyendo palabras claves, como se describió anteriormente. Tipo es BIT, BYTE ó WORD. Número de elementos es cuantos lugares en el arreglo se desean. Algunos ejemplos de creación de arreglo son los siguientes: DIM sharks[10] as byte DIM var3[10] as Word La primera ubicación dentro del arreglo es el elemento cero. Dada la forma en que los arreglos están localizados en memoria hay límites de tamaño para cada tipo. Constantes Las llamadas constantes pueden ser creadas de manera similar a las variables. Puede ser mas conveniente usar un nombre de constante en lugar de un número constante. Si el número necesita ser cambiado, únicamente puede ser cambiando en un lugar del programa donde se define la constante. No pueden guardarse datos variables dentro de una constante. Ejemplos : Dim Mice as 4.13 En este ejemplo la constante mice es de 4,13 y la misma no puede ser modificada durante el transcurso del programa. Constantes Numéricas Proton BAsic permite definir constantes numéricas en tres bases: decimal, binario y hexadecimal. Valores binarios son definidos usando el prefijo “%” y valores hexadecimales usando el prefijo “$”. Los
valores decimales se toman por defecto y no requieren prefijo. Ejemplos: 100 ´ valor decimal 100 %100 ´ valor binario para el decimal 4. $100 ´ valor hexadecimal para el decimal 256. Pines A los pines de Microcontrolador, se puede acceder de diferentes modos. El mejor camino para especificar un pin para una operación, es simplemente usar sus nombres PORT y un número de bit: PORTB.1=1 ‘ Coloca PORTB, bit 1 a 1 Para recordar fácilmente para qué puede ser usado un pin, debe serle asignado un nombre usando el comando DIM. De esta manera, el nombre puede ser utilizado luego en cualquier operación. Comentarios Un comentario de Protón Basic comienza con la palabra clave REM o el apóstrofe (´). Todos los demás caracteres de esa línea se ignoran. REM es una única palabra clave y no es una abreviación de REMark, por lo tanto, los nombres de variables pueden comenzar con REM (aunque REM por sí mismo no es válido). Declaraciones múltiples Para permitir programas mas compactos y agrupamientos lógicos de comandos relacionados, Proton Basic soporta el uso de (:) para separar comandos ubicados en la misma línea. Los siguientes dos ejemplos son equivalentes. W2 = W0 W0 = W1 W1 = W2 Es lo mismo que: W2 = w0 : W0 = W1 : W1 = W2 En los dos casos, el tamaño del código generado es el mismo. Operadores Matemáticos Protón Basic efectúa todas las operaciones matemáticas en orden jerárquico. Esto significa que existe precedencia para los operadores .Multiplicación y división son efectuados antes que suma y resta , por ejemplo. Para asegurarse que las operaciones son efectuadas en el orden que se desea, se usan paréntesis para agrupar las operaciones. A=(B+C)*(D-E) Todas las operaciones matemáticas se realizan sin signo y con una precisión de 16 bit. Los operadores soportados son : Operador matemático Descripción + Suma - Resta
* Multiplicación ** 16 bits superiores de la multiplicación */ 16 nits medios de la multiplicación / División // Resto (módulo) << Desplazamiento izquierdo >> Desplazamiento derecho ABS Valor absoluto COS Coseno DIG Digito SIN Seno SQR Raiz cuadrada Operadores lógicos Los operadores lógicos difieren de las operaciones de bit inteligente. Entregan un resultado CIERTO / FALSO de su operación .Valores 0 son tratados como falso. Cualquier otro valor es cierto. Se usan junto a operadores de comparación en una declaración IF .. THEN .Los operadores soportados son : Operador Descripción AND o && AND logico OR o I I OR logico XOR o ^ ^ OR exclusivo logico NOT AND NAND logico NOT OR NOR logico NOT XOR NXOR logico
Relational operators are used to compare two values as shown in the list below. The result can be used to make a decision regarding program flow.
Operadores del tipo Expression de Relacion Los Operadores de Relacion son usados para comparar dos valores como se muestra en la lista abajo. El resultado es boleano y pouede ser usado para tomar deiciones en el flujo del programa. Operador = <>
Relacion Igualdad desigualdad
Ejemplo X=Y X <> Y
< > <= >=
menor que mayor que menor o igual que mayor o igual que
XY X <= Y X >= Y
CALL etiqueta Ejecuta la subrutina ensamblador llamada etiqueta. Normalmente se usa GOSUB para ejecutar una subrutina .La principal diferencia entre GOSUB y CALL, es que con ésta última no se chequea la existencia de etiquetas hasta el momento de ensamblar. Usando CALL se puede acceder a una etiqueta en una sección de lenguaje ensamblador, lo que es inaccesible mediante Protón Basic . Dentro de los comandos de Protón Basic mas estudiados para la elaboración del diseño se describen los Siguientes: END Detiene la ejecución del proceso y entra en modo de baja potencia .Todos los pins de I/O permanecen en el estado en que se encuentran ,END trabaja ejecutando una instrucción SLEEP continua dentro de un loop . Un END , STOP ó GOTO deben ser colocados al final de un programa para evitar pasar del límite de la misma u comience nuevamente . FOR .. NEXT FOR Count = Start TO End {STEP {-} Inc} {Body} NEXT {Count} El loop FOR .. NEXT permite a los programas ejecutar un número de declaraciones ( Body ) un numerode veces , usando una variable como contador . Debido a su complejidad y versatilidad , es mejor describirla paso a paso . El valor de Start se asigna a la variable índice ,Count , que puede ser una variable de cualquier tipo . Se ejecuta el Body . Body es opcional y puede ser omitido ( quizás por un loop de demora ). El valor de Inc es sumado a ( ó restado si se especifica “-“ ) Count .Si no se define una cláusula STEP , se incrementa Count en uno . Si Count no pasó End ó desbordó el tipo de variable , la ejecución vuelve al paso 2) . Si el loop necesita contar más de 255 ( Count > 255 ) , se debe usar una variable de tamaño word . IF ...THEN IF Comp { AND/OR Comp ... } THEN {Declaración} ELSE { Declaración} ENDIF Efectúa una ó más comparaciones .Cada término Comp puede relacionar una variable con una constante ú otra variable e incluye uno de los operadores listados anteriormente . En la segunda forma, IF..THEN puede ejecutar condicionalmente un grupo de declaraciones que sigan al THEN. Las declaraciones deben estar seguidas por un ELSE o un ENDIF para completar la estructura. ON INTERRUPT GOTO Label Permite el manejo de las interrupciones del micro controlador por medio de una subrutina . Existen dos
formas de manejar interrupciones usando Proton Basic . La primera es escribir una subrutina de interrupción en lenguaje ensamblador .Esta es la forma de manejar interrupciones con la menor latencia y el menor overhead . El segundo método es escribir un handler ( manejador ) de interrupciones.Es similar a una subrutina , pero termina con un RESUME . Cuando ocurre una interrupción , se marca con una bandera .Cuando la ejecución de la declaración que se estaba ejecutando termina , el programa salta al handler de interrupciones indicado en Label. Una vez que termina el trabajo del handler , una declaración RESUME envía el programa de vuelta a donde estaba cuando ocurrió la interrupción , tomando todo como lo dejó . DISABLE y ENABLE Permiten que distintas secciones de un programa se ejecuten sin la posibilidad de ser interrumpidas .El lugar más notorio para usar DISABLE es justo antes del actual handler de interrupciones. O el handler puede ser colocado antes que la declaración ON INTERRUPT ya que la bandera de interrupciones no se chequea antes del primer ON INTERRUPT en un programa . 2 may. 2010
FORMATO GENERAL 1.-El compilador no diferencia mayusculas de minusculas, excepto cuando procesamos constantes entre comillas como "Hola". 2.- Multiples instrucciones pueden ser combinada en la misma linea separando cada una por dos puntos (":"). Por ejemplo: TRISB = 000000 : FOR VAR1 = 0 TO 100 : PORTB = VAR1 : NEXT 3 may. 2010
REPRESENTACIONES NUMERICAS PROTON reconoce cuatro diferentes representaciones numericas: Binario, por el prefijo %, por ejemplo: PORTB = %11110000 Hexadecimal, por el prefijo $, por ejemplo: PORTC = $11110000 Caracter byte, se utiliza colocando los cvaracteres entre comillas y se corresponden en decimal a su correpondiente en codificacion ASCII. Por ejemplo: var1 = "a" ; y representa el valor 97. Decimal, los valores decimales no requieren prefijo. PORTD = 254
Punto Flotante, es creado por el uso del punto decimal. Por ejemplo: var2 = 3.1 4 may. 2010
REGISTROS DE HARDWARE Y PUERTOS Todos los registros del hardward PICmicro, incluyendo los puertos, pueden ser accedidos igual que cuquier variable. Esto quiere decir que pueden ser leidas o escritas con el uso de ecuaciones directamente: Por ejemplo: PORTA = %01010101 ' Escribe el valor binario en el puerto A VAR1 = WRD * PORTA 'Multiplica la variable WRD y el puerto A
El compilados tambien puede combinar registros de 16 bits como TMR1, en una variable del tipo word. Lo cual simplifica la lectura y escritura de estos registros. Ejemplo: DIM TIMER1 AS TMR1L.WORD TIMER1 = 12345 Se combinan TMR1H, y TMR1L en una variable TIMER1, luego TMR1 se carga con el valor 12345. DIM TIMER3 AS TMR3L.WORD ' Combine TMR3L y TMR3H DIM AD_RESULT AS ADRES.WORD ' Combina ADRESL y ADRESH DIM MUL_PROD AS PRODL.WORD ' Combina PRODL y PRODH
5 may. 2010
CONSTANTES Y SIMBOLOS DECLARACION DE CONSTANTES Las constantes pueden ser creadas de la misma manera que las variables. Estas pueden ser para uso informativo o como nombre de una constante numerica. Una vez que una constante es declarada el valor de esta no puede ser modificado. La manera de declarar una variable es la siguiente: DIM Label as Constant expression Ejemplo : DIM MOUSE as 1 ; el valor de la constante MOUSE sera 1
DIM MICE as MOUSE * 400 ; el valor de la constante MICE sera 1*400 DIM MOUSE_PI as MOUSE + 3.14; ; el valor de la constante MOUSE_PI sera +3,14
DECLARACION DE SIMBOLOS Symbol proporciona otro método para asignar alias a las variables y constant. Symbol no puede ser usado para crear una variable. Constantes declaradas con el empleo de SYMBOL no usan la RAM en el PICmicro.
Ejemplos:
SYMBOL CAT = 123 SYMBOL TIGER = CAT SYMBOL MOUSE = 1 SYMBOL TIGOUSE = TIGER + MOUSE ' SYMBOL PI = 3.14 SYMBOL FL_NUM = 5.0 '
6 may. 2010
PALABRAS RESERVADAS Las palabras de la lista son protejidas para el uso interno del compilador. asegurese de no usar cuanquiera de ellas como nombre de variables o etiquetas, de no ser asi se pueden producir errores.
A ABS, ACOS, ACTUAL_BANKS, ADC_RESOLUTION, ADIN, ADIN_RES, ADIN_STIME, ADIN_TAD ALL_DIGITAL, ASM, AVAILABLE_RAM, ASIN, ATAN
B BANK0_END, BANK0_START, BANK10_END, BANK10_START, BANK11_END, BANK11_START BANK12_END, BANK12_START, BANK13_END, BANK13_START, BANK14_END, BANK14_START BANK15_END, BANK15_START, BANK1_END, BANK1_START, BANK2_END, BANK2_START BANK3_END, BANK3_START, BANK4_END, BANK4_START, BANK5_END, BANK5_START BANK6_END, BANK6_START, BANK7_END, BANK7_START, BANK8_END, BANK8_START BANK9_END, BANK9_START, BANK_SELECT_SWITCH, BANKA_END, BANKA_START BIN, BIN1, BIN2, BIN3, BIN4, BIN5, BIN6, BIN7, BIN8, BIN9, BIN10, BIN11, BIN12
,BIN13, BIN14, BIN15, BIN16, BIN17, BIN18, BIN19, BIN20, BIN21, BIN22, BIN23, BIN24, BIN25 ,BIN26, BIN27, BIN28, BIN29, BIN30, BIT, BOOTLOADER, BOX, BRANCH BRANCHL, BREAK, BRESTART, BSTART, BSTOP, BUS_DELAYMS, BUSACK, BUSIN, BUSOUT BUTTON, BUTTON_DELAY, BYTE
C CALL, CASE, CCP1_PIN, CCP2_PIN, CDATA, CERASE, CHR$, CIRCLE, CLEAR, CLEARBIT, CLS CON, CONFIG, CONTEXT, CORE, COS, COUNT, COUNT_ERRORS, COUNTER, CREAD, CURSOR, CWRITE
D DA, DATA, DB, DC, DCD, DE, DEC, DEC1, DEC2, DEC3, DEC4, DEC5, DEC6, DEC7, DEC8, DEC9, DEC10 DECLARE, DEBUG, DEFINE, DELAYMS, DELAYUS, DEVICE DJC, DJNC, DJZ, DJNZ, DIG, DIM, DISABLE, DIV2, DT, DTMFOUT, DW, DWORD
E EDATA, EEPROM_SIZE, ELSE, ELSEIF, ENABLE, END, ENDSELECT, ENDASM ENDIF, ENDM, EQU, EREAD, ERRORLEVEL, EWRITE, EXITM, EXP, EXP10, EXPAND EXP
F FILE_REF, FLASH_CAPABLE, FLOAT, FONT, FONT_ADDR, FOR, FREQOUT, FSRSAVE
G GETBIT, GLCD_CS_INVERT, GLCD_FAST_STROBE, GOSUB, GOTO
H HBRESTART, HBSTART, HBSTOP, HBUS_BITRATE, HBUSACK HBUSIN, HBUSOUT, HEX, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7, HEX8
HIGH, HPWM, HRSIN, HRSOUT, HSERIAL_BAUD HSERIAL_CLEAR, HSERIAL_PARITY, HSERIAL_RCSTA, HSERIAL_SPBRG, HSERIAL_TXSTA
I I2CREAD, I2CWRITE, IBIN, IBIN1, IBIN2, IBIN3, IBIN4, IBIN5, IBIN6, IBIN7, IBIN8, IBIN9, IBIN10, IBIN11, IBIN12 IBIN13, IBIN14, IBIN15, IBIN16, IBIN17, IBIN18, IBIN19, IBIN20, IBIN21, IBIN22, IBIN23, IBIN24, IBIN25 IBIN26, IBIN27, IBIN28, IBIN29, IBIN30,ICD, IDATA, IF IHEX, IHEX1, IHEX2, IHEX3, IHEX4, IHEX5, IHEX6, IHEX7, IHEX8 INC, INCLUDE, INKEY, INPUT, INTERNAL_BUS, INTERNAL_FONT, IJC, IJNC, IJNZ, IJZ ISBIN, ISBIN1, ISBIN2, ISBIN3, ISBIN4, ISBIN5, ISBIN6, ISBIN7, ISBIN8, ISBIN9, ISBIN10, ISBIN11, ISBIN12 ISBIN13, ISBIN14, ISBIN15, ISBIN16, ISBIN17, ISBIN18, ISBIN19, ISBIN20, ISBIN21, ISBIN22, ISBIN23, ISBIN24, ISBIN25 ISBIN26, ISBIN27, ISBIN28, ISBIN29, ISBIN30 ISDEC, ISDEC1, ISDEC2, ISDEC3, ISDEC4, ISDEC5, ISDEC6, ISDEC7, ISDEC8, ISDEC9, ISDEC10 ISHEX, ISHEX1, ISHEX2, ISHEX3, ISHEX4, ISHEX5, ISHEX6, ISHEX7, ISHEX8
J
K KEYPAD_PORT
L LCD_CS1PIN, LCD_CS2PIN, LCD_DTPIN, LCD_DTPORT, LCD_ENPIN, LCD_INTERFACE LCD_LINES, LCD_RSPIN, LCD_RWPIN, LCD_TYPE, LCDOUT, LCDREAD, LCDWRITE LEN, LEFT$ LET, LIBRARY, LINE, LOADBIT, LOCAL, LOG, LOG10, LOOKDOWN, LOOKDOWNL, LOOKUP, LOOKUPL, LOW
M MACRO_PARAMS, MAX, MID$, MIN, MSSP_TYPE
N NCD, NEXT
O ON, ON_INTERRUPT, ON_LOW_INTERRUPT, ONBOARD_ADC, ONBOARD_UART ONBOARD_USB, OREAD, ORG, OUTPUT, OWRITE
P PAGE, PAGESEL, PAUSE, PAUSEUS, PEEK, PEEKCODE, PICMICRO_PAGES PIXEL, PLOT, POKE, POKECODE, POP, PORTB_PULLUPS, POT, POW, PRINT, PSAVE PULSIN, PULSIN_MAXIMUM, PULSOUT, PUSH, PWM
Q
R RAM_BANK, RAM_BANKS RANDOM, RCIN, RCTIME, READ, REM, REMARKS, REMINDERS, REP REPEAT, RES, RESET_BANK, RESERVE_RAM, RESTORE, RESUME, RETURN, REV RIGHT$, ROR, ROL, RSIN, RSIN_MODE, RSIN_PIN, RSIN_TIMEOUT, RSOUT RSOUT_MODE, RSOUT_PACE, RSOUT_PIN
S S_ASM, SBIN, SBIN1, SBIN2, SBIN3, SBIN4, SBIN5, SBIN6, SBIN7, SBIN8, SBIN9, SBIN10, SBIN11, SBIN12 SBIN13, SBIN14, SBIN15, SBIN16, SBIN17, SBIN18, SBIN19, SBIN20, SBIN21, SBIN22, SBIN23, SBIN24, SBIN25 SBIN26, SBIN27, SBIN28, SBIN29, SBIN30, SCL_PIN, SDEC, SDEC1, SDEC2, SDEC3, SDEC4, SDEC5, SDEC6 SBREAK, SDEC7, SDEC8, SDEC9, SDEC10
SDA_PIN, SERIAL_BAUD, SEED, SELECT, SERIAL_DATA SERIN, SERIN2, SEROUT, SEROUT2, SERVO, SERIAL_PARITY SET, SET_BANK, SETBIT, SET_DEFAULTS, SET_OSCCAL, SHIFT_DELAYUS SHEX, SHEX1, SHEX2, SHEX3, SHEX4, SHEX5, SHEX6, SHEX7, SHEX8 SHIN, SHOUT, SIN, SLEEP, SLOW_BUS, SNOOZE SOUND, SOUND2, SQR, SSAVE, STEP, STOP, STR, STRN, STRING, STR$ STAMP_SIN, STAMP_COS, STAMP_SQR, SWAP, SYMBOL
T TAN, THEN, TO, TOGGLE, TOLOWER, TOUPPER
U UDATA, UNPLOT, UNTIL, UPPER USB_CLASS_FILE, USB_DESCRIPTOR, USB_SHOW_ENUM, USBIN, USBINIT, USBOUT
V VAL, VAR, VARIABLE
W WAIT, WARNINGS, WATCHDOG, WEND, WHILE, WORD, WRITE, WSAVE
X XIN, XOUT, XIN_TRANSLATE, XOUT_TRANSLATE, XTAL
Y
Z
7 may. 2010
ARREGLOS (ARRAYS) El PROTON compiler SOPORTA variables de multiples elementos del tipo byte o word. Un arreglo es un grupo de variables de el mismo tipo (8-bits ó 16-bits), que comparten el mismo nombre , pero coocadas en celdas numeradas llamadas elementos.
Un arreglo se define usando las siguiente sintaxis: DIM Nombre[ largo] AS BYTE DIM Nombre[largo ] AS WORD Nombre => cualquiera, excluyendo las palabras reservadas largo => (0-255) para el tipo byte, (0-128) para el tipo word. Ejemplo: DIM MYARRAY[10] AS BYTE ' Crea un arreglo de 10 elementos del tipo byte. DIM MYARRAY[10] AS WORD ' Creaun arreglo de 10 elementos del tipo word
Codigo Ejemplo: DEVICE 16F84 ' DIM MYARRAY[10] AS BYTE ' Creaun arreglo de 10 elementos del tipo byte. DIM INDEX AS BYTE ' Crea una variable normal del tipo BYTE.
FOR INDEX = 0 TO 9 ' Repite con INDEX= 0,1,2...9 MYARRAY[INDEX] = INDEX * 10 ' NEXT
FOR INDEX = 0 TO 9 ' Repite con INDEX= 0,1,2...9 PRINT AT 1 , 1 , DEC MYARRAY [INDEX] ' DELAYMS 500 'retardo de 500 ms NEXT
STOP
9 may. 2010
CADENAS (STRINGS) EL PROTON compiler soporta variables de cadena ó strings, solo cuando se trabaja con dispositivos de 16-bit core.
La sintaxis para crear cadenas es el siguiente: DIM Nombre as STRING * Largo Nombre => cualquiera que no sea palabra reservada largo = > entre 0-255, es el numero de caracteres que puedes almacenar la cadena. La linea de abajo crea una cadena de nombre ST que puede almacenar 20 caracteres. DIM ST as STRING * 20
Concatenacion Dos o mas cadenas puedes ser concatenadas usando el operador mas (+) : SOURCE_STRING1 = "HELLO SOURCE_STRING2 = "WORLD" ' 'Ambas cadenas son concatenadas en la cedana DEST_STRING DEST_STRING= SOURCE_STRING1+ SOURCE_STRING2
Maniplular Cadenas por Partes Cada posicion de una cadena puede ser accedido usando el mismo nombre de la cadena y con el uso de los corchetes, ejemplo: SOURCE_STRING[0] = "H" Coloca el caracter "H" en la primera posicion, ó posicion cero de la cadena.
10 may. 2010
_ CARACTER DE CONTINUACION DE LINEA Lineas que son muy largas para mostrar, pueden ser cotinuadas en la linea inferior por medio del uso del caracter "_"; y este solo puede ser utilizado luego de un delimitador coma ","; por ejemplo :
VAR1 = LOOKUP VAR2,[1,2,3,_ 4,5,6,7,8]
o tambien
PRINT AT 1,1,_ "HELLO WORLD",_ DEC VAR1,_
HEX VAR2
30 may. 2010
PROGRAMADOR PROTON (MICROCODE LOADER) EL Cargador de microcodigo (Microcode Loader) permite programar el microcontrolador en su circuito de aplicacion , a traves del puerto serial del PC; esta aplicacion esta presente en PROTON IDE. Esto permite contar con la "progrmacion in circuit", y no tener que extraer el microcontrolador para agragarle un codigo nuevo ò modificfado, dandole flexibilidad a su diseño.
Requisitos Para su implementacion se necesita el uso del CI MAX232, en la siguiente configuracion:
Ademas se requiere grabarle el FIRMAWARE del microcontrolador, esto se hace una sola vez, y los codigos se pueden econtrar dentro de la carpeta:
C:\Archivos de programa\Crownhill\ProtonIDELite\MCLoader
Los FIRWARE son especificos para cada microcontarolador y ademas dependiendo del oscilador a utilizar (4 MHZ , 20 MHZ): 30 may. 2010
SEROUT Sintaxis
SEROUT Tpin { \ Fpin } , Baudmode , { Pace, } { Timeout , Tlabel, } [ OutputData ]
Informacion General Trasmite Datos seriales Asincronos (p.e. RS232 datos).
Vea Tambien: Comunicacion Serial - SERIN
31 may. 2010
FOR....NEXT Sintaxis
FOR Variable = ValorInicial TO ValorFinal [ STEP { Incremento } ] {Instrucciones} {Instrucciones} {Instrucciones} . . NEXT
Información general
El bucle for ...next, se utiliza para ejecutar una instrucción o una serie de declaraciones de una determinada cantidad de veces. Operadores Variable - se refiere a una variable de índice utilizado por el bucle. Esta variable de índice en sí puede ser utilizado en el cuerpo del código, pero tenga cuidado de alterar su valor dentro del bucle ya que esto puede causar muchos problemas. ValorInicial - es el valor de que se le asigna inicialmente al Operador Variable le. Este no tiene por qué ser un número real - que podría ser el contenido de otra variable. ValorFinal - es el valor del Operador Variable que genera la terminacion del bucle. Esto no tiene que ser un número real - que podría ser el contenido de otra variable, o una expresión. Incremento - es una constante o variable opcional por el que el operador Variable aumenta o disminuye con cada viaje a través del bucle FOR ... NEXT. Si se desea que Variable tome valores decrementales un signo menos debe preceder a Incremento. Ejemplo 1 ' Muestra en un LCD y en formato decimal, todos los valores que la variable WRD ' toma en el bucle FOR...NEXT
' El bucle se realiza 1000 veces , ya que la variable WRD, inicia con el valor 0 y va uncrementando ' de 2 en dos hasta llegar a 2000 y sale del bucle. DIM WRD as WORD FOR WRD = 0 TO 2000 STEP 2 PRINT Dec WRD ," " ' Muestra el Valor de WRD en el LCD NEXT ' cierre del bucle Ejemplo 2 ' Muestra en Decimal los vallores de WRD ' en este ejemplo el bucle se realiza 1000 veces ya que la variable WRD inicial con el valor ' 2000 y va decrementando de 2 en 2 hasta llegar a cero para finalizar el bucle.
DIM WRD as WORD
FOR WRD = 2000 TO 0 STEP -2 ' PRINT Dec WRD ," " ' ' muetra la variable WRD en el LCD en formato decimal NEXT ' cierre del bucle for..next
31 may. 2010
ADIN (LEER ADC) ADIN Sintaxis Variable = ADIN número de canal Información general Lee el valor del convertidor analogico a digital del microcontrolador. Operadores Variable - una variable definida por el usuario de tipo bit, byte, byte_array, palabra, word_array, dword, o flotar. número del canal - una constante, variable o expresión. (0,1,2,3,4,5,.....)
Ejemplo 'Lee el valor desde el canal 0 del ADC y el lugar en la variable VAR1. DECLARE ADIN_RES 10 'resultado de 10-bit requiere RC DECLARE ADIN_TAD FRC 'OSC elegido DECLARE ADIN_STIME 50 'Permitir 50us muestra de tiempo DIM VAR1 como WORD TRISA =% 00000001 'Configurar An0 (PORTA.0) como una variable ADCON1 =% 10000000 'entrada analógica Ubicado en PORTA.0 VAR1 = 0 ADIN 'coloca la conversión en la variable VAR1
Declaraciones
Hay tres directivas de declarar para el uso con ADIN. Estos son: -
DECLARE ADIN_RES 8, 10 o 12
Establece el número de bits en el resultado. Si no se utiliza esta declaracion, el valor por defecto es la resolución maxima del tipo utilizado PICmicro.
DECLARE ADIN_TAD 2_FOSC, 8_FOSC, 32_FOSC, o FRC. Fuente de reloj Establecida para el ADC. Todos los PICmicros compatibles tienen cuatro opciones para la fuente de reloj utilizado por el ADC. 2_FOSC, 8_FOSC y 32_FOSC,son proporcionados por oscilador externo, mientras que la CRF es el oscilador interno de RC del PICmicro. En lugar de utilizar los nombres predefinidos de la fuente de reloj, los valores de 0 a 3 puede ser utilizado. Estos reflejan la configuración de bits 0-1 en ADCON0 registro. Se debe tener cuidado al emitir esta declaracion, un tipo equivocado de fuente de reloj puede resultar en baja resolución, o ninguna conversión. CRF es la configuración predeterminada si no se realiza esta declaracion.
DECLARE ADIN_STIME 0 a 65535 microsegundos (nosotros). Permite a los condensadores internos que se cargue ncompletamente antes que se tome una muestra. Esto puede ser un valor de 0 a 65535 microsegundos (us). Un valor demasiado pequeño puede resultar en una reducción de la resolución. Mientras que un valor demasiado elevado se traducirá en una velocidad de conversión pobre sin ningún tipo de resolución extra alcanzado. Un valor típico para ADIN_STIME es de 50 a 100. Esto permite que un tiempo de carga adecuada, sin perder demasiada velocidad de conversión. Pero la xperimentación producirá el valor correcto para su requerimiento particular. El valor por defecto si no se utiliza esta declaracion es de 50. Notas Antes de que el comando ADIN puede ser utilizado, el registro TRIS deben ser manipulados apropiadamente para que el pin deseado sea una entrada. Además, el registro ADCON1 debe definirse en función al PIN que se requiere como una entrada analógica, y en algunos casos, para configurar el formato del resultado de la conversión. Vea las numerosas fichas técnicas de Microchip para obtener más información sobre estos registros y cómo configurarlo correctamente para el dispositivo específico usado. Si varias conversiones se están aplicando a continuación, se debe utilizar un pequeño retraso después del comando ADIN. Esto permite que los condensadores internos de la ADC puedan cargarser íntegramente: Ejemplo: inicio: VAR1 = ADIN 3 'Coloca la conversión en la variable VAR1
Espere DELAYUS 1 'para 1us
GOTO inicio 'Leer el ADC para siempre
31 may. 2010
LCD ALFANUMERICA
CONEXION PREDETERMINADA DEL LCD CON PROTON
PRINT La instruccion utilzada para el manejo de una pantalla LCD alfanumerica es PRINT y se usa segun la siguiente sintaxis: PRINT AT posicion_Y, posision_X, expresion1, expresion2,expresion3,...., posicion_Y => corresponde a la linea donde se escribira posicion_X => corresponde a la columna Luego de esto los datos a escribir separados por comas, estos pueden ser valores o expresiones matematicas, boleanas, y cadenas de texto. Las cadena de texto deben ser encerradas entre comillas, por ejemplo: PRINT AT 1,1, "HOLA MUNDO" PRINT AT 1,1 "HOLA"," ", "MUNDO" Tambien existen una serie de modificadores que permiten dar formato a los valores numericos que se desean visuaizar, son las siguientes: BIN => Binario DEC => Decimal HEX => Hexadecimal SBIN => Binario con signo SDEC => Decimal con signo SHEX => Hexadecimal con signo IBIN => Binario con el caracter % al inicio IDEC => Decimal con el caracter # al inicio IHEX => Hexadecimal con el caracter $ al inicio ISBIN => Binario con signo y con el caracter % al inicio ISDEC => Decimal con signo y con el caracter # al inicio ISHEX => Hexadecimal consigno y con el caracter $ al inicio REP c\n = > Envia un caracter c, n veces STR array\n = > envia una parte de un arreglño
CSTR cdata 0 => envia una cadena definida en la instruccion cdata. Cuando utilizamos DEC, HEX O BIN, se puede determinar el numerpo de caracteres deseados colocandole un numero, si quisieramos 2 decimales seria, DEC2, cuatro decimales DEC4, si se omite este numero y simplemente se coloxca DEC, el po defecto es 3 decimales. Ejemplo 1: DIM VAR1 AS BYTE VAR1 = 15
PRINT AT 1,1, "HOLA MUNDO" PRINT AT 2,1, DEC VAR1 PRINT AT 2,1, DEC4 VAR1
'Muestra "HOLA MUNDO" 'Muestra 15 'Muestra 0015
PRINT AT 3,1, "VAR1 HEX = " , HEX VAR1 ' Muestra "VAR1 HEX = F" PRINT AT 4,1, "VAR1 BIN = " , BIN VAR1 ' Muestra "VAR1 BIN = 1111" PRINT AT 6,1 ,"VAR1 HEX= " , HEX4 VAR1 ' Muestra "VAR1 HEX= 000F" Si es una variable punto flotante la que se quiere visualizar, el digito que se le agrega a DEC, determina el numero de digitos despues del punto decimal, por ejemplo: DIM FLT_VAR AS FLOAT FLT_VAR = 3.145 PRINT DEC2 FLT_VAR PRINT DEC4 FLT _VAR PRINT DEC1 FLT_VAR
' Muestra 3,14 ' Muestra 3,1400 ' Muestra 3,1
DECLARACIONES ASOCIADAS AL LCD Existen seis declaraciones para ser usadas con el LCD alfanumerico y la instruccion PRINT, y son : DECLARE LCD_TYPE 1 or 0 , GRAPHIC or ALPHA Informa al compilador el tipo de LCD que se direccionara a traves de la instruccion PRINT, 1 es para Grafica y 0 para Alfanumerica, si esta declaracion no es usada, la configuracion por defecto es del tipo Alfanumerico.
DECLARE LCD_INTERFACE 4 or 8
Informa al compilador cuantas lineas de datos seran usadas para el manejo del LCD, ocho o cuatro lineas.
DECLARE LCD_DTPIN PORT . PIN Asigna el puerto a ser usado por las lineas de datos del LCD, esta puede ser conectada usando 8 lineas de datos ó cuatro lineas de datos, si se utilizan solo cuatro lineas, estas deben ser conectadas a los cuatro pines mas sgnificativos, o los cuatro menos significaivos, y esto puede ser configurado de la manera siguiente:
DECLARE LCD_DTPIN PORTB.0
' Usado para interface de cuatro lineas y deben ser conectadas desde RB0 hasta RB7 DECLARE LCD_DTPIN PORTB.4 ' Usado para interface de cuatro lineas y deben ser conectadas desde RB4 hasta RB7 Si esta declaracion no es utilizada la configuracion por defecto es PORTB.4.
DECLARE LCD_LINES 1 , 2 , or 4
Informa al compilador el numero de lineas del LCD. Las LCD´s alfanumericas vienen en un rango de medidas dadas por el numero de filas y columnas, el tipo mas popular es el de 16 columnas por dos fila (16X2), aunque tamebien las de 16X4. Si esta declaracion no es usada la configuracion por defecto es de 2 lineas.
Recomiendo en todo programa no obviar las declaraciones aunque se desee utilizar la configuiracion por defecto, el formato del codigo del programa lo desarrollo asi:
CODIGO DE EJEMPLO: Device 16f877 XTAL 4 PORTB_PULLUPS = TRUE ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Configuracion del LCD''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' DECLARE LCD_TYPE 0 ' LCD alfanumerica DECLARE LCD_INTERFACE 4 ' 4 lineas de datos DECLARE LCD_DTPIN PORTB.4 ' lineas de datos al PORTB RB4->RB7 DECLARE LCD_ENPIN PORTB.2 ' EN al pin RB2 DECLARE LCD_RSPIN PORTB.3 ' RS al pin RB3 DECLARE LCD_LINES 4 ' LCD de cuatro lineas ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Inicio:
' Etiqueta
print at 1,1, "Linea 1" print at 6,1, "Linea 6" Fin:
' Etiqueta
31 may. 2010
IF... THEN ... ELSE Sintaxis Caso 1
IF Comparacion THEN Instrucciones1 END IF Caso 2 IF Comparacion THEN Instrucciones2 ELSE Instrucciones3 END IF Caso 3 IF Comparacion THEN Instrucciones4 ELSEIF Comparacion THEN Instrucciones5 ELSE Instrucciones6 ENDIF Informacion General Primer Caso : Evalúa la comparación que sigue al IF, si se cumple el o los criterios, se ejecutan las instrucciones1. Si la comparación no se cumple la instrucción se ignora
Segundo Caso: Evalúa la comparación que sigue al IF, si se cumple el o los criterios, se ejecutan unicamente las instrucciones2; si la comparación no se cumple la instrucciónes2 se ignoran,y se pasa a verificar la comparacion que le sigue al ELSE, si se cumple el o los criterios, se ejecutan unicamente las instrucciones3; si la comparación no se cumple la instrucciónes3 se ignoran.
Tercer caso: Evalúa la comparación que sigue al IF, si se cumple el o los criterios, se ejecutan unicamente las instrucciones4; si la comparación no se cumple la instrucciónes4 se ignoran,y se pasa a verificar la comparacion que le sigue al ELSEIF, si se cumple el o los criterios, se ejecutan unicamente las instrucciones5; si la comparación no se cumple la instrucciónes5 se ignoran, y se pasa a verificar la comparacion que le sigue al ELSE, si se cumple el o los criterios, se ejecutan unicamente las instrucciones6; si la comparación no se cumple la instrucciónes6 se ignoran.
Ejemplo 1 SYMBOL LED = PORTB.4 VAR1 = 3 LOW LED
IF VAR1 > 4 THEN HIGH LED DELAYMS 500 LOW LED
END IF En el ejemplo anterior, VAR1 no es superior a 4, en consecuencia, el creiterio no se cumple, por lo que las instrucciones HIGH LED, DELAYMS 500 y LOW LED, nunca se ejecutan. Sin embargo, si cambiamos el valor de la variable VAR1 a 5, a continuación, el LED se encenderá durante 500 ms y luego se apaga, porque VAR1 es ahora mayor que 4, por lo que cumple los criterios de comparación.
Ejemplo 2
IF X & 1 = 0 THEN A=0 B=1 ELSE A=1 ENDIF
Ejemplo 3 IF X = 10 THEN HIGH LED1 ELSEIF X = 20 THEN HIGH LED2 ELSE HIGH LED3 ENDIF
; Si X es igual a 10, enciende LED1 unicamente, SINO SI X es igual a 20, enciende LED2 unicamente, SINO se cumple ninguna de la anteriores entonces se enciende LED3 unicamente.
Ejemplo 4
IF X >10 AND X<50 THEN HIGH LED1 ENDIF ; Enciende el LED1 solo si X es mayor a 10 y X es menor a 50. Las comparaciones se pueden plantear de manera organizada con el uso de los parentesis, por ejemplo: IF ( (X>10 AND X<50) Or (X>80 AND X<100) ) THEN HIGH LED1 END IF ;En este Enciende el LED1 solo si X es mayor a 10 y X es menor a 50, ò si X es mayor a 80 y X es menor a 100.
31 may. 2010
COMUNICACION SERIAL – SERIN
Una de las formas más populares de la comunicación entre dispositivos electrónicos es la comunicación serial. Hay dos tipos principales de comunicación serial; síncrona y asíncrona. El HRSin, HRSOut, HSerIn, HSerOut, RSin, RSOut, Serín y comandos SerOut se usan para enviar y recibir datos en serie asíncronos. Mientras los comandosSHIn y SHOut son para uso exclusivo de comunicación síncrona.
El término asincrónico significa "sin ver el reloj" . De una manera mas especifica, "en la comunicación serial asincrona lo datos son transmitidos y recibidos sin el uso de un reloj. Los datos pueden ser enviados usando tan sólo dos cables, uno para datos y otra para tierra. Los puertos serie del PC (también llamados puertos COM o RS232) utilizan la comunicación serial asíncrona. Nota: el otro tipo de comunicación serial, síncrona, utiliza por lo menos tres cables, uno para el reloj, una para datos y otra para tierra.
El RS232 es la especificación eléctrica para las señales que usa el puerto serie del PC. A diferencia de las lógicas TTL, donde 5 voltios es un 1 lógico y 0 voltios es la lógica 0, RS232 utiliza -12 voltios para la lógica 1 y +12 voltios para la lógica 0. Esta especificación permite comunicación a través de longitudes de cable más largo sin amplificación. La mayoría de los circuitos que trabajan con RS232 utiliza un controlador de línea /receptor (transceptor), o adaptador de niveles. Este componente hace dos cosas: -
1. Convierte los ± 12 voltios de RS-232 a TTL compatible 0 a 5 voltios niveles. 2. Invierte los niveles de tensión, de modo que la lógica de 5 voltios = 1 y 0 voltios lógica = 0. Debido a las capacidades de E/S, excelente para la gama de dispositivos PICmicro, y la adopción de niveles TTL en la mayoría de los puertos serie de los PC modernos, un conductor de línea es a menudo innecesaria a menos que las largas distancias están involucrados entre el transmisor y el receptor. En su lugar una simple resistencia de limitación de corriente es todo lo que se requiere. Usted debe recordar que cuando se utiliza un circuito adpatador de niveles transmisor-receptor, tal como el MAX232, la polaridad del modo serial se invierte en el proceso de convertir los niveles de señal, sin embargo, si se utiliza la conexión directa, el modo es virgen. Esta es la causa más común de errores al conectar dispositivos en serie, por lo tanto usted debe hacer provisiones por este dentro de su software.
La comunicación asíncrona en serie se basa en la sincronización exacta. Tanto el emisor como el receptor deben ajustarse para medir el tiempo idéntico, lo que comúnmente se expresa en bits por segundo (bps) llamada baudios.Serín requiere un valor llamado Baudmode que informa de las características relevantes de los datos en serie que se reciben, el período de bit, el número de datos , el bit de paridad, y la polaridad.
El argumento de Serín Baudmode acepta un valor de 16-bit que determina sus características: 1-bit de parada, los bits 8-datos / sin paridad o bits de datos 7-/ paridad par- y prácticamente cualquier velocidad a partir de tan 300 baudios a una mayor de 38K baudios (dependiendo de la frecuencia del cristal utilizado). La lista a continuación muestra cómo se calcula Baudmode, consulte el manual para algunos baudmodes norma común para velocidades de serie.
Si las comunicaciones son con software o hardware existente, su velocidad y modo determinará la elección de la velocidad de transmisión y el modo. En general, 7-bit /paridad-par (7E) se utiliza el modo de texto, y 8-bit/no-parity (8N) para los datos orentados a byte. Nota: el modo más común es 8-bit/sin-paridad, incluso cuando los datos transmitidos es sólo texto. La mayoría de los dispositivos que utilizan un modo de 7-bit de datos, lo hacen para aprovechar la función de la paridad. La paridad puede detectar algunos errores de comunicación, sino que en su uso se pierde un bit de datos. Esto significa que los datos de entrada de
bytes transferidosen el modo 7E (paridad-par) sólo puede representar valores de 0 a 127, en vez de la 0 a la 255 del 8N (sin paridad) de modo.
Los comandos seriales del compilador "Serín" y "SerOut", todavia tienen la opción de utilizar un bit de paridad con desde 4 hasta 8 bit de datos. Esto es mediante el uso de las declaraciones: -
Con la paridad desactivada: -
DECLARE SERIAL_DATA 4 ' Configura SERIN y SEROUT para 4 bit de datos DECLARE SERIAL_DATA 5 'Configura SERIN y SEROUT para 5 bit de datos DECLARE SERIAL_DATA 6 ' Configura SERIN y SEROUT para 6 bit de datos DECLARE SERIAL_DATA 7 ' Configura SERIN y SEROUT para 7 bit de datos DECLARE SERIAL_DATA 8 ' Configura SERIN y SEROUT para 8 bit de datos (POR DEFECTO)
Con paridad Activada: -
DECLARE SERIAL_DATA 5 ' Configura SERIN y SEROUT para 4 bit de datos DECLARE SERIAL_DATA 6 ' Configura SERIN y SEROUT para 5 bit de datos DECLARE SERIAL_DATA 7 ' Configura SERIN y SEROUT para 6 bit de datos DECLARE SERIAL_DATA 8 ' Configura SERIN y SEROUT para 7 bit de datos (POR DEFECTO) DECLARE SERIAL_DATA 9 ' Configura SERIN y SEROUT para 8 bit de datos
Los bit de datos de la declaracion SERIAL_DATA puede variar de 4 a 8 bits (el valor predeterminado si no se declara es el POR DEFECTO). La Habilitación de paridad utiliza uno de los número de bits especificado.
DECLARE SERIAL_PARITY ODD o EVEN
Establece el tipo de paridad de Serín y SerOut. Si la paridad es permitidA pero el DECLARE SERIAL_PARITY no se emite en el programa, la configuración predeterminada es paridad par.
DECLARE SERIAL_PARITY = EVEN 'si se desea paridad par DECLARE SERIAL_PARITY = ODD 'si se desea paridad impar
DECLARE SERIAL_DATA 9 : Permite 8 bits de datos, junto con un noveno bit de paridad.
La paridad es una característica simple de comprobación de errores. Cuando un remitente de datos serie está previsto para paridad par (el modo compatible con el compilador), este cuenta el número de unos en el byte de salida y utiliza el bit de paridad para hacer este numero de unos sea par. Por ejemplo, si se está enviando el valor de 7-bit: "0011010", establece el bit de paridad de 1 a fin de hacer un número par de unos (cuatro), es decir, como el datos tiene tres unos, el bit de paridad se hace uno para dar cuatro unos.
El receptor cuenta también con los bits de datos para calcular lo que el bit de paridad debe ser. Si coincide con el bit de paridad, el receptor serial supone que los datos se recibieron correctamente. Por supuesto, esto no es necesariamente cierto, ya que dos bits de forma incorrecta podrían hacer parecer correcto la recepcion, o el bit de paridad en sí mismo podría ser malo cuando el resto de los datos es correcta.
Muchos sistemas funcionan exclusivamente con el uso de texto de 7-bit / modo de paridad-par. Por ejemplo, para recibir un byte de datos a través de bits de PORTA-0 a 9600 baudios, 7E, invertido:
SERIN PORTA.0, 24660, [SerData]
En el ejemplo anterior funcionará correctamente, sin embargo, no informa al programa qué hacer en caso de un error de paridad. A continuación, es una versión mejorada que utiliza el argumento opcional que proporciona una etiqueta que a la cual se direccionara en caso de que se produzca un error de paridad en la recepcion:
SERIN PORTA.0, 24660, P_ERROR, [SerData] PRINT @SerData STOP
P_ERROR: PRINT "Error de paridad"
Si coincide con la paridad, el programa continúa en la instrucción de PRINT después de SERIN. Si la paridad no coincide, el programa salta a la etiqueta P_ERROR. Tenga en cuenta que un error de paridad tiene prioridad sobre otras especificaciones InputData (tan pronto como se detecta un error, Serín aborta y salta a la rutina Plabel).
En los ejemplos anteriores, la única manera de poner fin a la instrucción de Serín (que no sea reiniciar o de apagado) es dar a Serin los datos en serie que necesita. Si no hay datos de serie recibidos, el
programa se queda atascado en un bucle sin fin. Sin embargo, se puede forzar a Serin a abortar si no recibe datos en un número especificado de milisegundos. Por ejemplo, para recibir un valor a través de PORTA-0 a 9600 baudios, 8N, invertido y Serín abortar después de 2 segundos (2000 ms) si no llegan datos: -
SERIN PORTA.0 , 16468 , 2000 , TO_ERROR , [SerData] PRINT CLS , @Result STOP
TO_ERROR: PRINT CLS , "Timed Out"
Si no se reciben datos serie en 2 segundos, Serín aborta y salta hasta la etiqueta TO_ERROR. Ambos argumentos, de Espera y de la Paridad se pueden combinar. A continuación se muestra un ejemplo para recibir un de valor a través de PORTA-0 a 2400 baudios, 7E, invertida con un tiempo de espera de 10 segundos:
DIM SerData AS BYTE
Again: SERIN PORTA.0 , 24660 , P_ERROR , 10000 , TO_ERROR , [SerData] PRINT CLS , @SerData
GOTO Again
TO_ERROR: PRINT CLS , "Timed Out" GOTO Again
P_ERROR: PRINT CLS , "Parity Error" GOTO Again
Al diseñar una aplicación que requiere la comunicación serie entre PICmicros, usted debe recordar a trabajar dentro de estos límites: -
1. Cuando el PICmicro está enviando o recibiendo datos, no puede ejecutar otras instrucciones. 2. Cuando el PICmicro está ejecutando otras instrucciones, no se puede enviar o recibir datos.
3. El compilador no ofrece un buffer de orden que hay en un PC. A bajas frecuencias del cristal oscilador, y las mayores tasas de datos serie, el PICmicro no puede recibir datos a través de Serín, procesarlo, y ejecutar otro Serín a tiempo para tomar la siguiente parte de los datos, a menos que existan importantes pausas entre las transmisiones de datos.
SERIN Modificadores
Como ya sabemos, Serin va a esperar y recibir un solo byte de datos, y almacenarlo en una variable. Si el PICmicro esta conectado a un PC que ejecuta un programa de terminal y el usuario pulsa la tecla "A" en el teclado, después de ejecutado el comando Serin, la variable contendra el valor 65, que es el código ASCII de la letra "A".
¿Qué pasaría si el usuario pulsa la tecla "1"? El resultado sería que la variable que contendrá el valor 49 (el código ASCII para el caracter "1"). Este es un punto importante a recordar: cada vez que se pulsa una letra en el teclado, el ordenador recibe el valor ASCII de ese carácter. Corresponde a la parte receptora de interpretar los valores según sea necesario. En este caso, tal vez en realidad quería que la variable terminara con el valor 1, en lugar del código ASCII 49. El comando Serin proporciona un modificador, el modificador llamado decimal, que interpretará esto para nosotros. Mira el siguiente código: -
DIM SERDATA AS BYTE SERIN PORTA.1, 16780, [DEC SERDATA]
Observe el modificador de decimales en el comando SERIN que aparece justo a la izquierda de la variable SERDATA. Esto le dice a Serín para convertir texto entrantes representar los números decimales en forma decimal verdadera y guardar el resultado en SERDATA. Si el usuario que ejecuta el software de terminal pulsa el "1", "2" y luego "3" claves seguido de un espacio u otro texto no numérico, el valor 123 se almacenará en la variable SERDATA, permitiendo que el resto del programa para realizar cualquier operación sobre la variable numérica.
Sin el modificador decimales, sin embargo, habría sido obligado a recibir cada personaje ("1", "2" y "3") por separado, y aún así tendría que hacer alguna conversión manual para llegar al número 123 (cien veintitrés) antes de poder hacer los cálculos que desee sobre el mismo.
El modificador decimal está diseñado para buscar texto que representa los números decimales. Los caracteres que representan números decimales son los caracteres "0" a "9". Una vez que el comando Serin se le pide que utilice el modificador decimal de una variable en particular, sigue de cerca los datos serie entrantes, buscando el primer carácter decimal. Una vez que encuentra el carácter primera cifra decimal, seguirá buscando más (la acumulación de todo el número de varios dígitos) hasta que se encuentra un carácter numérico no decimales. Recuerde que no terminará hasta que encuentra al menos un carácter decimal seguido por al menos un carácter no decimales. Para ilustrar esto aún más, examine los siguientes ejemplos (suponiendo que estamos usando el ejemplo de código igual al anterior): -
Entrada serial : "ABC"
Resultado: El programa se detiene en el símbolo del Serín, continua en espera para el texto decimal.
Entrada Serial : "123" (sin caracteres siguientes ella)
Resultado: El programa se detiene en el símbolo del Serín. Se reconoce los caracteres "1", "2" y "3" como el número ciento veintitrés, pero como no no hay datos siguientes al "3", espera de forma continua, ya que no hay manera de saber si 123 es el número entero o no.
Entrada serial : "123 " (seguido por un carácter de espacio)
Resultados: Al igual que el ejemplo anterior, excepto una vez que el carácter de espacio se recibe, el programa sabe el número completo es 123, y almacena este valor en SERDATA. El comando Serin luego termina, permitiendo a la siguiente línea de código se ejecute.
Entrada serial: "123A"
Resultados: Igual que el ejemplo de arriba. La "A" carácter, como el carácter de espacio, es el primer texto no decimales después del número 123, que indica al programa que ha recibido todo el número.
Entrada Serial: "ABCD123EFGH"
Resultados: Al igual que los ejemplos anteriores. Los caracteres "ABCD" se pasan por alto (ya que no son decimales, los caracteres 123 son evaluados para ser el número 123 y el siguiente carácter, "E", indica al programa que ha recibido todo el número.
El resultado final del modificador de DEC está limitado a 16 bits (hasta el valor de 65535). Si un valor mayor que este valor recibido por el modificador de decimales, el resultado final será incorrecto porque el resultado se extiende el plazo del valor máximo de 16-bit. Por lo tanto, los modificadores de Serín no puede (en este momento) se utiliza para cargar DWORD (32 bits) variables.
El modificador DEC es sólo uno de una familia de modificadores de conversión disponibles con Serin Más abajo encontrará una lista de modificadores de conversión disponibles. Todos los modificadores de la conversión de trabajan similar al modificador decimal (como se describió anteriormente). Los modificadores de recibir bytes de datos, a la espera para el primer byte que está comprendida en el rango de caracteres que aceptan (por ejemplo, "0" o "1" para binario, "0" a "9" para decimal, "0" a "9 "y" A "a" F "para hexadecimal. Una vez que reciben un carácter numérico, siguen aceptando la entrada hasta que un carácter no numérico llega, o en el caso de los modificadores de longitud fija, hasta que el número máximo de dígitos especificados es recibido.
Aunque es muy eficaz en el filtrado y conversión de texto de entrada, los modificadores no son totalmente infalibles. Como se mencionó anteriormente, los modificadores conversión podrian seguir aceptando texto, hasta que el primer texto no numérico llege, incluso si el valor resultante supere el tamaño
de la variable.Usted puede controlar esto hasta cierto punto mediante el uso de un modificador que especifica el número de dígitos, como DEC2, que aceptaría los únicos valores en el rango de 0 a 99.
Los caracteres de conversión de tipos de modificadores numéricos Número aceptadas
DEC (1 .. 5) decimal, opcionalmente limitada del 0 al 9 de 1 a 5 dígitos HEX (1 .. 4) Hexadecimal, opcionalmente limitada del 0 al 9, de 1 a 4 dígitos de la A a F BIN (1 .. 16) binario, opcionalmente limitada 0 y 1 de 1 a 16 dígitos
Una variable precedida por BIN va a recibir la representación ASCII de su valor binario.
Por ejemplo, si se especifica BIN VAR1 y "1000" se recibe, VAR1 se establecerá en 8.
Una variable precedida de SWX recibirá la representación ASCII de su valor decimal.
Por ejemplo, si se especifica DEX VAR1 y "123" es recibido, VAR1 se establecerá en 123.
Una variable precedida por HEX recibirá la representación ASCII de su valor hexadecimal.
Por ejemplo, si se especifica HEX VAR1 y "FE" se recibe, VAR1 se establecerá en 254.
El comando Serin se puede configurar para esperar a una secuencia de caracteres antes de que se recuva cualquier entrada adicional. Por ejemplo, supongamos que un dispositivo conectado al PICmicro envia muchas secuencias diferentes de datos, pero los únicos datos que desea observar sean solo justo después de los caracteres únicos, "XYZ". El modificador WAIT puede ser utilizado para este propósito: -
SERIN PORTA.0, 16468, [WAIT ("XYZ"), SERDATA]
El código de arriba espera a que los caracteres "X", "S" y "Z" sean recibidos, en ese orden, entonces recibe el byte de datos que viene y lo coloca en la variable SERDATA.
STR Modificador
El compilador también tiene un modificador para el manejo de una cadena de caracteres, denominado STR. El modificador STR se utiliza para recibir una cadena de caracteres en una variable de matriz de bytes.
Una cadena es un conjunto de caracteres que se disponen o acceden en un cierto orden. Los caracteres "ABC" se almacena en una cadena con la "A", seguido por el "B" y luego seguido por el "C". Una matriz de bytes es un concepto similar al de una cadena, sino que contiene datos que se disponen en un orden determinado. Cada uno de los elementos de una matriz es del mismo tamaño. La cadena "ABC" se almacenaría en una matriz de bytes que contiene tres bytes (elementos). A continuación se muestra un ejemplo que recibe diez bytes a través de bits de PORTA-0 a 9600 bps, N81/inverted, y los almacena en la matriz de 10 bytes, SERSTRING: -
DIM SerString [10] AS BYTE
'Crear una matriz de 10 bytes.
SERIN PORTA.0, 16468, Relleno [STR SerString] 'la matriz con los datos recibidos. PRINT SerString
'Mostrar la cadena.
Si la cantidad de caracteres recibidos no es suficiente para llenar toda la matriz, a continuación, un formateador puede ser colocado después del nombre de la matriz, que sólo recibirá caracteres hasta la longitud especificada. Por ejemplo: -
DIM SerString [10] AS BYTE 'Crear una matriz de 10 bytes. SERIN PORTA.0, 16468, [STR SerString \ 5] 'Rellenar los primeros 5 bytes de la matriz PRINT STR SerString \ 5 'Mostrar la cadena de 5 caracteres.
El ejemplo anterior ilustra cómo llenar sólo los primeros n bytes de una matriz y, a continuación, cómo mostrar sólo los primeros n bytes de la matriz. n se refiere al valor que se da después de la barra invertida.
Consideraciones Generales
Preste atención a cableado
Tome más tiempo para estudiar y verificar los diagramas de cableado de comunicación serial. Un error en el cableado puede causar problemas en la comunicación, o la no comunicación. Asegúrese de conectar las clavijas de tierra (Vss) entre los dispositivos que se comunican en serie.
Compruebe configuración de puerto en el PC y en los comandos de la serie
Una configuración desigual entre el emisor y el receptor hará que las transferencias de datos sean ilegibles o no exista transferencias de datos.
Recuerde siempre que un transmisor-receptor de línea invierte la polaridad de serie. Si los datos recibidos de serie no se puede leer, lo más probable es causado por un error de velocidad de transmisión , error de posición, o un error de polaridad. Si recibe datos de otro dispositivo que no es un PICmicro, trate de
usar velocidades de transferencia de 9600 y por debajo, o como alternativa, utilize un cristal de frecuencia más alta. Debido a los gastos generales adicionales en el PICmicro, y el hecho de que el comando Serin no ofrece algún tipo de bufer de hardware de recepción para la comunicación serial, po rl oque recepciones consecuentes, pueden ser perdidas o ilegibles. Si esto ocurre, intente reducir la velocidad de transmisión, o aumentar la frecuencia del cristal. Uso de variables simples (no matrices) también aumentará la probabilidad de que el PICmicro recibirá los datos correctamente.
Vea Tambien: SEROUT
HARDWARD
Si deseamos conectar el micro al PC, debemos utilizar un circuito adaptador como el MAX232; en la figura se muestran conectados los pines, 8 y 9, los cuales son opcionales en caso de que se quiera programar el micro con el Microcode Loader de Proton. Si queremos comunicar dos micros que estan en el mismo PCB, no hace falta utilizar este circuito, mas bien si, cuando estos estan conectados en PCB distintas y a distancias considerables.
31 may. 2010
WHILE.....WEND
HACER MIENTRAS Sintaxis WHILE Condicion Instrucciones .. .. Instrucciones
WEND
Informacio General Ejecuta un bloque de instrucciones mientras una condicion sea cierta Ejemplo : VAR1 = 1
WHILE VAR1 <= 10
; Ejecuta las instrucciones del bucle mientras ; VAR1 sea igual o menor a 10
PRINT @VAR1 , " " VAR1 = VAR1 + 1 WEND
19 sept. 2010
OPERADORES RELACIONALES Los operadores relacionales se utilizan para comparar dos valores, como se muestra en la siguiente lista. El resultado puede ser utilizado para tomar una decisión sobre el flujo del programa. Relación
Operador
Expresión
Igualdad
=
X=Y
Desigualdad
<>
X<>Y
Menor que
<
X
Mayor que
>
X> Y
Menor o igual
<=
X <= Y
Mayor o igual
>=
X >= Y
19 sept. 2010
MATEMATICA DE PUNTO FLOTANTE El compilador PROTON puede realizar calculos de Punto Flotante (32 x 32 bits IEEE 754).
Declarar una variable como FLOAT permitirá los cálculos de punto flotante con esa variable. La declaracion de una variable Punto Flotante se efectua de la siuiente manera; DIM VAR_FLT AS FLOAT La declaracion de una Constante de Punto Flotante se efectua de la siuiente manera;
SÍMBOLO PI = 3,14 SÍMBOLO FL_NUM = 5,0 La aritmética de punto flotante no es lo máximo en exactitud, es simplemente una forma de comprimir un valor complejo o grande en un espacio pequeño (4 bytes en el caso del compilador). Resultados perfectamente adecuados por lo general se puede obtener de la escala correcta de variables de tipo entero, con un aumento en la velocidad y un ahorro de memoria RAM y el espacio de código. 32 bits de matemáticas de punto flotante es muy intensa ya que el microcontrolador PICmicro es sólo un procesador de 8 bits. También consume grandes cantidades de memoria RAM y espacio de los códigos para su funcionamiento, por lo tanto use siempre el punto flotante con moderación, y sólo cuando sea estrictamente necesario. El punto flotante no está disponible en PICmicros núcleo de 12-bit debido a las restricciones de memoria, y es más eficiente cuando se utiliza con los dispositivos básicos de 16-bit debido al código más lineal y especificaciones de RAM. Formato de punto flotante
El compilador PROTON utiliza la variación del microchip del formato IEEE 754 de punto flotante. Las diferencias con la norma IEEE 745 son menores, y bien documentado en la nota de aplicación AN575 de Microchip (descargable en www.microchip.com).
Números de punto flotante se representan en formato modificado IEEE-754. Este formato permite que a las rutinas de punto flotante aprovechar la arquitectura del PICmicro y reducir la cantidad de sobrecarga requerida en los cálculos. La representación se muestra a continuación en comparación con las normas del formato IEEE-754: donde s es el bit del signo, y es el LSB del exponente y x es un marcador de posición para la mantisa y exponente bits.
Los dos formatos se pueden convertir fácilmente de una a la otra por la manipulación del exponente y la mantisa 0 bytes. El código de ensamblador siguiente se muestra un ejemplo de esta operación.
Formato
Exponente
Mantisa 0
Mantisa 1
Mantisa 2
IEEE-754
sxxx xxxx
xxxx xxxx
xxxx yxxx
xxxx xxxx
Microchip
xxxx xxxx
xxxx xxxy
sxxx xxxx
xxxx xxxx
IEEE-754 PARA MICROCHIP
RLF MANTISSA0 RLF exponente RRF MANTISSA0
MICROCHIP PARA IEEE-754 RLF MANTISSA0 RRF exponente RRF MANTISSA0 Las variables utilizadas por las Bibliotecas de punto flotante Varios registros de 8-bit de RAM son utilizados por las rutinas matemáticas para mantener los operandos y resultados de las operaciones de coma flotante. Dado que puede haber dos operandos necesarios para una operación de punto flotante (como la multiplicación o división), hay dos conjuntos de registros exponente y mantisa reservados (A y B). Para que el argumento A, PBP_AARGHHH sostiene el exponente y PBP_AARGHH, PBP_AARGH PBP_AARG y mantenga la mantisa. Para que el argumento B, PBP_BARGHHH sostiene el exponente y PBP_BARGHH, PBP_BARGH PBP_BARG y mantenga la mantisa.
Programas de Punto Flotante Ejemplo
"Multiplica dos valores de punto flotante
DEVICE = 18F452
XTAL = 4
DIM FLT que float
SÍMBOLO FL_NUM = 1,234 'Crear un punto flotante de valor constante
CLS
FLT = FL_NUM * 10
IMPRIMIR diciembre FLT
PARADA
'Agregar dos variables de punto flotante DEVICE = 18F452 XTAL = 4 DIM FLT as float DIM Flt1 as float DIM FLT2 as float CLS Flt1 = 1,23 FLT2 = 1000,1 FLT = Flt1 FLT2 IMPRIMIR diciembre FLT PARADA
Notas Expresiones de punto flotante que contiene más de 3 operandos no están permitidos, debido al espacio de RAM adicional necesario para una pila de software. Cualquier expresión que contiene una variable de punto flotante o el valor se calculará como un punto flotante. Aunque el término se aplica también contiene un byte, palabra o dword valor o variable. Si la variable de asignación es un byte, palabra o variable DWORD, pero la expresión tiene un carácter de punto flotante. A continuación, el resultado de punto flotante se convierte en un entero. Ejemplo ; DEVICE = 16F877 DIM DWD AS DWORD DIM FLT que float SÍMBOLO PI = 3,14 FLT = 10 DWD = FLT + P "El cálculo resultará en 13,14, pero se reducirán a un número entero 13 IMPRIMIR diciembre DWD ' Mostrar el resultado entero 13
PARADA traducción del inglés al español
Requisitos de espacio de codigo Como se mencionó anteriormente, una precisión de punto flotante tiene un precio de velocidad, y el espacio de código. Ambas cuestiones no son un problema si un dispositivo básico de 16-bit se utiliza, sin embargo en dispositivos de 14-bit básicos puede suponer un problema. El compilador intenta cargar las bibliotecas de punto flotante en la memoria baja, junto con todas las subrutinas de la biblioteca, pero si no entra dentro de los primeros 2048 bytes de espacio de código, y el PICmicro cuenta con más de 2048 bytes de código disponible, la bibliotecas de punto flotante podrá ser cargada en la parte superior de la memoria de 1000 bytes de código. Esto es invisible para el usuario, sin embargo, el compilador mostrará un aviso de que esté ocurriendo en caso de que parte de la memoria está siendo utilizado por su programa BASIC. Mostrar más preciso valores en coma flotante De forma predeterminada, el compilador utiliza una rutina relativamente pequeño para la conversión de valores de punto flotante para preparar decimal, por RSOUT, $ PRINT STR etc Sin embargo, debido a su tamaño, ya que no realiza ningún redondeo del primer valor, y sólo es capaz de la conversión de valores relativamente pequeños. es decir, aproximadamente 6 dígitos de precisión. Con el fin de producir un resultado más exacto, el compilador necesita usar una rutina más grande. Esto se implementa mediante el uso de un DECLARA: FLOAT_DISPLAY_TYPE = LARGE o STANDARD Usando el modelo LARGE para declarar lo anterior dará lugar a que el compilador use la coma flotante más precisa a la rutina decimal. Tenga en cuenta que a pesar de que la rutina es más grande que el convertidor estándar, lo que realmente funciona mucho más rápido. Los valores por defecto del compilador para Norma, si este es declarar no se han concedido en el programa BASIC.
5 dic. 2010
ABS (COMANDO) ABS (VALOR ABSOLUTO) Sintaxys Variable = ABS Variable Detalles Retorna el Valor Absoluto de un numero. Ejemplo: DWD1 = -1234567 DWD2 = ABS DWD1 PRINT DEC DWD2
' Muestra el Resultado "1234567"
5 dic. 2010
ACOS ACOS
(ARCO-COSENO)
Sintaxys Variable1 = ACOS Variable2
Detalles Deduce el Arco Coseno de una Variable. El Valor de la Variable2 debes estra entre -1 a 1. Ejemplo: FLOATIN = 0.8 FLOATOUT = ACOS FLOATIN PRINT DEC FLOATOUT
Notas: ACOS no está implementada en los dispositivos de 12 o 14 bits, sin embargo, con la funcionalidad adicional, y la memoria más lineal que ofrecen los dispositivos de base de 16 bits y de 32 bits de punto flotante, el ARC COSENO esta implementada. La trigonometría de punto flotante es abarca amplios recursos de memoria, así que no se sorprenda si una gran parte de la memoria del PIC se utiliza con un solo operador. Esto también significa que la trigonometría de punto flotante es relativamente lenta para operar.
5 dic. 2010
ADIN ADIN
(ADQUISICION ANALOGICO DIGITAL)
Sintaxis Variable1 = ADIN NumeroCanal
Detalles Lee el valor del conversor analogico digital del PisMicro.
Ejemplo
Ejemplo
'Leer el valor del canal 0 del ADC y el lugar en la variable VAR1.
DECLARO ADIN_RES 10 RC DECLARE ADIN_TAD FRC DECLARO ADIN_STIME 50
'10 bits resultado requerido 'OSC elegido 'Permitir 50us tiempo de la muestra
DIM VAR1 como WORD TRISA =% 00000001 ADCON1 =% 10000000 VAR1 = ADIN 0
'Configurar An0 (PORTA.0), como aporte 'Ajuste de entrada analógica en PORTA.0 'Lugar de la conversión en la variable VAR1
Declaraciones:
Hay tres directivas de declaracion para su uso con ADIN. Estas son: -
DECLARO ADIN_RES 8, 10, o 12 Establece el número de bits en el resultado. Si esto no se declara, el valor por defecto es la maxima resolución des PIC a utilizar. Por ejemplo, la gama 16F87x dará lugar a una resolución de 10 bits, junto con los dispositivos de núcleo de 16 bits, mientras que el estándar de tipos PICmicro producirá un resultado de 8 bits. Usando lo anterior permite declarar un resultado de 8 bits que se obtendrán de los tipos de PIC de 10 bits, pero no de 10 bits de los tipos de 8 bits.
DECLARO ADIN_TAD 2_FOSC, 8_FOSC, 32_FOSC, o FRC. Establece la fuente de reloj del ADC. Todos los microPIC compatibles tienen cuatro opciones para la fuente de reloj utilizado por el ADC. 2_FOSC, 8_FOSC y 32_FOSC, son configuraciones del oscilador externo, mientras que la CRF es oscilador interno del PIC de RC. En lugar de utilizar los nombres predefinidos para la fuente de reloj, valores de 0 a 3 puede ser utilizado. Estos reflejan la configuración de los bits 0-1 en ADCON0 registro. Se debe tener cuidado al emitir este declarar, como el tipo equivocado de la fuente de reloj puede resultar en una pobre resolución, o sin conversión. CRF es la configuración predeterminada si se declaran no se publicó la lista de BASIC.
DECLARO ADIN_STIME 0 a 65535 microsegundos (nosotros). Permite a los condensadores internos cargarse por completo antes que se tome una muestra. Esto puede ser un valor de 0 a 65535 microsegundos. Un valor demasiado pequeño puede resultar en una reducción de la resolución. Mientras que un valor demasiado elevado se traducirá en la velocidad de conversión. Un valor típico para ADIN_STIME es de 50 a 100. Esto permite que el tiempo de carga adecuada sin perder velocidad de conversión. Pero la experimentación producirá el valor adecuado para su requerimiento particular. El valor por defecto si se declaran no se utiliza en el listado básico es de 50.
Notas
Antes de que el comando ADIN puede ser utilizado, el registro TRIS apropiado debe ser manipulado para ajustar el canal en que se desee la entrada Analogica. Además, el registro ADCON1 se debe establecer de acuerdo con el canal en que se requiera una entrada analógica, y en algunos casos, para configurar el formato del resultado de la conversión. Si varias conversiones se están aplicando, a continuación, un pequeño retraso se debe utilizar después del comando ADIN. Esto permite que los condensadores internos de la ADC para cumplir íntegramente: -
3 dic. 2012
INKEY (Manejo De Teclado Matricial)
Sintaxys Variable = INKEY Detalles Realiza un scan al teclado y devuelve el resultado a una variable.
Operadores
La Variable puede se definida del tipo bit, byte, byte array, word, word array, dword or float.
Ejemplo DIM VAR1 as BYTE VAR1 = INKEY ' Scanea el teclado DELAYMS 50 ' Antirrebote/50ms PRINT @VAR1 , " " ' Muestra el resultado en el LCD .
Notas INKEY devuelve un valor entre 0 y 16. Si ninguna tecla es presionada el valor devuelto es 16. Usando el comando LOOKUP, los valores devueltos pueden se cambiados de acuerdo a los caracteres presentes en el teclado físicamente. Ejemplo VAR1 = INKEY KEY = LOOKUP VAR1, [255,1,4,7,"*",2,5,8,0,3,6,9,"#",0,0,0] Los valores del ejemplo son solo demostración por lo que deben ser ajustados de acuerdo a los caracteres impresos en cada tecla del mismo.
Declaciones DECLARE KEYPAD_PORT PORT la instrucción.
Asigna el puerto a ser utilizado por
La rutina INKEY requiere resistores pull_up, por lo cual el mejor puerto para ello es el puerto B, ya que este posee estos internamente. En caso de seleccionar otro puerto esta consideración debe ser tomada en cuenta.
3 dic. 2012
EREAD (Lectura de Memoria EEPROM interna) Sintaxys Variable = EREAD Direccion Detalles Lee informacion de la memoria EEPROM interna del microPIC.
Operators
Variable - tipo bit, byte, byte array, word, word array, dword, or float. Direccion - constante, variable ó expresión, que contiene la dirección que se desea leer en la memoria EEPROM. Ejemplo DEVICE 16F84 DIM VAR1 as BYTE DIM WRD1 as WORD DIM DWRD1 as DWORD la dirección 0
VAR1
= EREAD 0
'Lee valor de 8-bit a partir de
WRD1 = EREAD 1 DWRD1 = EREAD 3
'Lee valor de 8-bit a partir de la dirección 'Lee valor de 8-bit a partir de la dirección
1 3
Nota Si en la instrucción la variable usada en la asignación es del tipo float float ó dword, entonces cuatro (04) bytes serán leídos de la memoria EEPROM, y estos corresponderán a las direcciones de memoria consecuentes.
Si en la instrucción la variable usada en la asignación es del tipo float word, entonces cuatro (04) bytes serán leídos de la memoria EEPROM.
Ejemplo:
Direccion
Dato
Hex
Hex
00
0A
01
0B
02
0C
03
0D
04
0E
05
0F
06
1A
07
1B
08
1C
09
2D
0A
2E
0B
2F
0C
3A
0D
3B
0E
3C
0F
3D
CASO 1:
DIM VAR1 AS WORD
VAR1 = EREAD 0
' LA ASIGNACION SERA
VAR1 <= $0A0B
En este caso VAR1 es del tipo WORD (16 bits) por lo cual la dirección "0" corresponde a la parte baja y la dirección "1" a la parte alta.
CASO 2:
DIM VAR1 AS DWORD
VAR1 = EREAD 3
' LA ASIGNACIÓN SERA
VAR1 <= $0D0E0F1A
En este caso VAR1 es del tipo DWORD (32 bits) y la asignación usa las direcciones de memoria 03-04-05-06.
Vea Tambien : EDATA EWRITE
3 dic. 2012
EWRITE (Escritura de Memoria EEPROM interna) EWRITE Sintaxis EWRITE Dirección , [ Variable {, Variable…etc } ] Detalles Escribe datos en la memoria EEPROM del PICmicro. Operadores
Direccion : constante, variable ó expresión, que contiene la direccion que se desea escribir.
Variable: definida por el usuario y del tipo bit, byte, byte array, word, word array, dword,float or a constant value. Ejemplo DEVICE 16F628
DIM VAR1 as BYTE DIM WRD1 as WORD DIM DIRECCION as BYTE VAR1 = 200 WRD1= 2456 DIRECCION = 0
' Point to address 0 within the eeprom
EWRITE DIRECCION , [ WRD , VAR1 ] ' Escribe un dato de 16 bits y luego uno de 8 bits. Notas Si en la instrucción la variable usada en la escritura de la EEPROM es del tipoword, entonces serán usadas cuatro (02) bytes de la memoria EEPROM, y estos corresponderán a las direcciones de memoria consecuentes.
Si en la instrucción la variable usada en la lectura es del tipo float ó word, entonces cuatro (04) bytes serán escritas en la memoria EEPROM.
Si se desearan almacenar datos de 16 bits consecutivamente la dirección debe ser incrementada en dos (02) cada escritura, como se muestra en el siguiente codigo : FOR Dirección = 0 TO 64 STEP 2 EWRITE Dirección , [ WRD ] NEXT Vea también EDATA EREAD
3 dic. 2012
EDATA (Escritura de Memoria EEPROM) Sintaxis EDATA Constante1 { ,...Constanten etc } Detalles
Almacena constantes o cadenas directamente en la memoria EEPROM de PICmicro.
Operators
Constante1, Constanten - valores a ser almacenados en la memoria EEPROM, los valores son almacenados a partir de la dirección inicial 0. Esta instrucción no permite especificar la dirección de memoria de almacenamiento de los datos. Para almacenar en una dirección especifica diferente a la cero (0), es necesario usar el comando EWrite . Ejemplo ' Almacena los datos 1000,20,255,15, y los valores ASCII para ' H','e','l','l','o' en la memoria EEPROM iniciando en la dirección 0.
EDATA 1000 , 20 , $FF , 001111 , "Hello"
Nota Valores de 16-bit, 32-bit y punto flotante, pueden ser almacenados en la EEPROM, y estos son colocados de manera tal que el byte menos significativo ocupe la primera dirección de memoria. Por ejemplo, si el valor a almacenar es 1000 con la sentencia Edata, entonces la instrucción seria la siguiente : EDATA 1000 Los datos en la EEPROM quedan así : 232, 03
Tabla de Direccionamiento (EDATA) Los de la memoria EEPROM inicia en la dirección 0 y finaliza en un máximo de acuerdo a la capacidad de PICmicro. En raras ocasiones la información almacenada en la EEPROM es una sola pieza continua de informacion, por el contrario, normamalmente es usada para almacenar valores o cadenas de texto, de manera tal que acceder a cada uno de estos es esencial. Considerando el siguiente codigo : EDATA "HOLA" EDATA "MUNDO" El texto "HOLA" sera almacenado a partir de la direccion, contiene 4 caracteres y cada uno ocupa un byte de la memoria EEPROM, de esta manera el texto "MUNDO" comienza a almacenarse a partir de la dirección 4, y contiene 5 caracteres; asi que la proxima cadena de texto a alamecenar estara localizada a partir de la direccion 9. Para acceder de manera separada a cada una de las cadenas de textos o valores es necesario mantener un registro de la direccion de inicio o cabezera y final de cada cadena de texto. Para esto un nombre de identificacion antes de la sentencia EDATA permite al compilador hacer el conteo de bytes. El compilador almacena las direcciones asociada a cada texto o valor, con un nombre de identificacion en la tabla. Por Ejemplo : HOLA_TEXT EDATA "HOLA" MUNDO_TEXT EDATA "MUNDO" El nombre HOLA_TEXT is ahora reconocido por el compilado como una constante, y de ser la
primera sentencia EDATA, esta tomara el valor de 0, refiriendose a la direccion de inicio de la cadena "HOLA".
MUNDO_TEXT es una contante y mantendra un valor de 4, el cual se refiere a la direccion de inicio de la cadena d etexto "MUNDO". Note que el identificador debe ser localizado en la misma linea que la directiva EDATA. Cualquier Directiva EDATA debe ser colocada en la cabecera del Programa, al igual que los simbolos, estos nombre son reconocidos en el resto del programa cada vez que estos aparezcan .
El ejemplo de abajo ilustra el uso del direccionamiento de la EEPROM: ' Muestra dos textos almacenados en la memoria EEPROM
Include "PROTON_4.INC" Dim CHAR as Byte Dim CHARPOS as Byte HELLO EDATA "HOLA ",0 WORLD EDATA "MUNDO",0 EEPROM. terminación. Delayms 200 Cls CHARPOS = HELLO Gosub DISPLAY_TEXT CHARPOS = WORLD Gosub DISPLAY_TEXT Stop
' Carácter ' Dirección ' Crea una cadena de Texto en la EEPROM. terminación. ' Crea una cadena de Texto en la
' ' ' ' ' ' '
retardo 200 ms Limpia LCD CHARPOS <= direccion de inicio del texto "HOLA" Muestra el texto "HOLA" CHARPOS <= direccion de inicio del texto "MUNDO" Muestra el texto "MUNDO" Fin
' subrutina pata leer y mostrar el texto almacenado en la dirección correspondiente al valor de CHARPOS DISPLAY_TEXT: While 1 = 1 CHAR = EREAD CHARPOS If CHAR = 0 Then Break Print CHAR Inc CHARPOS Wend Return
' ' ' ' ' ' '
Bucle infinito Lee EEPROM Sale del Bucle cuando CHAR = 0 Muestra el caracter Incrementa CHARPOS Cierra bucle While Sale de la subrutina
15 feb. 2013
Variables (Tipos de datos)
(terminación)
Las variables son donde los datos temporales se almacenan en un programa BASIC. Ellos son creados usando la palabra clave DIM. Debido a que la RAM disponible en en microPIC es algo limitado en tamaño, la elección de los tipos o tamaños de variables adecuados para cada tarea específica es de suma importancia. Las variables pueden ser del tipo BIT, BYTE, WORD, DWORD, FLOAT o STRING.
El espacio para cada variable se asigna automáticamente en el área de la memoria RAM del microcontrolador. El formato para crear una variable es el siguiente: -
DIM Identificador AS Tipo
Identificador, cualquiera (a excepción de palabras clave). Tipo : bit, byte, word, dword o float. Algunos ejemplos de la creación de variables son: -
DIM perro As Byte
DIM cat
As Bit
'8 bits sin signo '(0 a 255) 'un solo bit (0 ó 1)
DIM rata As Word
'16 bits sin signo (0 a 65535)
DIM L_Rat As DWord
'32 bits con signo '(-2147483647 a 2147483647)
DIM P_Rat As Float
'32 bits en coma flotante
DIM ST As secuencia * 20
'Crear una variable STRING 'capaz de contener 20 caracteres
El número de variables disponibles depende de la cantidad de RAM en un dispositivo en particular y el tamaño de las variables en el programa Proton BASIC puede reservar aproximadamente 26 ubicaciones de memoria RAM para su propio uso. También puede crear nuevas variables temporales para utilizarlas en el cálculo de ecuaciones complejas , especialmente si los cálculos de punto flotante se llevan a cabo. Hay ciertas palabras reservadas que no se pueden utilizar como nombres de variables, estas son las variables del sistema utilizados por el compilador.
Las siguientes palabras reservadas no se debe utilizar como nombres de variables, como el compilador creará estos nombres cuando sea necesario: -
PP0, PP0H, PP1, PP1H, PP2, PP2H, PP3, PP3H, PP4, PP4H, PP5, PP5H, PP6, PP6H, PP7, PP7H, PP8, PP9H, GEN, GENH, GEN2, GEN2H, GEN3, GEN3H, GEN4, GEN4H, GPR, BPF, BPFH.
Cada tipo de variable requiere diferentes cantidades de memoria RAM para su asignación. La lista de abajo ilustra esto.
FLOAT
requiere 4 bytes de RAM.
DWORD
requiere 4 bytes de RAM.
Word
requiere 2 bytes de RAM.
BYTE
requiere 1 byte de RAM.
Bit
requiere 1 byte de RAM para cada 8 variables bits utilizadas.
Cada tipo de variable puede contener un mínimo diferente y el valor máximo:
FLOAT Teóricamente puede tener un valor de 1-1e37 hasta e38, así como los valores fraccionarios, haciendo de este el más exacto de los tipos de variables. Sin embargo, más que los tipos DWORD, esto tiene un precio ya que los cálculos y las comparaciones FLOAT utilizan más espacio de código en el PIC. Utilice este tipo de variable con moderación y sólo cuando sea estrictamente necesario. Los valores más bajos de punto flotante ofrecen más precisión.
DWORD Puede contener un valor entre -2147483647 y 2147483647. Esto tiene un precio sin embargo, ya que los cálculos y las comparaciones DWORD usarán más espacio de código dentro de la PICmicro, al igual que FLOAT, utilice este tipo de variable con moderación y sólo cuando sea necesario.
WORD Podrá contener a un valor entre 0 y 65535, que suele ser lo suficientemente grande para la mayoría de aplicaciones. Se sigue utilizando más memoria, pero no tanto como un tipo DWORD.
BYTE Puede tener un valor de 0 a 255, y son los caballos de trabajo habituales de la mayoría de los programas. El Código producido por las variables de tamaño BYTE es muy bajo en comparación con los tipos WORD, FLOAT o DWORD, y se debe tomar en cuenta si el programa requiere un funcionamiento más rápido, o más eficiente.
BIT Puede tener un 0 o un 1. Estos se crean 8 a la vez, por lo tanto, si declara una sola variable de tipo
BIT en el programa no guardará espacio de memoria RAM, solo ahorrará espacio de código, ya que las variables de tipo bit producen el uso más eficiente de código para las comparaciones etc
15 feb. 2013
Identificadores y Etiquetas
Identificadores Un identificador es simplemente un nombre. Son usados en Pronto Basic como etiquetas de líneas y nombres de variables. Un identificador es cualquier secuencia de letras, dígitos y símbolos, aunque no deben comenzar con un dígito. Los identificadores no distinguen las letras mayúsculas de las minúsculas, por lo que etiqueta, ETIQUETA, Etiqueta son todas tratadas como equivalentes. Aunque las etiquetas pueden tener cualquier número de caracteres de longitud, Protón Basic solamente reconoce los primeros 32.
Etiquetas Para marcar líneas que el programa puede desear referenciar con comandos GOTO ó GOSUB, Proton BAsic usa tiquetas de línea y no permite número de línea y no requiere que cada línea sea etiquetada. Cualquier línea puede comenzar con una etiqueta de línea que es
simplemente un identificador seguido por dos puntos (:) ejemplo etiqueta1:
Goto etiqueta1 20 feb. 2013
MULTIMETRO DIGITAL MONTAJE EN ISIS 7.7 SP2
MICROCONTROLADOR : PIC16F877 LCD 2x16 FUNCIONES : 1. VOLTIMETRO 2. AMPERIMETRO 3. CONTADOR
4. 5. 6. 7. 8.
FRECUENCIA PERIODO CICLO UTIL OHMETRO CAPACIMETRO
CODIGO :
; MULTIMETRO DIGITAL Device 16F877 Declare XTAL
;SE SELCCIONA EL PIC 20
;SE CONFIGURA UN CRISTAL DE 20MHZ
PORTB_PULLUPS = 1
;SE CONFIGURAS LAS RESISTENCIAS INTERNAS PULL-UP DEL PUERTO B
'***************************CONFIGURACION CONVERTIDOR ANALOGICO DIGITAL ****************** Declare ADIN_RES 10
'CONFIGURA EL ADC A 10 BIT DE RESOLUCION
Declare ADIN_TAD FRC
'ASIGNA EL OSCILADOR INTERNO PARA EL MUESTREO
Declare ADIN_STIME 50
' CONFIGURA A 50uSEG EL TIEMPO DE MUESTREO
ADCON1 = %10000010
' Se CONFIGURA EL ADC TODO ANALOGICO
;****************************************************************************************************** ;CONFIGURACION DE PUERTOS
TRISD=001111
;SE CONFIGURA EL PUERTO D
TRISC=000000
;SE CONFIGURA EL PUERTO C
TRISB=000001
;SE CONFIGURA EL PUETO B
TRISA=011111
;SE CONFIGURA EL PUERTO A
TRISE=000001
;SE CONFIGURA EL PUERTO E
Clear PORTD
; LIMPIA EL PUERTO D
Clear PORTB
; LIMPIA EL PUERTO B
Clear PORTC
; LIMPIA EL PUERTO C
Clear PORTE
; LIMPIA EL PUERTO E
'INICIALIZACON DE PANTALLA LCD
Declare LCD_TYPE 0
;PANTALLA ALFANUMERICA
Declare LCD_DTPIN PORTB.4
;SE USAN 4 LINEAS DE DATOS
Declare LCD_RSPIN PORTB.3
;SE CONFIGURA EL PIN RB3 PARA EL RS DEL LCD
Declare LCD_ENPIN PORTB.2 Declare LCD_LINES 2
;SE CONFIGURA EL PIN RB2 PARA EL PIN EN DEL LCD ;LCD DE DOS LINEAS
'DECLARACION DE VARIABLES
Dim Frec As Word
;SE DECLARA LA VAR FREC DE 16 BITS
Dim Cont As Byte Dim var1 As Byte
Dim volt As Float Dim OHM As Float Dim CAD As Word Dim amper As Float Dim temp As Float Dim periodo As Float Dim ciclo_h As Word Dim ciclo_l As Word Dim porc_ciclo_util As Float Dim capacitancia2 As Word Dim capacitancia As Float
;SE ALMACENAN LOS SIMBOLOS ESPECIALES EN LA MEMORIA CGRAM DE LA PANTALLA LCD ' CARGANDO EL 1ER. CARACTER PERSONALIZADO EN LA CGRAM BORDE ESQUINA SUPE IZ CARACTER 0 Print 254,64, $1F,$1E,$1C,$1C,$18,$18,$10,$00 'CARGANDO EL 2DO. CARACTER PERSONALIZADO EN LA CGRAM CARACTER 1
BORDE ESQUINA INF IZQ-
Print 254,72, $00,$10,$18,$18,$1C,$1C,$1E,$1F 'CARGANDO EL 3RO. CARACTER PERSONALIZADO EN LA CGRAM SUPER DER - CARACTER 2 Print 254,80, $1F,$0F,$0F,$07,$07,$03,$03,$01 'CARGANDO EL 4TO. CARACTER PERSONALIZADO EN LA CGRAM
INF DER - CARACTER 3
Print 254,88, $01,$03,$03,$07,$07,$0F,$0F,$1F 'CARGANDO EL 5TO. CARACTER PERSONALIZADO EN LA CGRAM CARACTER 4
SIGNO MENOS -
Print 254,96, $00,$00,$00,$1F,$1F,$00,$00,$00 'CARGANDO EL 6TO. CARACTER PERSONALIZADO EN LA CGRAM
FLECHA DER - CARACTER
5 Print 254,104, $00,$10,$18,$1C,$1C,$18,$10,$00 'CARGANDO EL 7MO. CARACTER PERSONALIZADO EN LA CGRAM CARACTER 6
FACHA ARRIBA -
Print 254,112, $00,$00,$00,$04,$0E,$0E,$1F,$1F 'CARGANDO EL 8VO. CARACTER PERSONALIZADO EN LA CGRAM CARACTER 7
FLECHA ABAJO -
Print 254,120, $1F,$1F,$0E,$0E,$04,$00,$00,$00
Cls
;LIMPIA EL LCD
Print At 1,1,0, " MULTIMETRO ",2 Print At 2,1,1, "
;
DIGITAL ",3
DelayMS 3000 Cls
;INICIO PROGRAMA PRINCIPAL
Cont = 0
; CONTADOR DE INDICADOR DE FUNCION A SELECCIONAR
INICIO:
If PORTD.1 = 1 Then DelayMS 300 Cont= Cont + 1 If Cont = 7 Then Cont = 6 End If End If
If PORTD.0 = 1 Then
DelayMS 300 Cont= Cont - 1 If Cont = 255 Then Cont = 0 End If End If
; SE SELECCIONA UNA OPCION DEPENDIENDO DEL VALOR DE LA VARIABLE CONT Select Case Cont Case 0 : Print At 1,1,"1-",5, $FE, $0C, "VOLTIMETRO " Print At 2,1,"2-", " AMPERIMETRO ",7 If PORTD.2=1 Then Call VOLTIMETRO End If
Case 1 : Print At 1,1,"2-",5, "AMPERIMETRO ",6 Print At 2,1,"3-", " MED. FREC ",7 If PORTD.2=1 Then Call AMPERIMETRO End If Case 2 : Print At 1,1,"3-",5, "MED. FREC ",6 Print At 2,1,"4-", " MED. PERIODO",7 If PORTD.2=1 Then Call FRECUENCIMETRO End If Case 3 : Print At 1,1,"4-",5, "MED. PERIODO",6 Print At 2,1,"5-", " % CICLO UTIL",7 If PORTD.2=1 Then Call MED_PERIODO End If Case 4 : Print At 1,1,"5-",5, "% CICLO UTIL",6
Print At 2,1,"6-", " OHMETRO
",7
If PORTD.2=1 Then Call CICLO_UTIL End If Case 5 : Print At 1,1,"6-",5, "OHMETRO
",6
Print At 2,1,"7-", " CAPACIMETRO ",7 If PORTD.2=1 Then Call OHMETRO End If Case 6 : Print At 1,1,"7-",5, "CAPACIMETRO ",6 Print At 2,1," ", "
"
If PORTD.2=1 Then Call Capacimetro End If End Select
GoTo INICIO
; REGRESA A LA ETIQUETA INICIO
;;FIN DEL PROGRAMA PRNCIPAL
;;****************** RUTINA PARA EL FRECUENCIMETRO *********************************** FRECUENCIMETRO: Cls Repeat Frec = Counter PORTB.0,200 POR UN PERIODO DE 200 MS
;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0
Frec = Frec * 5 Print At 1,1, " FREC = ",Dec Frec , " HZ Until PORTD.3=1
"
;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********** RUTINA PARA LA MEDICION DE PERIODOS ************************************
MED_PERIODO: Cls Repeat Frec = Counter PORTB.0,200 POR UN PERIODO DE 200 MS
;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0
Frec = Frec * 5 periodo = 1000 / Frec Print At 1,1, " T = ",DEC2 periodo , " mSeg Until PORTD.3=1
"
;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;**************** RUTINA DEL VOLTIMETRO************************* VOLTIMETRO: Cls Repeat CAD = ADIn 1
; DEVUELVE UN VALOR ENTRE 0 Y 1023 PORQUE ES 10 BIT
volt = CAD * 10/1023 Print At 1,1, "Volt = ", DEC2 volt , " VDC Until PORTD.3=1
" ;
;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********RUTINA PARA LA MEDICION DE RESISTENCIA ******************************* OHMETRO: Cls ;SE UTILIZA UN DIVISOR DE TENSION VOUT = R2*VIN/(R1+R2) Repeat CAD = ADIn 3 volt = CAD * 5000/1023 OHM = (volt * 10000 ) OHM = OHM /( 5000 - volt) Print At 1,1, " RES = ", DEC2 OHM , " OHM
Until PORTD.3=1
" ;
;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return
;*********************** RUTINA PARA EL AMPERIMETRO********************************* AMPERIMETRO: Cls Repeat CAD = ADIn 2 amper= CAD * 20 /1023 Print At 1,1, " Corr = ", DEC2 amper , " mA
" ;
Until PORTD.3=1 ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR Return
;******************************* RUTINA PARA LA MEDICION DE CICLO UTIL**************** CICLO_UTIL: Cls Repeat ciclo_l = PulsIn PORTB.0,0 BAJO
;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO
DelayMS 10 ciclo_h = PulsIn PORTB.0,1 ALTO
;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO
porc_ciclo_util = (ciclo_h*100) porc_ciclo_util= porc_ciclo_util /(ciclo_l + ciclo_h) Print At 1,1, "Ciclo Ut= ", DEC1 porc_ciclo_util ,"
" ;
Until PORTD.3=1 Return
;************************* RUTINA PARA CALCULAR LA CAPACITACIA ********************** Capacimetro: Cls Repeat For var1 = 1 To 100 High PORTE.0 DelayMS 10
' Discharge the cap
capacitancia2 = RCIn PORTE.0 , High CAPACITOR
;CALCULA EL TIEMPO DE DESCARGA DEL
capacitancia = (capacitancia2/64) + capacitancia 100 VECES
; SE SUMA EL RESULTADO EN LA VARIABLE
Next capacitancia= capacitancia /100 ; SE DIVIDE ENTRE 100 PARA SACAR EL PROMEDIO Print At 1,1, " Cap = ", Dec capacitancia , 223, " uF
" ;
Until PORTD.3=1 Return
28 feb. 2016
LCD, Interrupción RB0 INT, ADC y Transmision RS232 por Software Cada vez que se produce la interrupción RB0_INT por flanco de subida en RB0, se transmite vía serial RS232 datos correspondientes a los valores del puerto B y del Convertidor Analógico Digital, a su vez se puede observar la información en el LCD, representados como altura (puerto B) y peso (ADC). El ejemplo muestra en forma sencilla y ordenada como deben ser configurados y ubicados los codigos correspondientes a las interrupciones; así como de el resto de los periféricos.
'**************************************************************** Device 16F877 Xtal 20 PortB_Pullups FALSE 'DESHABILITA LAS RESISTENCIAS PULL-UP DEL PUERTO B On_Interrupt GoTo INTERRUPCION ; DEFINICIONES PARA LA CONFIGURACION INTERUPCIONES
Symbol INTEDG = OPTION_REG.6 ' BIT SELECCION DEL FALNCO DE INTERRUPCION Symbol GIE = INTCON.7 ' BIT HABILITADOR GLOBAL DE INTERRUPCIONES
Symbol INTE = INTCON.4 Symbol INTF = INTCON.1
' BIT DE HABILITACION DE LA INTERRPCION RB0/INT ' BIT DE HABILITACION DE LA INTERRPCION RB0/INT
;CONFIGURACION DEL CONVERTIDOR ANALOGICO DIGITAL Declare Adin_Res 10
' Resultado ADC - 10 bit
Declare Adin_Tad FRC Declare Adin_Stime 50 TRISA = 000001
' RC OSC ' 50us sample time
' Configura AN0 (PORTA.0) como entrada
ADCON1 = %10000000
' Configura PORTA.0 Analogico
;CONFIGURACION DEL LCD
Declare LCD_Type 0 Declare LCD_DTPin PORTD.4 Declare LCD_ENPin PORTD.3 Declare LCD_RSPin PORTD.2 ;CONFIGURACION DEL PUERTO SE COMUNICACION SERIAL
Declare SERIAL_DATA 8 Symbol RS232 = 84 Symbol tx_pin = PORTC.6 Symbol rx_pin = PORTC.7
' 8 bits de datos ' 9600 bps/sin bit de paridad
' Declaracion de Variables Dim ADC As Word
Dim PESO As Float Dim ALTURA As Byte Dim flag As Byte Dim cont As Word Symbol BUZZER = PORTD.0 ;EL CÓDIGO DE LA INTERRUPCIÓN SIEMPRE DEBE SER COLOCADO EN ESTA UBICACIÓN
;(NO COLOCAR DEBAJO DEL PROGRAMA PRINCIPAL ESTO SE DEBE A QUE LA DIRECCIÓN ; DE MEMORIA DE PROGRAMA DE ATENCIÓN DE INTERRUPCIONES ES LA ORG 0x004) GoTo Salta_Int
INTERRUPCION: flag = 1 INTF = 0 Context Restore Salta_Int: 'CONFIGURACION DE PUERTOS TRISA = %11111111 TRISB= %11111111 TRISC = %10111111 TRISD.0 = 0 TRISD.1 = 1 ;CONFIGURACIÓN DEL LA INTERRUPCIÓN POR FLANCO DE SUBIDA DEL PIN RBO (RB0/INT)
GIE=1 INTEDG = 1 INTE = 1 INTF = 0 cont = 0
flag = 0 BUZZER = 0 PESO =0 ALTURA =0
;HABILITADOR GLOBAL DE INTERRUPCIONES ;SELECCIÓN DE FLANCO DE SUBIDA PARA INTERRUPCION RB0/INT ; HABILITADOR DE INTERRUPCION RB0/INT ; BANDERA DE INTERRUPCION RB0/INT
Print At 1,1,"Peso : ", Dec2 PESO, " "
Print At 2,1,"Altura : ", Dec ALTURA, " " 'Inicio del programa principal
While 1 = 1 If flag = 1 Then DelayMS 2700 ALTURA = PORTB BUZZER = 1
DelayMS 300 BUZZER = 0 ADC = ADIn 0
' Efectua la conversion ADC y almacena el resultado en la variable ADC
PESO = ADC Select Case PORTB
Case 1 : ALTURA = 1 Case 3 : ALTURA = 2 Case 7 : ALTURA = 3 Case 15 : ALTURA = 4 Case 31 : ALTURA = 5 Case 63 : ALTURA = 6 Case 127 : ALTURA = 7 Case Else: ALTURA = 0 End Select cont = cont + 1 SerOut tx_pin, RS232, [Dec cont, ".- Peso: ", Dec2 PESO, " - ALTURA : " ,Dec ALTURA, 13] rs232 flag = 0 Print At 1,1,"Peso : ", Dec2 PESO, " " Print At 2,1,"Altura : ", Dec ALTURA, " " End If
Wend
Programación en Visual Basic UNIVERSIDAD TECNOLÓGICA DE MORELIA OFIMATICA PROGRAMACIÓN Profesor Alumno: Calificación: INTRODUCCIÓN.
' envio
Visual Basic es uno de los tantos lenguajes de programación que podemos encontrar hoy en día. Dicho lenguaje nace del BASIC (Beginner´s All-purpose Symbolic Instruction Code) que fue creado en su versión original en el Dartmouth College, con el propósito de servir a aquellas personas que estaban interesadas en iniciarse en algún lenguaje de programación. Luego de sufrir varias modificaciones, en el año 1978 se estableció el BASIC estándar. La sencillez del lenguaje ganó el desprecio de los programadores avanzados por considerarlo "un lenguaje para principiantes". VISUAL BASIC Es un lenguaje de programación que se ha diseñado para facilitar el desarrollo de aplicaciones en un entorno grafico (GUI-GRAPHICAL USER INTERFACE) Como Windows 98, Windows NT o superior. CARACTERÍSTICAS DE VISUAL BASIC. Diseñador de entorno de datos: Es posible generar, de manera automática, conectividad entre controles y datos mediante la acción de arrastrar y colocar sobre formularios o informes. Los Objetos Actives son una nueva tecnología de acceso a datos mediante la acción de arrastrar y colocar sobre formularios o informes. Asistente para formularios: Sirve para generar de manera automática formularios que administran registros de tablas o consultas pertenecientes a una base de datos, hoja de calculo u objeto (ADOACTIVE DATA OBJECT) Asistente para barras de herramientas es factible incluir barras de herramientas es factible incluir barra de herramientas personalizada, donde el usuario selecciona los botones que desea visualizar durante la ejecución. En las aplicaciones HTML: Se combinan instrucciones de Visual Basic con código HTML para controlar los eventos que se realizan con frecuencia en una pagina web. La Ventana de Vista de datos proporciona acceso a la estructura de una base de datos. Desde esta también acceso al Diseñador de Consultas y diseñador de Base de datos para administrar y registros. DESCRIPCIÓN DE VENTANAS PRINCIPALES Ejecutamos Visual Basic (VB) y al comenzar podemos ver la siguiente ventana que nos permitirá saber que en que formato deseamos el programa:
Está nos esta mostrando la diferentes formas para comenzar, hay 3 formas, la primera Nuevo es iniciando un Nuevo Proyecto, seleccionando uno tipo de proyecto, la segunda Existente es abriendo un proyecto ya existente, el archivo tiene que contener la extensión *.vbp, *.mak o*.vbg, y por ultimo la tercera Recientes es seleccionando un proyecto de la lista de archivos recientemente abiertos (VB se encarga automáticamente de mostrar una lista de los últimos proyectos abiertos). Para continuar se elige EXE estándar y luego Abrir, ahora se explicara la Ventana principal de Visual Basic. LAS PARTES DEL ENTORNO DE VISUAL BASIC. Barra de titulo: muestra el nombre del proyecto y del formulario q se está diseñando actualmente Barra de menús: agrupa los menús despegables que contienes todas las operaciones que pueden llevarse a cabo con Visual Basic 6.0. Barra de herramientas estándar: contienen los botones que se utilizan con mayor frecuencia cuando se trabaja con un proyecto. Simplifica la elección de opciones de los menús Archivo, Edición, Ver y Ejecutar; además, en el área derecha presenta la ubicación (coordenadas) y el tamaño del objeto seleccionado Ventana de formulario: es el área donde se diseña la interfaz gráfica, es decir, es donde se inserta electo gráficos, como botones, imágenes, casilla de verificación, cuadros de listas, etc. Cuadro de herramientas: presenta todos los controles necesarios para diseñar una aplicación, como cuadros de texto, etiquetas, cuadros de listas, botones de comandos, etc. Ventana de proyecto: muestra los elementos involucrados en el proyecto, como formularios, módulos, controles oxc, etc. Cada elemento puede seleccionarse en forma independiente para su edición.
Ventana de posición del formulario: muestra la ubicación que tendrá el formulario en la pantalla, cuando ejecute la aplicación. Esta ubicación puede cambiarse si se hace clic con el botón izquierdo del mouse. La Ventana propiedades muestra todas las propiedades del control actualmente seleccionado, en este caso muestra las propiedades del Form1, luego podemos ver que abajo dice "Form1 Form", lo que está en negrita es el nombre del objeto, y lo que le sigue es el tipo de objeto, en este caso es un Formulario (Form)
1.- Barra de titulo, en está se muestra el nombre del proyecto actual en el que se esta trabajando, luego viene el nombre del programa, continuado a "Microsoft Visual Basic viene el estado en el que está el proyecto, hay 3 tipos de estado en [Diseño] cuando se está escribiendo el código, [Ejecución] el programa se encuentra en ejecución, o en estado de [Interrupción] que es cuando en estado de ejecución se produjo un error, por ultimo en la barra de titulo se puede visualizar el nombre del Form (Formulario) actual en que se está trabajando y como se está trabajando [Form1 [Form]] cuando se trabaja en el diseño del Formulario o [Form1 [Código]] cuando se trabaja en el código para ese formulario. 2.- En la barra de menús se encuentran todas las opciones para manejar Visual Basic, a medida que se vayan utilizando se irán explicando. 3.- La barra de herramientas, contiene varios accesos directos a los menús, para agilizar el manejo de Visual Basic. 4.- Se le llama Cuadro de herramientas y sirve para colocar objetos en la Ventana de Diseño, como Cuadros de textos, Botones, Imágenes, y otros. Esto funciona muy fácil ya que seleccionamos por ejemplo un CommandButton (botón), y vamos al ventana diseño y lo creamos haciendo Clic con el Mouse (sin soltarlo!) y lo arrastramos hasta el tamaño que deseemos, en ese momento soltamos el botón. Y listo ya tienes un botón estilo Windows para usar!.
5.- La Ventana diseño, es aquí donde se le da la apariencia al programa, es decir lo que el usuario va a ver. Los puntillos del fondo son utilizados con el fin de alinear más fácil los objetos en el Formulario(Ventana). 6.- En la ventana Posición del Formulario, se puede ver un monitor y dentro de él una ventanita, esto sirve para definir la posición de la ventana cuando se inicie el programa, es decir donde se va a mostrar. Pruebe hacer clic sobre la ventana (sin soltar el botón!) y arrastre la ventana dentro del monitor, luego suelte el botón del Mouse. Y cuando se ejecute la aplicación la ventana aparecerá en esa posición. 7.- La Ventana propiedades muestra todas las propiedades del control actualmente seleccionado, en este caso muestra las propiedades del Form1, luego podemos ver que abajo dice "Form1 Form", lo que está en negrita es el nombre del objeto, y lo que le sigue es el tipo de objeto, en este caso es un Formulario (Form). 8.- En la ventana Posición del Formulario, se puede ver un monitor y dentro de él una ventanita, esto sirve para definir la posición de la ventana cuando se inicie el programa, es decir donde se va a mostrar. Pruebe hacer clic sobre la ventana (sin soltar el botón!) y arrastre la ventana dentro del monitor, luego suelte el botón del Mouse. Y cuando se ejecute la aplicación la ventana aparecerá en esa posición. 8.- El Explorador de proyectos es donde visualizamos todas los Formularios(Ventanas), Módulos, Clases, entre otros del proyecto actualmente abierto, es decir de la aplicación que se está creando, en este caso hay un solo Formulario llamado Form1, lo que aparece dentro de paréntesis es el nombre de archivo. Y este Formulario se encuentra dentro de una carpeta llamada "Formularios", por ser que VB clasifica los archivos por tipos, cuando use otros tipos de archivos además de Formularios podrá visualizar otras carpetas. VARIABLE Basic, desde siempre, al contrario de otros sistemas de programación, no exigió la definición previa de una variable. Una variable, como Vd. seguro que conoce, es un nombre que en el programa le asignamos a un dato. Ese dato podrá cambiar. Dim: Al declarar una variable con esta palabra estamos diciendo que la variable sea local al ámbito en que se declara. Puede ser dentro de un procedimiento o dentro de un formulario, de esta forma no sería accesible desde los demás procedimientos o formularios. Public: Las variables declaradas serán publicas y podrán estar accesibles desde todos los formularios de la aplicación. Para conseguirlo tendremos que declararlas en un módulo de código, no en la sección declarations de cualquier formulario de los que conste la aplicación. Para crear un módulo de código en el menú principal de Visual Basic marcamos en INSERT/MODULE y aparecerá junto a los demás formularios de la ventana de proyecto aunque con un icono distinto indicando que se trata de un módulo de código. Static: Con esta forma de declarar variables conseguiremos que las variables locales no se creen y se destruyan al entrar y salir de los procedimientos donde fueron declaradas sino que se mantenga su valor durante todo el periodo de ejecución de la aplicación. De esta forma a entrar en algún procedimiento las variables recuerdan el valor que tenían cuando se salió de él. TIPOS DE VARIABLES TIPO
COMENTARIO
BOOLEAN
Sólo admite 2 valores TRUE o FALSE
BYTE
admite valores entre 0 y 255
INTEGER
admite valores entre -32768 y 32767
LONG
admite valores entre -2.147.483.648 y 2.147.483.647
SINGLE
admite valores decimales con precisión simple
DOUBLE
admite valores decimales de doble precisión
CURRENCY
válido para valores de tipo moneda
STRING
cadenas de caracteres
DATE
fechas, permite operar con ellas
Constante: Declaración de constantes que pueden ser usadas en cualquier punto en lugar de su valor, permitiendo cambiarlo cuando sea necesario, sin tener que cambiarlo en todos los sitios en que se utiliza. La expresión no puede utilizar llamadas a funciones, pues la constante se calcula en tiempo de compilación, no en tiempo de ejecución. EXPRESIONES LÓGICAS Existen los llamados operadores lógicos, que nos permiten establecer condiciones que dependadan de más de un criterio de selección. Todos los operadores hacen que la expresión en la que se encuentren se evalúa a verdadero o falso, sin posibilidad de cualquier otro valor. Estas expresiones son: And: exp1 And exp2, donde se evalúa a verdadero sólo en el caso que el exp1 como exp2 se evalúen a verdadero. En cualquier otro caso se evalúa a falso. Or: exp1 Or exp2, donde se evalúa a verdadero cuando alguna de las expresiones exp1 o exp2 se evalúa a verdadero. Not: Not exp1. aquí se evalúa a verdadero si exp1 es falso y se evalúa a falso si exp1 es verdadero. Xor: exp1 Xor exp2, se evalúa a verdadero sólo en el caso de que una y sólo una de las expresiones exp1 o exp2 se evalúa a verdadero. OPERADORES DE VISUAL BASIC En Visual Basic existe un gran número de operadores que se pueden utilizar para crear fórmulas. Los operadores más utilizados en una aplicación de Visual Basic son los siguientes: Operador
Operación que realiza
+
Suma / Concatenación de cadenas de caracteres
-
Resta
*
Multiplicación
/
División
\
División entera
Mod
Resto de la división entera
^
Exponenciación
&
Concatenación de cadena de caracteres
OPERADORES RELACIONALES Los operadores relaciónales que reconoce vcpp son: Operador
Significado
==
Igual que
>
Mayor que
<
Menor que
>=
Mayor o igual que
<=
Menor o igual que
!=
No es igual que o es diferente que
SENTENCIAS
SENTENCIA DIM Es la forma mas común de declarar una variable como Privada. Puede emplearse en un Procedimiento, Función, Formulario o Módulo. La sintaxis es de la siguiente forma: Dim nombrevariable As Integer (o el tipo que sea) Declarando una variable con la sentencia DIM, en un formulario, Función, procedimiento o módulo, el entorno de la variable será el explicado anteriormente para una variable declarada como Privada. Es decir, esa variable no sale del formulario, procedimiento ó módulo donde se declaró. Cada vez que entremos al formulario, procedimiento o módulo, esa variable tomará el valor cero (si es numérica) o nulo (si es string). Resumimos la forma de declarar una variable : En un Procedimiento (La variable no puede usarse fuera de esta Procedimiento) Dim Variable As Tipovariable En un Formulario (En su sección de declaraciones)
SENTENCIAS CONDICIONALES.
Llamamos sentencias condicionales a aquellas que se realizan si se cumple una determinada condición. Son las sentencias por las que empieza cualquier texto de Basic, y este no va ser menos. La sentencia condicional mas usada es: Si se cumple una condición Entonces Realiza estas instrucciones Si no se cumple Realiza estas otras instrucciones Fin de la sentencia. Así de fácil es programar en Basic. Lo que ocurre es que esta herramienta habla inglés, y lo descrito anteriormente toma la forma: If condición Then Instrucciones Else Otras instrucciones End If
LA SENTENCIA SELECT La sentencia SELECT "selecciona" los campos que conformarán la consulta, es decir, que establece los campos que se visualizarán o compondrán la consulta. El parámetro 'lista_campo' está compuesto por uno o más nombres de campos, separados por comas, pudiéndose especificar también el nombre de la tabla a la cual pertenecen, seguido de un punto y del nombre del campo correspondiente. Si el nombre del campo o de la tabla está compuesto de más de una palabra, este nombre ha de escribirse entre corchetes ([nombre]). Si se desea seleccionar todos los campos de una tabla, se puede utilizar el asterisco (*) para indicarlo. Una sentencia SELECT no puede escribirse sin la cláusula FROM. Una cláusula es una extensión de un mandato que complementa a una sentencia o instrucción, pudiendo complementar también a otras sentencias. Es, por decirlo así, un accesorio imprescindible en una determinada máquina, que puede también acoplarse a otras máquinas. En este caso, la cláusula FROM permite indicar en qué tablas o en qué consultas (queries) se encuentran los campos especificados en la sentencias SELECT. Estas tablas o consultas se separan por medio de comas (,), y, si sus nombres están compuestos por más de una palabra, éstos se escriben entre corchetes ([nombre]). Tenemos aquí algunos ejemplos de mandatos SQL en la estructura SELECT...FROM...: SELECT nombre,apellidos FROM clientes; Selecciona los campos 'nombre' y 'apellidos' de la tabla 'clientes'. SELECT clientes.nombre, producto FROM clientes, productos; Selecciona el campo 'nombre' de la tabla 'clientes', y el campo 'producto' de la tabla productos. Hay que tener en cuenta que si dos tablas poseen el mismo nombre de campo (un 'nombre' de cliente y un 'nombre' de producto, hay que especificar también la tabla a la cual pertenece dicho campo, ya, que de lo contrario, seleccionaría ambos nombres). SELECT pedidos.* FROM pedidos; Selecciona todos los campos de la tabla 'pedidos'. SELECT * FROM pedidos; Selecciona todos los campos de la tabla 'pedidos'. SELECT nombre, apellidos, telefono FROM clientes;
Selecciona los campos 'nombre', 'apellidos' y 'telefono' de la tabla 'clientes'. De esta manera obtenemos una agenda telefónica de nuestros clientes. SELECT [codigo postal] FROM [tabla morosos]; Selecciona el campo 'codigo postal' de la tabla 'tabla morosos'. BUCLE POR CONTADOR Realiza el bucle tantas veces como le indiquemos. Por ejemplo, en este bucle nos va a presentar las 26 letras mayúsculas del alfabeto inglés
For N=65 To 90 Label1.caption = Chr ( N ) Next N
Este "programa" nos presentará en una caja (Label) los caracteres cuyo número ASCII vaya desde el 65 (A) al 90 (Z) Comenzará presentando el correspondiente al número 65, e irá presentando sucesivamente el 66, el 67, etc., hasta llegar al 90, donde se parará.
BUCLES POR CONDICIÓN Ejecuta las instrucciones del bucle mientras se cumple una condición X=0 Do While X < 1000 X=X+1 Loop El programa toma una variable ( X ) que previamente tuvimos la curiosidad de ponerla a cero, e incrementa su valor una unidad. Analiza si el valor de X es menor que 1000, y si es cierto, vuelve a realizar el bucle. Así hasta que X ya no sea menor que 1000. Al dejar de cumplirse que X sea menor que 1000, sale del bucle. Acabamos de realizar un temporizador, y también de exponer las sentencias condicionales y los bucles, inicio de cualquier curso de Basic. Como final de lección, se propone un problema. Con el primer bucle, donde visualizábamos los caracteres A a la Z, posiblemente no nos diese tiempo de ver cada una de las letras que iban apareciendo en la pantalla, en la etiqueta Label1, dado que cambiaría con mucha velocidad, y solamente veríamos la Z, que es donde se detuvo el programa. Podemos poner un temporizador cada vez que presente una letra, y así nos dará tiempo a verla. Con los dos bucles vistos anteriormente ya podemos hacerlo. Si lo que queremos es que el programa se ejecute mientras no se cumpla una determinada condición, la sentencia será: X=0 Do Until X > 1000 X=X+1 Loop Observe que la diferencia entre una y otra es la condición, While para indicar Mientras se cumpla que ... y Until para indicar Mientras no se cumpla que .... Utilizaremos la condición de While para: (Mientras se cumpla la condición) For N=65 To 90
Label1.caption = Chr ( N ) Label1.RefreshN ' Refresca la etiqueta X=0 Do While X < 1000 X=X+1 Loop Next N La instrucción de la cláusula Else, sólo se ejecuta cuando el resto de condiciones han fracasado. Cualquiera de los bloques de instrucción puede contener un número arbitrario de instrucciones, incluida la posibilidad de que existan otras instrucciones IF-THEN-ELSE. Se pueden colocar todas las sentencias de código que queramos en cada uno de los bloques de sentencias, siempre que cada sentencia vaya en una línea distinta.. Un ciclo similar a el 'Do While' es el 'Loop While'. La principal diferencia es que el ciclo Do While la condición para poder continuar esta al principio (primero ceha la condición y luego ejecuta el código que se desea repetir), mientras que en el Loop While esta al final, esto es después de que ejecuta el código checa si debe continuar. Esto significa que un ciclo Do While, puede nunca ser ejecutado, mientras que un ciclo Loop While siempre al menos se ejecutará una vez. Cuando existe un gran número de instrucciones a evaluar es aconsejable utilizar otra estructura de decisión, como puede ser las instrucciónSelect Case. Esta instrucción no dá más potencia al lenguaje, pero hace que el código sea más legible y eficiente. Esta sentencia permite realizar operaciones diferentes dependiendo del valor de una variable. La estructura de repetición For...Next es adecuada cuando conocemos el número de veces que debe repetirse un conjunto de instrucciones y deseamos reducir la cantidad de código escrito. Otra estructura de repetición es Do...Loop. Esta estructura se utiliza cuando desconocemos cuántas veces se ha de ejecutar el bucle. Si utilizamos While el bucle se repite mientras la condición se cumpla y si utilizamos Until el bucle se repetirá hasta que la condición dé valor verdadero. Con While, la condición es comprobada al principio del bucle, por lo que si no se cumple al iniciarse, el cuerpo del bucle no se ejecutará. Con Until se comprueba a la salida del bucle, por lo que por lo menos, una vez se ejecutará el bucle. Los siguientes comandos pueden ser usados para repetir varias veces la ejecución de una sección de código. Ciclo Do (Sintaxis): Do While condición líneas de código Loop Ciclo While (Sintaxis): Do líneas de código Loop While condición Los ciclos For si los programadores saben cuantas veces un cliclo debe ser ejecutado. Ciclo For (Sintaxis):
For contador = valor_inicial To valor_final [Step incremento] líneas de código Next [contador] If estructura de decisisón If en Línea simple End If El If de multi-línea necesita una expresión 'End If' para definir el final del bloque If. Si cualquiera de las dos condiciones es falsa, el programa ejecutará el código que está en el bloque 'Else'. El comando 'ElseIf' puede usarse para checar una segunda condición en caso de que la primera sea falsa. Select' define el final del bloque de casos. Si deseamos que presente un mensaje si se introduce un valor no definido en el bloque de casos, El incremento en Step como parte del ciclo, es usado para decirle a VB cuanto debe aumentar en cada ciclo la variable de control. Introduce el siguiente código y observa que valores se imprimen.: For test = 1 To 10 Step 2 Print test Next test Una de las mas poderosas características de cualquier computador es la capacidad que tiene de tomar decisiones. Es decir al comparar dos alternativas diferentes el computador puede tomar una decisión basándose en la evaluación que hace de alguna condición. ejemplo de instrucciones condicionales: si sueldo > 3000 desplegar rico si no desplegar pobre Fin-si si sexo = 'm' imprime mujer si no imprime hombre Fin-si De los ejemplos observar que los caminos a seguir por el computador dependerán de la evaluación que el computador hace con y de la condición. Todo lenguaje de programación debe tener instrucciones que permitan formar condiciones e instrucciones que pueden evaluar esas condiciones.
Pero recordar que lenguajes modernos y orientados a clientes-servidores de igual forma tienen componentes que permiten del mismo modo al usuario tomar decisiones incluso directamente en pantalla, es decir tambien existen los objetos, controles o componentes de selección y decisión en html. El formato general de una instrucción condicional es: Como se observa, son cuatro partes bien diferenciadas entre si;
La propia instrucción condicional en si
La condición
El grupo cierto de instrucciones
El grupo falso de instrucciones Cuando el computador evalúa una condición el resultado de esa evaluación solo es evaluado de dos maneras o la condición es CIERTA o la condición es FALSA. Esto dependerá del valor que tenga asignado o que se haya capturado para la variable que esta en la condición, por ejemplo si se capturo 6000 en sueldo en el ejemplo a) entonces el computador indicaría que la condición es CIERTA pero en otro caso si a la variable sueldo primero se le asigno un valor de 250 entonces el computador indicaría que la condición es FALSA. Ya dependiendo del resultado de la evaluación, el computador ejecuta las instrucciones contenidas en el grupo de cierto o falso respectivamente. Empezaremos el análisis por la CONDICIÓN. INSTRUCCIONES DE CONTROL DE PROGRAMA CONDICIONES SIMPLES En general todas las condiciones se forman con;
Variables
Operadores Relaciónales
Constante o Variables
sexo
=
m
sueldo
>
300,000
Una condición simple se define como el conjunto de variables y/o constantes unidas por los llamados operadores relaciónales. INSTRUCCIONES DE CONTROL DE PROGRAMA INSTRUCCIÓN IF Es la instrucción condicional mas usada en los diversos lenguajes de programación, su formato completo y de trabajo en vcpp es: cargar o asignar la variable de condición; if (condición) { grupo cierto de instrucciones;} else { grupo falso de instrucciones; };
Primus.- Observar donde van y donde no van los puntos y comas; Secundus.- La condición va entre paréntesis ; Tertius.- Si un if no ocupa un grupo falso de instrucciones entonces no se pone el else, y la llave antes del else si terminaría con punto y coma. Ejemplo: #using #using #using using namespace System; void main(){ //declarando variables int sueldo; // capturando,cargando y convirtiendo //los datos de la forma a las variables sueldo = Int32::Parse(lcnet::getparametro("SUELDO")); //construyendo y desplegando la pagina de salida Console::WriteLine("Content-Type:text/html\n"); if (sueldo >= 3000) {Console::WriteLine(S"RICO");} else {Console::WriteLine(L"POBRE");}; }//fin main INSTRUCCIONES DE CONTROL DE PROGRAMA CONDICIONES COMPUESTAS En muchas ocasiones es necesario presentar mas de una condición para su evaluación al computador. Por ejemplo que el computador muestre la boleta de un alumno si este estudia la carrera de medicina y su promedio de calificaciones es mayor de 70. Una condición compuesta se define como dos o mas condiciones simples unidas por los llamados operadores lógicos. Los operadores lógicos que vcpp reconoce son;
OPERADOR
SIGNIFICADO
&&
"Y" LOGICO
||
"O" LOGICO
!
"NO" NEGACION
Ejemplo: if ( (carrera=="informatica") && ( sexo=="m") ) etc, etc, etc. Notas: ä Observar que cada condición simple lleva sus propios parentesis. ä Si la variable es de tipo string el dato va entre comillas("), pero si la variable es de tipo char el dato va entre apostrofes('). Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico "&&", las dos condiciones simples deben ser ciertas. Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico "||", basta con que una de las condiciones simples sea cierta. La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada por la relación donde n = cantidad de condiciones, la primera mitad de ellos empieza en cierto y la segunda mitad en falso. Ejemplo, si formamos una condición compuesta con dos condiciones simples y el operador lógico "y", la cantidad total de casos posibles serian , y se puede construir la siguiente tabla de verdad. Tabla de verdad con "y" IRA COND SIMPLE
2DA COND SIMPLE
EVALUACION
C
C
C
C
F
F
F
C
F
F
F
F
La evaluación final, se obtiene usando la regla anteriormente descrita para una condición compuesta, que contiene el operador "Y". Esta tabla significa lo siguiente; 1.- Cualquiera que sean la cantidad de datos procesados, siempre caerá en uno de estos cuatro casos generales. La tabla de verdad para una condición compuesta con "Or" es la siguiente; IRA COND SIMPLE
2DA COND SIMPLE
EVALUACION
C
C
C
C
F
C
F
C
C
F
F
F
Construir una tabla de verdad para una condición compuesta de tres o mas condiciones simples, es también tarea sencilla, solo recordar que; 1.- La cantidad posible de casos es posible, la mitad empiezan con Cierto y la otra mitad empiezan con Falso. 2.- Para evaluar esta condición triple primero se evalúan las dos primeras incluyendo su operador bajo las reglas ya descritas y luego se evalúa el resultado parcial contra la ultima condición y ultimo operador para obtener la evaluación final. Ejemplo una condición compuesta de tres condiciones simples, donde el primer operador lógico es el "y" y el segundo operador lógico es el "O", daría la siguiente tabla de verdad. Ira cond
2da cond
Eval 1a Y 2a
3ra cond
Eval eval O 3ra
C
C
C
C
C
C
C
C
F
C
C
F
F
C
C
C
F
F
F
F
F
C
F
C
C
F
C
F
F
F
F
F
F
C
C
F
F
F
F
F
CAPTION: Representa es texto que aparecerá en el menú. NAME: Es el nombre del control. Se puede anteponer el prefijo mnu más el texto del título del menú. CHECKED: Establece si debe aparecer una marca de verificación a la izquierda del texto del objeto del menú. La marca la puedes utilizar cuando deseas informar de la opción que está activada en un momento determinado. ENABLED: Indica si el objeto podrá recibir eventos del usuario. Si tiene el valor False el elemento aparecerá atenuado en el menú. VISIBLE:
Indica si el objeto debe mostrarse o no, si se establece este valor a False, los elementos situados a la derecha ocupan el lugar del elemento no visible. WINDOWSLIST: Establece el valor que determina si un objeto de menú mantiene una lista de las ventanas MDI secundarias del formulario actual. Elementos del Menú: Utilizando los botones de sangría se puede determinar el nivel del objeto menú que quieras seleccionar. Así, los títulos de menú se sitúan en el nivel superior, mostrándose en la lista inferior del editor de menús, lo más a la izquierda posible. En muchas aplicaciones se pueden ver unas barras horizontales en los menús desplegables que realizan la función de dividir en secciones dichos menús. Este elemento es conocido como un separador, y sirve para separar aquellos comandos del menú que tengan_un_motivo_en_común. Para crear un separador, basta con introducir un guión (-) en la propiedad Caption. No se puede crear un elemento en un nivel inferior inmediatamente después de un separador, es decir, no puedes tener como título de menú un separador. TECLAS DE MÉTODO ABREVIADO: Al introducir el carácter & el menú está creando una tecla de acceso a dicho objeto. Esta tecla se representa subrayada en el texto de menú y respresenta la tecla del teclado que el usuario puede pulsar para ejecutar la acción. Dicha tecla se corresponde con la letra que sigue al caracter & en la propiedad Caption del objeto menú. Si se trata de un título de menú tienes que usar la tecla de acceso en combinación con la telca [Alt.]. Una vez abierto un título de menú y desplegado sus elementos, para acceder rápidamente a uno de ellos, puedes usar la tecla de acceso directamente. Tienes que tener cuidado en no utilizar las mismas teclas de acceso para elementos de un mismo nivel de menú ya que entonces no funcionarán. El editor de menú también admite la incorporación de teclas de método abreviado. Las abreviaturas del menú son combinaciones de teclas que se pueden utilizar en lugar de elegir el elemento del menú correspondiente. Para crear una tecla de método abreviado tienes que utilizar la propiedad Shortcut, a la que puedes acceder al crear el menú desde el editor de menús. EVENTOS DEL MENÚ Cuando en tiempo de diseño seleccionamos la opción de menú de un formulario que estamos creando, Visual Basic muestra el procedimiento de evento click de dicho elemento del menú. En el caso del título del menú, el procedimiento click tiene como acción predeterminada la de mostrar los elementos de menú del nivel inferior, por lo que no será necesario tener que programar esta acción. Esto también se puede aplicar a los elementos de un menú que son a su vez títulos de submenús. En casi todos los casos tienes que utilizar una opción del menú para descargar el formulario o para finalizar la aplicación. La opción de texto salir suele ser el más apropiado. La instrucción Unload descarga de memoria el formulario que se especifique. Se puede usar de varias formas, por ejemplo si estamos dentro de un Form llamado frmconsulta podremos salir de él de dos formas: Una es Unload Me o Unload frmconsulta. MSGBOX La síntaxis completa de la función MsgBox es: MsgBox(mensaje[, botones][, título][, archivoAyuda, contexto]) Los valores que pueden tomar el parámetro botones son: Constante
Valor
Descipción
vbOKOnly
0
Muestra sólo el botón aceptar
vbOKCancel
1
Botones aceptar y cancelar
vbAbortRetryIgnore
2
Botones anular, reintentar e ignorar
vbYesNoCancel
3
Botones si, no y cancelar
vbYesNo
4
Botones si y no
vbRetryCancel
5
Botones reintentar y cancelar
vbCritical
16
Muestra el icono de mensaje crítico
vbQuestion
32
Icono de interrogación
vbExclamation
48
Icono de exclamación
vbInformation
64
Icono de mensaje de información
vbAplicationModal
0
Cuadro de diálogo modal de la aplicación
vbSystemModal
4096
Cuadro de diálogo modal del sistema
El parámetro botones es de valor numérico, y además de los botones que aparecen en le cuadro de diálogo, también puede indicar el icono que acompañe al mensaje y el tipo de diálogo modal que es. Cuando un cuadro de diálogo es modal de aplicacióen tienes que cerrarlo para interactuar con otra ventana de la misma aplicación. Cuando es un cuadro de diálogo modal del sistema, todas las aplicaciones que estén ejecutándose se suspenden hasta que el usuario responda al cuadro de diálogo. El cuadro InputBox se consigue a través de la función InputBox. Se utiliza cuando se necesita que el usuario introduzca alguna información. LOS CONTROLES Realmente son objetos que disponen de sus propias propiedades y métodos, y cuya utilidad es la de facilitarnos el desarrollo de nuestras aplicaciones. Bueno, este intento de definición puede haber quedado bien, pero para que lo tengáis más claro, tener en cuenta que en cualquier aplicación con la que trabajamos estamos rodeados de controles. Quien no ha visto en multitud de programas los botones ACEPTAR y CANCELAR, un cuadro para introducir texto, una lista con datos, etc.. Pues todos ellos son controles y no tendremos que preocuparnos por crearlos para nuestras aplicaciones sino que ya vienen con el paquete de VB, lo único que tendremos que hacer es modificar sus propiedades: tamaño, color, etc.. para incorporarlos en nuestras aplicaciones y asociarles el código necesario para que se comporten como esperamos al ejecutar la aplicación. Antes de empezar a conocer los controles básicos veamos cuales son sus características generales:
Propiedades: Todos los controles disponen de una serie de propiedades las cuales podemos cambiar al incluirlos en nuestras aplicaciones. Ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto, etc.
Métodos: Son procedimientos asociados a los controles, es decir, rutinas ya establecidas que podemos invocar desde nuestras aplicaciones para que se realice alguna operación sobre el control. Por ejemplo el control ListView ( la lista de archivos que aparece en el
explorador de windows) dispone del metodo order que te ordena los datos aparecidos en la lista.
Eventos: Son acciones que pueden ser motivadas por el propio usuario o por mismo sistema operativo. Ejemplos pueden ser el movimiento del raton o hacer click sobre su botón. En Visual Basic digamos que se utiliza la programación orientada a eventos, lo cual es una de las diferencias más importantes respecto a la programación lineal de MS DOS. No necesitamos detectar cuando se ha producido un evento determinado, Windows lo detecta automáticamente. Los eventos ya estan definidos, son bastantes y cada control cuenta con los suyos propios, aunque son muy parecidos. Lo único que tendremos que hacer es asociar el código necesario al evento que necesitemos tratar. Para mostrar la ventana donde aparecen los controles que Visual Basic carga por defecto nada más arrancar la aplicación tendremos que marcar en View del menú principal (versión inglesa) y activar la opción Toolbox. Obtendremos una ventana como esta en la pantalla: Realmente existen muchos más controles, aunque estos son los más utilizados y por eso aparecen por defecto. Para tener acceso a los demás controles tanto de Visual Basic como los controles que incorporan otras aplicaciones marcaremos en Tools/Custom Controls del menú principal. Moviendo el ratón por encima de cualquier control aparecerá una pista indicándonos el control de que se trata. Para que esta ventana aparezca siempre en primer plano aunque no sea la ventana activa marcaremos con el boton derecho del ratón en cualquier lugar de la ventana y activaremos la opción Always On Top del menú contextual. CONTROLES BASICOS TextBox Mediante este control podremos realizar tanto la entrada como la salida de datos en nuestras aplicaciones. No hace falta que indiquemos las coordenadas de la situación del formulario en pantalla, simplemente tendremos que marcar sobre el control de la caja de herramientas y dibujarlo con el tamaño que queramos en nuestro formulario. PROPIEDADES Las propiedades de las que dispone el control son las siguientes:(para obtener el cuadro de propiedades, seleccionar el control y pulsar F4 o pulsar con el boton derecho para obtener el menú contextual y marcar Propierties) Text: Aqui indicamos el texto que aparecerá en el control. Podemos asignarle cualquier texto en tiempo de diseño o ejecución. También podemos tomar el texto que haya introducido el usuario para tratarlo durante la ejecución. Name: Esta propiedad la tienen todos los controles, el nombre que viene por defecto en este caso Text1 y es el nombre con el que se conocerá el control cuando lo utilicemos en el codigo. En un mismo formulario no puede haber 2 controles con el mismo nombre. Conviene poner un nombre que represente la funcion que tiene el control en la aplicacion para que el codigo quede más claro. Ejemplo, si en el textbox vamos a introducir la dirección de una persona podemos asignale a esta propiedad el valor Direccion. MultiLine: Permite que introduzcamos varias lineas de texto en el control en lugar de sólo una. Alignment: Alineacion que tendrá el texto dentro del control: izquierda, centro o derecha. Para que funcione la propiedad MultiLine debe estar con el valor true.
Locked: Si esta con valor true bloquea el control, es decir, el usuario no puede introducir ni modificar el texto que contenga. Nos puede servir para utilizar el control como salida de datos sin que el usuario pueda modificarlos por error. Otras propiedades que son comunes a la mayoria de los controles: Backcolor: color de fondo. Forecolor: color de letra. Font: tipo y tamaño de letra. METODOS Recordemos que por métodos se entienten los procedimientos o funciones asociados a un control, los cuales nos permiten realizar ciertas operaciones útiles sobre dicho control: Ej. ordenar sus elementos, buscar un dato, etc.. Pues bien, los controles básicos que vamos a ver en este capítulo únicamente contienen métodos avanzados que no vamos a analizar por ahora, ya que son métodos que no se suelen utilizar. Más adelante cuando veamos otros tipos de controles estudiaremos cuales son los métodos que nos podrán servir. Si alguien está interesado en conocer todas las características de los controles puede hacerlo mirando en la ayuda que proporciona VB, haciendo click sobre cualquier control de la caja de herramientas y pulsando a continuación F1 obtendrá ayuda referente a ese control donde aparecerán todas sus propiedades, metodos y eventos. EVENTOS Los eventos son acciones que se pueden realizar en cualquier control: click, doble click, movimiento del ratón. A estos eventos se les puede asociar código para que se ejecute al producir el evento. MouseMove: al mover el raton por encima del control. Mousedown: al pulsar cualquier boton del raton Change: al cambiar el contenido del control Click: al hacer click con el botón izquierdo del ratón sobre el control Doubleclick: al hacer doble click con el con el botón izquierdo del ratón sobre el control Getfocus: este evento se activa cuando el control recibe el enfoque, es decir, cuando se activa el control en tiempo de ejecución para introducir datos en él o realizar alguna operación. Lostfocus: Es el contrario del anterior evento, se activa cuando el control pierde el enfoque, es decir, se pasa a otro control para seguir introduciendo datos. EJEMPLO Vamos a probar el uso del control TextBox mediante un pequeño ejemplo en el que teniendo un único control de este tipo en un formulario, lo programaremos de forma que al pasar el ratón sobre el control (evento mousemove) aparecerá en el formulario el texto que contenga. Observamos que al situar el control en el formulario aparece por defecto el texto Text1. Para que no aparezca ese texto al ejecutar la aplicación, debemos cambiar la propiedad Text pulsando F4 y colocar el texto que queramos o no colocar nada. Lo que queremos hacer es que cada vez que movamos el raton por el control aparezca su contenido en el formulario. Entonces lo que habrá que hacer abrir la ventana de código, seleccionando el control y pulsando F7, o con el botón derecho del ratón y la opción View code del menú contextual. Este proceso nos llevará al cuadro de la imagen siguiente.
Lo que tendremos que hacer es seleccionar el evento que necesitemos de la sección Proc, en nuestro caso mousemove y a continuación teclear el codigo correspondiente: La instrucción print visualiza un texto en el formulario y si le ponemos text1.text le decimos que nos muestre la propiedad Text del control Text1 que ese será el nombre que tendrá el control por defecto si no lo hemos cambiado en la propiedad name. Al ejecutar esta pequeña aplicación pulsando F5 observaremos como aparece en el formulario lo que hayamos tecleado en el control cada vez que movemos el raton sobre el Textbox. Podemos modificar el programa para que responda a cualquier otro evento sin más que seleccionarlo en la sección Proc e introduciendo el codigo que sea necesario. Label Este control es también uno de los más utilizados, aunque su utilidad queda restringida a la visualización de datos en el mismo, no permitiendo la introducción de datos por parte del usuario. La forma de utilizarlo es similar a la del control anterior, dibujar el control en el formulario con el tamaño que queramos y asignarle un texto en tiempo de diseño o de ejecución esta vez sin utilizar la propiedad text puesto que no la incorpora, sino utilizando la propiedad caption. Este control sirve para mostrar mensajes en nuestro formulario que orienten al usuario sobre la utilidad de los demás controles que tengamos en la aplicación o para indicarnos acciones que podemos realizar. En el ejemplo anterior donde aparecía un textbox en el formulario, hubiera quedado mejor con un mensaje aclaratorio contenido en un control label: PROPIEDADES Caption: Es el texto que contendrá el control. Alignment: Alineación del texto contenido en el control, no necesita que esté activada ninguna otra propiedad. BorderStyle: Si queremos que aparezca un borde alrededor del control activaremos esta propiedad. Para este control no se suelen utilizar los eventos ya que su contenido suele cambiar poco a lo largo de la ejecución de la aplicación. De todas formas los eventos son casi los mismos del control textbox excepto que no dispone de los eventos GetFocus y LostFocus ya que a este control no se le puede dar el enfoque. En la parte final de este capitulo veremos un ejemplo donde se muestra el funcionamiento de todos los controles que vamos a ir viendo.Por ahora a ver si conseguis que ahora el mensaje no aparezca en el formulario sino en un segundo label situado en el formulario, dejando un control label que muestre el mensaje aclaratorio que hemos visto antes. CommandButton Este control es el típico botón que aparece en todas las aplicaciones y que al hacer click sobre él nos permite realizar alguna operación concreta, normalmente Aceptar o Cancelar. Aunque según el código que le asociemos podremos realizar las operaciones que queramos. En el ejemplo anterior podemos añadir un control de este tipo para salir de la aplicación sin tener pulsar sobre la equis de la esquina superior derecha. Pero sólo con introducir un control de este tipo con el texto salir que se introduce a traves de la propiedad caption no basta. Habrá que asociarle un código que nos permita salir de la aplicación en el evento adecuado. Y el evento por excelencia de este control es click. Así pues accederemos al código del control y la sentencia nos permitirá salir de la aplicación es End, simplemente tecleamos esa palabra en el evento click y comprobar que realmente finalizaremos nuestra aplicación al pulsar sobre dicho botón.
PROPIEDADES Caption: Aqui pondremos el letrero que queremos que apaezca en el botón: aceptar, cancelar, salir, etc. Enabled: Esta es una nueva propiedad, cuando su valor es true el botón funciona normalmente, cuando su valor es false el boton se encuentra desactivado, no responde a los eventos producidos sobre él y el texto aparece en un gris claro advirtiendonos de su estado. Podemos utilizar esta propiedad para activar o desactivar un boton dependiendo del estado de otros controles. Por ejemplo, en un boton Aceptar, no activarlo hasta que se haya introducido una cantidad en un control textbox, ya que ese botón nos calculará el IVA de la cantidad. EVENTOS Click: Es el evento típico de este control y el que más se utiliza. MouseMove: Como sabemos detecta el movimiento del ratón sobre el control. Puede servir para que aparezca un mensaje en un control Label que nos aporte información sobre la utilidad del control ampliando el texto que hayamos colocado como caption del commandbutton. OptionButton Este control nos permite elegir una opción entre varias de las que se nos plantean. Cada opción será un control optionbutton diferente. Facilita la introducción de datos por parte del usuario: De todas las opciones que se nos ofrece, en este caso los 4 colores, sólo podremos activar una. Si activamos cualquier otra opción, se desactivará automáticamente la última que teníamos activada. El marco que está alrededor de los 4 controles optionbutton se trata del control Frame , es opcional, aunque es conveniente colocarlo siempre que hagamos uso de las opciones. No sólo por motivos de presentación sino porque de esta manera podremos establecer grupos de controles optionbutton independientes en los que en cada grupo sólo pueda haber una opción activada a la vez. También, al mover el marco se moverán los controles incluidos en él facilitándonos las modificaciones. Para que los controles Optionbutton queden englobados dentro de un control Frame, primero tendremos que colocar el control Frame en el formulario con el tamaño adecuado y despues ir colocando los controles Optionbutton dentro del Frame. Del control Frame la única propiedad que nos interesará es caption, que es el texto que aparecerá en el encabezado, en el ejemplo anterior: colores. PROPIEDADES DE OPTIONBUTTON Caption: El texto que aparecerá al lado del control: Rojo, verde, etc. Value: Es el valor que tendrá el control: True si se encuentra activado y False si no lo está. Para comprobar que opción ha activado el usuario comprobaremos el estado de esta propiedad. Alignment: Alineación del texto respecto al control: Left Justify: el control aparece a la izquierda del texto. Es el ejemplo anterior.Right Justify: el control aparece a la derecha del texto. Los eventos del control son los mismos que en anteriores controles, aunque no se suele asociar código a los eventos de este tipo de controles, sino únicamente conocer el valor que tienen: true o false. Aplicación de ejemplo Para practicar con los controles que hemos visto vamos a realizar una pequeña aplicación que consistirá en realizar con 2 números que introduzcamos, una operación que seleccionemos y mostrar el resultado.
El formulario donde estarán todos los controles es el siguiente: La propiedad Caption de cada uno de los controles es la que se muestra en el formulario. He modificado la propiedad Name de cada control para que al utilizarlos desde el codigo sepamos cual es el control con el que trabajamos:
Los controles TextBox tienen los nombres: Num1, Num2 y Resul.
Los controles Optionbutton tienen cada uno de ellos el mismo nombre que su caption
Los controles CommandButton tienen los nombres: Calcular, Limpiar y Salir.
A los controles Label y al Frame no have falta cambiarles el nombre. Lo que habrá que hacer ahora es asociar codigo a cada uno de los botones que es de donde se van a realizar las operaciones:
Para el botón Calcular que es el que nos mostrará el resultado según la operación seleccionada, he utilizado la instrucción If Then Else que vimos en el capítulo anterior:
El botón Limpiar Datos nos va a servir para borrar de una forma rápida los datos introducidos por el usuario y el resultado preparando los controles para introducir nuevos datos. El código que tendremos que introducir es muy simple
El botón Salir únicamente contendrá la sentencia End.