Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual HPGCC Espanol
Manual HPGCC Espanol
Programando con
Este manual apunta darle al usuario una breve introduccin de programacin en la HP49G+ con HP-GCC. No se intenta ensear el lenguaje de programacin C. Si usted es nuevo en C, hay muchas tutoriales de C on-line que usted puede mirar primero. Esta gua se refiere a las caractersticas de HPGCC Versin 2.0. Por favor seleccione uno de los captulos debajo:
Introduccin:
Una introduccin bsica a la arquitectura de las modernas calculadoras HP.
Capitulo 1
Instalacin en Windows y ejecucin de Hola Mundo
Capitulo 2
Explicacin de Hola Mundo y tamaos considerados.
Pg. 1
Capitulo 3
Consola I/O
Capitulo 4
Timers, Sonidos y Grficos Simples.
Capitulo 5
Usando la Tarjeta SD
Capitulo 6
Soporte Stack RPL
Capitulo 7
Grficos en Escala de Grises con HPG
Pg. 2
INTRODUCCION
Antes de extendernos, usted debe conocer la arquitectura de las modernas calculadoras HPs. Las anteriores calculadoras graficas HP usaban un procesador personalizado conocido como 'Saturno'. Durante muchos aos, el cdigo de la calculadora se desarrollo para este chip. Desgraciadamente el Saturno era un CPU muy lento. Como Saturno slo corra a 4MHz los programadores tenan que acudir al lenguaje ensamblador para obtener mayor velocidad. Despus NEC (quin fabric el Saturno para HP) discontinu el chip. Cuando HP quiso hacer una nueva serie de calculadoras, ellos decidieron usar uno nuevo, un CPU standard. El procesador que ellos eligieron es una variante del ARM; especficamente el S3C2410X de Samsung. Este es un ARM9 de 203MHz. HP lo cronometra a 75MHz para dar ms duracin a las bateras. El cdigo existente de la calculadora fue escrito para el procesador Saturno. Reescribirlo a ARM era tremendamente caro. As que HP escribi un programa que hizo el ARM pretender ser un Saturno. Este proceso es conocido como emulacin, pero desgraciadamente crea un descenso grande de velocidad. El resultado es una 49g+ de 2 a 5 veces ms rpida que la 49g. Mientras, piense un poco sobre esto. Las 49g+, corren a 75MHz en un moderno procesador de 32 bit, slo corre un poco ms rpido que una 49g con un anticuado procesador de 4MHz. Incluso cuando usted no est muy interesado en programas rpidos, considere cunta potencia de batera est gastndose corriendo a velocidades tan altas. Usted no necesita 75MHz para hacer uno ms uno. Es aqu donde HP-GCC entra. Le permite escribir programas que corren directamente en el chip ARM.
Pg. 3
Programando
System RPL o
lenguaje Saturno assembler. Yo no entrar en el lenguaje assembler, cuando nadie lo debe tener que programar hoy (a menos que algunos quieran por supuesto!) SysRPL es un lenguaje basado en el stack. "Hola Mundo" en SysRPL podra parecer como:
::
DOCLLCD
Limpia el LCD Coloca el string "Hola mundo" en el stack Despliegue en la fila 1 de la pantalla
Pg. 4
Los programas SysRPL tienen varias ventajas. Ellos pueden ser diminutos (como el cdigo para decir DISPROW1 se guarda en ROM). Tambin se puede escribir y compilar en la propia calculadora. Hay tambin hay gran oportunidad de encontrar un comando que har lo que usted quiere exactamente. Ellos tambin tienen desventajas. Algunas personas encuentran complicado los programas basados en el Stack difciles de seguir. Generalmente no hay ningn tipo de comprobacin a la hora de compilar o ejecutar. Tambin SysRPL slo se encuentra en las calculadoras HP. Hay una gran posibilidad que usted nunca encontrar a una persona en vida real que pueda programarlo. Tampoco no puede controlar el hardware ARM directamente. Olvdese de escribir un programa que pueda usar escala de grises en puro SysRPL. Finalmente, es lento como la mayora de los comandos de SysRPL todava emulados. El proyecto HP-GCC apunta a ofrecer una alternativa ms conveniente. HP-GCC es: Un compilador C. C se usa ampliamente en la industria - por ejemplo, el Kernel de Linux es principalmente escrito en C. Como a tal hay una gran variedad de recursos en la web. Compilador para ARM assembler. El cdigo de HPGCC no se emula para que corra sumamente rpido. Las estimaciones iniciales lo pusieron para depender cien veces la velocidad de SysRPL. El programador pueden conservar la duracin de la pila y todava pueden conseguir un incremento de velocidad grande bajando la velocidad del CPU.
Poderoso. Usted puede fcilmente acceder a bajos niveles de recursos del hardware, como el controlador de escala de grises, timers, etc. Biblioteca de funciones son provistas para la manipulacin de estas cosas.
Pg. 5
Luego, ejecute el instalador con un doble clic. Usted necesitara tener privilegios de administrador para ejecutar el programa de instalacin. En caso de tener un mensaje de error, trate otra vez como administrador.. Luego usted deber tener:
Donde usted podr escoger los lenguajes Ingles/Francs /Alemn para la instalacin. Luego se muestra lo siguiente:
Pg. 6
Click en Next otra vez, luego seleccione los components que desea instalar:
Pg. 7
La instalacin completa proporciona el cdigo fuente (source code) de las libreras hpgcc, pudiendo ser usada por desarrolladores. Click en Next:
Pg. 8
Pg. 9
Por conveniencia, nosotros recomendamos agregar automticamente el PATH con el instalador, simplemente click en Finish. El mensaje final es:
Pg. 10
Ahora, usted esta listo para la primera compilacin. Usted debe tener ahora el siguiente icono en su escritorio, haga doble clic sobre l.
Pg. 11
Para compilar su primer programa, ir ha File/Open Project(s) y seleccione un archivo proyecto en c:\Program Files\arm-hp\examples/hiworld/hiworld.pnproj:
Pg. 12
Cierre la ventana de texto <New>, doble clic en el panel derecho, en hiworld.c y expanda la ventana:
Para compilar el cdigo, ir a el men Tools, y luego seleccionar Make this .hp. La ventana Output debe mostrar los siguientes mensajes:
Pg. 13
Finalmente, envelo a su calculadora con el HP software connectivity kit, o una tarjeta SD.
Para correrlo en su calculadora, usted necesita el ARMToolBox que es dado en el directorio respectivo:
Pg. 14
Instlelo enviando el archivo SETUP.BIN a su HP49g+. Para seleccionar el numero del puerto para instalar la biblioteca en su calculadora, coloque el nmero del puerto como un nmero real en el stack (por ejemplo 1: 2.0), luego ejecute SETUP.BIN.
Para finalizar ejecute su programa hiworld, coloque el correspondiente string ARM en el stack, seleccione el comando PrRUN del ARMToolBox y veras lo que pasa
Pg. 15
Hello, World!
(Hola Mundo!)
Por ahora, usted sabe como compilar y ejecutar 'hiworld.c'. Que es lo que hace este archivo? El archivo contiene el siguiente cdigo:
Ahora est el cdigo bucle hasta que la tecla ON es presionada. Sin l, el programa terminara tan rpido que usted no podra ver el texto. Como usted podr suponer
keyb_isON() devuelve TRUE si la tecla ON es presionada.
keyb_isAlpha(). Estos retornan el estado de las teclas Right Shift, Left Shift y Alpha
respectivamente. ON, Alpha y las teclas Shift son todas conectadas directamente al CPU. Las teclas restantes son conectadas a una formacin matricial. Para probar para una tecla use keyb_isKeyPressed(columna, fila). Este retorna TRUE si la tecla (columna, fila) es presionada. Desafortunadamente los nmeros fila y columna no coinciden con la posicin fsica de las teclas. Use el siguiente grafico para determinar las coordenadas para cualquier tecla.
Pg. 16
Tambin esta keyb_isAnyKeyPressed(). Esta retorna TRUE si cualquier tecla se esta presionando.
imprimir enteros, strings, y nmeros de punto flotante (floats y doubles). Una simple optimizacin es omitir el soporte del punto flotante. Si usted sabe que no necesitar imprimir floats o doubles, agregue #define TINY_PRINTF a la cabecera de su archivo.
Pg. 17
Esta versin trabaja exactamente igual que el ltimo, pero ahora mide solo 6.5kb. Nosotros podemos mejorarlo an ms.
printf() tiene que ocuparse de la impresin de los valores de diferentes tipos de datos,
pero nosotros queremos solo imprimir un string. La funcin puts() se encarga de imprimir solo strings a la consola standard. Reemplazando printf() con puts() obtenemos un archivo de casi 4.8kb.
Si el tamao es realmente un problema, nosotros podemos desviar las funciones de salida standard y escribir directamente a la pantalla. El siguiente programa mide cerca de 4.5kb.
Pg. 18
La primera diferencia es el uso de la funcin clearScreen() para limpiar la pantalla. En la versin anterior, nosotros estbamos limpiando la pantalla con clear_screen() ahora nosotros estamos usando clearScreen(). Esto es un poco confuso. Por qu se tiene 2 funciones para limpiar la pantalla?
print() es una funcin simple. No hace ningn texto estructurado. l simplemente coloca
un string a la posicin dada en la pantalla. printf es por otro lado mucho mas complicado. Tiene un cursor que guarda la huella para la prxima posicin para poner el texto
clearScreen() realmente llama una rutina en la ROM para borrar la pantalla. As que es
bastante diminuto. clear_screen() por otro lado limpia la pantalla y restablece el cursor arriba a la izquierda de la pantalla. Esto es un poco ms grande. Una regla a manejar si usted esta usando funciones standard de salida en C, como son puts o printf, es usar
clear_screen(). Caso contrario use clearScreen(). Si a usted no le importa el tamao,
entonces simplemente use siempre clear_screen(). Note que ambos clearScreen() y clear_screen() solo trabajan si usted no esta usando una librera grfica. Luego nosotros tenemos print(). Este toma el string, y los parmetros X y Y. Note que los ejes X y Y es como sigue:
Este cdigo demuestra el uso de funciones para leer enteros y string desde el teclado, y usando printf para desplegarlos. gets() lee un string desde el teclado en la memoria.
readint(), lee un entero con su signo (+/-).
son:
Traducido al Espaol por Oscar Fuentes F. Pg. 20
de C, como print(), pero usted no puede especificar directamente donde escribir el string.
home() Devuelve el cursor a la esquina superior izquierda. gotoxy(int x, int y) Mueve el cursor a la posicin X, Y.
Como otro ejemplo, aqu un simple juego adivinaza. El programa escoge un nmero entre cero y cien, y usted tiene que adivinarlo. El programa le dir si su suposicin es demasiado alta, o demasiado baja.
Pg. 21
La nica nueva funcionalidad aqu es el uso del generador del nmero aleatorio. srand() se usa para instalar el generador de nmero aleatorio. Debe darse que un nmero que es diferente cada vez que el programa es ejecutado. Esto se hace alimentndole el valor actual de un cronmetro. Despus de eso, rand() dar un nmero aleatorio.
Pg. 22
ocurrido desde la ultima vez que fue llamado. Por defecto (en ROM 1.23), la frecuencia del Tick es 8 Hertz. La frecuencia del Tick puede programarse usando:
unsigned char sys_setRTCTickPeriod(unsigned char n)
Esta funcin toma un nmero, n. Esta funcin fija el periodo RTC tick a (n+1)/128 segundos. n debe estar entre 1 y 127. Esta funcin devuelve el viejo valor de n, es muy recomendado que si usted usa esta funcin, usted restaure el periodo del Tick a la anterior frecuencia al final de su funcin. Luego, tenemos:
void sys_waitRTCTicks(int count)
Esta funcin simplemente espera por 'count' ticks para pasar a la frecuencia por defecto de 8Hz, sys_waitRTCTick(8) espera aproximadamente por 1 segundo. Incrementando la frecuencia del RTC Tick mejorando la exactitud del delay. El Real Time Clock solo proporciona una salida entre 1Hz y 128Hz. Para cronometrar rpidamente usted debe usar un timer de hardware especializado.
Pg. 23
Hardware Timers
Nota: El soporte de Hardware Timer es actualmente experimental, y no es muy exacto. Esta documentacin espera ser revisada.
El hardware timers ofrece cronometrados muy rpidos. Desafortunadamente esto vara con la velocidad del CPU. Antes de usar un hardware timer, usted debe llamar a:
void sys_setupTimers()
Este fija el timers a un estado conocido actualizndolo a 750kHz por defecto. Si usted usa esta funcin, usted debe llamar a void sys_restoreTimers() al final de su programa. Este restaura el timers a valores predeterminados del sistema. Si usted cambia la velocidad del CPU (si usted no sabe cual es entonces no la cambie) los timers sern incorrectos.
Esto retrasa los ticks para 'time'. En modo lento, los ticks deben ocurrir cada 750kHz.
sys_waitTicks(750000) debe tardar alrededor de un segundo.
Sonido
El buzzer interno es bastante fcil de manipular. Es conectado a un propsito general I/O pin, pin B2. Alternando estos pin produciremos sonidos.
void sys_playTone(unsigned int tono, unsigned int duracin)
se proporciona para hacer sonidos simples. Esta funcin confa en el Hardware timers, con
sys_setupTimers() lo llama para usarlo.
Bsicamente, 'tono' es una frecuencia en Hertz y 'duracin' es un tiempo en centsimas de segundo. Un 'fudge factor' a sido aplicado para corregir la inexactitud de la cronometracin del sistema. Los resultados no son sper exactos, pero son bastantemente buenos para efectos de sonido.
Nota: unsigned significa sin signo, unsigned int tono significara que debemos ingresar tono en forma de entero sin signo, nunca deberemos colocar un nmero con su respectivo signo (+500 -500 es incorrecto; 500 es lo correcto).
Traducido al Espaol por Oscar Fuentes F. Pg. 24
Limpia la pantalla.
void invertScreen();
Una funcin simple de pantalla este invierte los colores del LCD (es decir negro se hace blanco, blanco se hace negro). Esto slo se invertir por un ciclo de poder llamando
invertScreen() otra vez no devolver la pantalla normal. Esto es una ayuda til de
depuracin.
void LCDSynch();
Esta rutina espera, y solo retorna cuando el LCD ah finalizando redibujando la pantalla. Es til para prevenir una cada durante la manipulacin de la pantalla directamente. No til para programas simples, solo juegos o animaciones.
void drawBlockOR(unsigned char* sprite, int longitud, int x, int y); void drawBlockXOR (unsigned char* sprite, int longitud, int x, int y);
Este se usa para dibujar un byte de ancho, grfico de longitud variable a la pantalla. Estos realmente difieren solo cuando dibujamos sobre un objeto existente. OR hace un pixel's negro, XOR los invierte. Sprite contiene los datos para dibujar, la longitud es ahora varios bytes haciendo a ese sprite, y X/Y es la posicin superior izquierda para dibujar.
void fillTiles(unsigned char* sprite, int longitud, int x, int y, int derecha, int abajo); fillTiles es usado para sombrear un rea con el mismo sprite, embaldosando una y otra
vez. El uso es igual como para drawBlockxx, pero con 'right' tiles para el right y 'down' tiles que se extiende hacia abajo de la posicin inicial.
Pg. 25
Aqu un ejemplo simple. Este dibuje un bloque en la pantalla que usted puede mover con las teclas direccionales. Presione ON para salir.
Por defecto, el grfico es un bloque slido. Pero alterando los valores de b[], usted puede cambiar la apariencia del sprite.
Pg. 26
La Tarjeta SD
Esta seccin solo se aplica a la HP49g+. No trate de usar estas funciones en una 48gii o 39g+. HPGCC provee una interfaz a la tarjeta SD. Se proveen las siguientes funciones:
fopen(),fclose(),fread(),fwrite(),fputc(),fputs(),fgetc(),fgets(),fdelete()
Estas funciones son similares a los standards. El siguiente ejemplo crear un archivo "testme.txt en el directorio raz de la tarjeta SD. Escribir "Probando 1, 2, 3" en l.
Pg. 27
Los archivos pueden ser abiertos con los modos Read ('r'), Write ('w') o Append('a). Las subcarpetas pueden manipularse con el carcter '/'. EG, para abrir archivo 'bob' en carpeta 'joe', open "joe/bob". Para crear una nueva carpeta, trate de ejecutar fopen en el nombre de la carpeta.
fopen("new/", "w");
Crear una nueva carpeta, llamada new. En la actualidad es poco conocido sobre la funcionalidad de la tarjeta SD. Esto es manejado por el OS de la HP y nosotros no tenemos mucha documentacin sobre l.
Pg. 28
El modulo 'Saturn' incluido con HP-GCC maneja el stack RPL. Le permite empujar y estallar (push & pop) varios tipos de objetos, y hace la manipulacin bsica del snack.
Lo primero que se debe conocer es que hay un par de funciones que deben usarse antes de acceder al stack. Antes de hacer cualquier operacin con el stack, usted debe llamar a
sat_stack_init().
al final de su programa. Usted no debe olvidar esto, estas funciones son necesarias para prevenir posibles prdidas cadas de memoria.
Otra cosa para conocer es que si usted va empujar objetos grandes al stack usted necesitara preparar su programa HP-GCC para reservar mas espacio para estos objetos.
Por defecto, 10kb son reservados para empujar los objetos hacia el stack. Usted puede editar hpgcc.bat para incrementar este nmero. Cambie la lnea:
set hpgcc_rplstacksize=10000
para un nmero superior para reservar mas memoria si es necesario. Con tal que exista memoria suficiente que garantice poder empujar cinco objetos en el stack. Usted puede revisar hpgcc.bat para aumentar este lmite, a expensas de un mayor uso de memoria. Como un ejemplo muy simple, considere un programa que empuja el string "Hola mundo!" al stack
Pg. 29
Usted puede ver el uso obligatorio de sat_stack_init y sat_stack_exit. Ademas, las funciones sat_stack_push_string() empujan un string al stack.
Aqu otro ejemplo. Este toma un entero exacto (conocido como un ZINT en trminos HP) del stack, lo duplica, y coloca el resultado como un ZINT. Nota: Si usted tiene en el stack 10, despus de ejecutar el programa usted obtendr 20, si usted no tiene nada o un nmero con decimales, usted obtendr 0.
sat_pop_zint_llong()
como un LONGLONG. Un LONGLONG es un signed 64 bit tipo entero, puede soportar nmeros entre +/- 1.8*10^19. Intentar colocar ZINTs fuera de este rango dar un resultado malo.
sat_push_zint_llong()
Note que este programa no hace una comprobacin de errores. Que pasa si el usuario tenia el stack RPL vaci? Qu pasa si el primer item en stack es un string, y no un ZINT? Aqu un programa que lo demuestra haciendo estallar 2 ZINTs fuera del stack, agregando y empujando el resultado...mientras se asegura que hay 2 ZINTs.
Pg. 30
Primero, usted debe verificar cuantos items hay en el stack. Si hay menos de 2, entonces fallar. sat_stack_depth() puede usarse para verificar esto. Note el uso de un GOTO (naughty!) para saltar a un cdigo de limpieza.
Traducido al Espaol por Oscar Fuentes F. Pg. 31
Luego, usted debe verificar el tipo de los 2 objetos. El mdulo Saturn provee para examinar objetos o elementos desde el stack. Primero declare los 2 objetos para hacerlos estallar con
SAT_STACK_ELEMENTS's.
obtener los datos del elemento fuera del stack. Este acepta un pointer para el elemento del stack, y examinar el nivel del stack. Esta funcin no hace estallar los elementos fuera del stack! Este simplemente nos permite recuperar informacin sobre los elementos, no los propios elementos.
Pg. 32
Numerosas bibliotecas son incluidas con HP-GCC. HPG es un API de Grficos y Escala de grises de propsito general. Incluye muchos ejemplos y documentacin en otra parte as que sta ser apenas una gira breve. El modo ms verstil de HPG es doble buffered, 16 escala de grises. Esto da 16 niveles de grises con el mnimo parpadeo/cada. Comenzaremos con un programa que despliega texto en varios niveles de gris.
Esto es bastante simple. Cuando esta usando HPG debe usar #include <hpgraphics.h>.
Pg. 33
hpg_set_mode_gray16(1)
obviamente mide que hay 16 sombras de gris para escoger. Doble buffering es una tcnica para reducir el parpadeo. Con el modo doble buffered, cualquier cambio a la pantalla solo tiene lugar despus de llamar a hpg_flip(). Este recurso que su pantalla entera es trazado enseguida. Sin el doble buffering el usuario puede ver el parpadeo como los objetos son estirados separadamente.
hpg_clear()
' hpg_set_color(hpg_stdscreen, HPG_COLOR_XXX);' es usado para cambiar el color actual. Adems HPG_COLOR_BLACK, HPG_COLOR_GRAY_1 (muy claro) a GRAY_15 (muy oscuro).
hpg_draw_text()
seleccionado. Aqu esta otro ejemplo que dibuja algn texto y formas en la pantalla. Vea la documentacin de referencia de HPG para una explicacin de cada funcin.
Pg. 34