Tuesday, November 4, 2014

El ultimo registro de TED

Ahora sé, cuando fué que se dañó mi modulo MTU de TED (The Energy Detective)


Links de interés:
http://scanlime.org/2008/09/measuring-energy-usage/
http://scanlime.org/2008/10/interfacing-with-the-energy-detective/
http://scanlime.org/2009/02/open-source-extra-sensitive-high-resolution-ted-receiver/

(a TED le sobreviven: El gateway y el display)

El reemplazo cuesta 44 Dlls, de modo que...lo dejamos para despues.


Sunday, November 2, 2014

Optimizar subrutinas con codigo comun

Observe el siguiente ejemplo:

Se trata de 2 subrutinas: "lcd_cmd" y "lcd_dat"

  • Del lado derecho esta el "ANTES", a la izquierda el "DESPUES"

  • Las dos rutinas son iguales entre las lineas 71-81 y 87-97 en el "ANTES"
  • Lo que se hizo es compartir esas secciones que son iguales y que la entrada por "lcd_cmd" se salte la parte diferente de "lcd_dat" (ve la etiqueta de dirección "codCom")
  • Observe que en el despues, hay una sola "salida" (comando "return")
  • El resultado es tener ~10 lineas menos de código y el consiguiente ahorro en memoria de programa, un recurso que en ocasiones es limitado y por lo tanto, muy apreciado.


Thursday, October 30, 2014

El misterio del comando SLEEP

Por alguna razón, el "sleep" ocasiona algo en el estado del microcontrolador, que hace que el programa ya no funcione al darle un "reset" al sistema.

  • Al final del programa (en lugar del SLEEP)dejé ciclado al micro, parpadeando RA6
  • RA1 parpadea con cada comando enviado al LCD
  • RA2 parpadea con cada dato enviado al LCD
  • Esas pausas adicionales creo hacen mas evidente la ejecucion del programa
  • Hay un error en el parametro de configuracion BOREN (yo puse BODEN ayer)

;
; LCD del picsim
;
; ZONA DE DATOS **********************************************************************

LIST P=16F628A
INCLUDE
__CONFIG   _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF & _LVP_OFF

CBLOCK 0x20
ctr
val
ENDC

; ZONA DE CÓDIGOS ********************************************************************
BANCO0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
PUERTOS MACRO
BANCO1
CLRF VRCON
MOVLW H'30'
MOVWF TRISA
MOVLW H'E7'
MOVWF TRISB
BANCO0
MOVLW 7
MOVWF CMCON
CLRF PORTA
CLRF PORTB
ENDM

ORG 0
PUERTOS
call lcd_init

movlw H'4A'
movwf val
call lcd_dat
movlw H'4F'
movwf val
call lcd_dat
movlw H'52'
movwf val
call lcd_dat
movlw H'47'
movwf val
call lcd_dat
movlw H'45'
movwf val
call lcd_dat
fin
bsf PORTA,6
call Retardo_500ms
bcf PORTA,6
call Retardo_500ms
goto fin
; Inicializacion de LCD
lcd_init
bcf PORTA,0
bcf PORTB,3
call Retardo_20ms
bsf PORTA,0 ;
;
movlw H'30'
movwf val
call lcd_cmd
call Retardo_5ms
;
movlw H'30'
movwf val
call lcd_cmd
call Retardo_1ms
;
movlw H'38'
movwf val
call lcd_cmd
;
movlw H'08'
movwf val
call lcd_cmd
;
movlw H'0F'
movwf val
call lcd_cmd
;
movlw H'01'
movwf val
call lcd_cmd
;
movlw H'38'
movwf val
call lcd_cmd
;
movlw H'80'
movwf val
call lcd_cmd
 
return

; envia comando
lcd_cmd
bsf PORTA,0 ;
call lcd_wr ;
bcf PORTB,3
call Retardo_2ms
call Retardo_1ms
bcf PORTA,0
call Retardo_2ms
call Retardo_1ms
bsf PORTA,0
bsf PORTA,1
call Retardo_500ms
bcf PORTA,1
call Retardo_500ms
return
; envia dato
lcd_dat
bsf PORTA,0 ;
call lcd_wr ;
bsf PORTB,3
call Retardo_2ms
call Retardo_1ms
bcf PORTA,0
call Retardo_2ms
call Retardo_1ms
bsf PORTA,0
bsf PORTA,2
call Retardo_500ms
bcf PORTA,2
call Retardo_500ms
return
; escribe al LCD
lcd_wr
bcf PORTB,4
movlw d'8'
movwf ctr ;
again
btfsc val,7
goto envia1
bcf PORTB,3
goto rota
envia1
bsf PORTB,3
rota
rlf val,F
bsf PORTB,4
bcf PORTB,4
decfsz ctr,F ;
goto again
return

;
INCLUDE  
END

Wednesday, October 29, 2014

Ejemplo en PicSimLab

Escribiendo caracteres al LCD del picsim:



Al programa aun le falta compactar, o sea, poner ciclos donde hay codigo duplicado, etc.
El programa funciona y puede ser un buen punto de partida para explicar algunos conceptos.

En ensamblador:
; LCD del picsim
;
; ZONA DE DATOS **********************************************************************

LIST P=16F628A
INCLUDE
__CONFIG   _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF

CBLOCK 0x20
ctr
val
ENDC

; ZONA DE CÓDIGOS ********************************************************************
BANCO0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
PUERTOS MACRO
BANCO1
CLRF VRCON
MOVLW H'1E'
MOVWF TRISA
CLRF TRISB
BANCO0
MOVLW 7
MOVWF CMCON
BCF PORTA,0
CLRF PORTB
ENDM

ORG 0
PUERTOS
call lcd_init
movlw H'4A'
movwf val
call lcd_dat
movlw H'4F'
movwf val
call lcd_dat
movlw H'52'
movwf val
call lcd_dat
movlw H'47'
movwf val
call lcd_dat
movlw H'45'
movwf val
call lcd_dat
sleep
lcd_init
bcf PORTA,0
bsf PORTB,3
call Retardo_20ms
bsf PORTA,0 ;
;
movlw H'30'
movwf val
call lcd_cmd
call Retardo_5ms
;
movlw H'30'
movwf val
call lcd_cmd
call Retardo_1ms
;
movlw H'38'
movwf val
call lcd_cmd
;
movlw H'08'
movwf val
call lcd_cmd
;
movlw H'0F'
movwf val
call lcd_cmd
;
movlw H'01'
movwf val
call lcd_cmd
;
movlw H'38'
movwf val
call lcd_cmd
return

; envia comando
lcd_cmd
bsf PORTA,0 ;
call lcd_wr ;
bcf PORTB,3
call Retardo_2ms
call Retardo_1ms
bcf PORTA,0
call Retardo_2ms
call Retardo_1ms
bsf PORTA,0
return
; envia dato
lcd_dat
bsf PORTA,0 ;
call lcd_wr ;
bsf PORTB,3
call Retardo_2ms
call Retardo_1ms
bcf PORTA,0
call Retardo_2ms
call Retardo_1ms
bsf PORTA,0
return
; escribe al LCD
lcd_wr
bcf PORTB,4
movlw d'8'
movwf ctr ;
again
btfsc val,7
goto envia1
bcf PORTB,3
goto rota
envia1
bsf PORTB,3
rota
rlf val
bsf PORTB,4
bcf PORTB,4
decfsz ctr,F ;
goto again
return

;
INCLUDE  
END

Friday, October 24, 2014

LCD 16x1 o 8x2 ???

A continuación se muestra (lado a lado), la modificación que tuve que hacerle al ejemplo de uso de puerto serie y display LCD 16x1 debido a la particularidad de éste, de tratar la única linea de 16 caracteres, como si fueran 2 lineas con 8 caracteres cada una.

El programa original, hecho para un display de 16x2, se comporta mostrando solo 8 caracteres, el noveno ya no se muestra...


Tuesday, May 20, 2014

sesion interactiva: tablelist

Empecemos con checar cuantos "hijos" tiene la ventana principal, llamada "."
% winfo children
wrong # args: should be "winfo children window"
Me falló porque faltó un parámetro

% winfo children .
No me regresa nada, es que aun no le pongo controles a esta ventana


% proc tl {} {};edit tl
Edito (en otra ventana) un proc que crea una tablelist accesible con la variable "tbl"

proc tl {} {
global tbl
set tbl .tbl
tablelist::tablelist $tbl\
  -columns {0 "A" 0 "B" 0 "C" 0 "D" 0 "E"} -height 15 -width 100
pack $tbl
}

Creo un botón
% button .btn -text rengSel?
.btn
% pack button
wrong # args: should be "pack option arg ?arg ...?"
Me fallo' porque no hay botón llamado "button" (se llama .btn)

% pack .btn
Ahora si aparece botón en la ventana

% tl
invalid command name "tablelist::tablelist"
Falla porque no puse la "incorporación" de la librería en el proc...

Ahora si lo hago...
% package require tablelist
5.7

% tl
Ahora si aparece la tabla en la ventana (pero tuve que hacer un "resize" manual)

Le hago ediciones para que se le inserten renglones a partir de la lista de "hijos" de "."
% edit tl

Cuales son los "hijos" de "." ?
% winfo children .
.btn .__helpLabel .tbl .tbl-corner

Le inserto los hijos
% $tbl insert end [winfo children .]
k0
Pero me aparecen en un solo renglón...eso no es lo que quería...

"." tiene 4 hijos...
% llength [winfo children .]
4

Veamos esos 4 "hijos"
% foreach ctrl [winfo children .] {
puts $ctrl
}
.btn
.__helpLabel
.tbl
.tbl-corner

Quiero borrar el renglón...
% $tbl delete all
bad row index "all": must be active, anchor, end, top, bottom, @x,y, a number, a full key, or a name
Falla porque "all" no es un indice válido

% $tbl delete 0 end
Ahora si se borró

Le inserto un renglón por cada "hijo"
% foreach ctrl [winfo children .] {
$tbl insert $ctrl
}
bad row index ".btn": must be active, anchor, end, top, bottom, @x,y, a number, a full key, or a name
Falla porque me faltó poner donde insertar

Ahora si...
% foreach ctrl [winfo children .] {
$tbl insert end $ctrl
}

Al tener seleccionado el primer renglón, el comando "curselection" indica cual es la selección actual:
(numeración empieza en cero)
% $tbl curselection
0


Al tener seleccionado el renglón 2:
% $tbl curselection
1

Al tener seleccionado el renglón 3:
% $tbl curselection
2

Al tener seleccionado el renglón 4:
% $tbl curselection
3

Para obtener el valor de una de las celdas:
% $tbl cellcget 1,1 -text
No devuelve nada porque no hay nada en segunda columna, (recuerde, numeración empieza en cero)

Ah, entonces es así:
% $tbl cellcget 1,0 -text
.__helpLabel

Para obtener el valor en celda de:
renglón   =  la selección actual
columna  = 0 (numeración empieza en cero)
y estando seleccionado el renglon cuyo contenido de texto es "tbl-corner"
% $tbl cellcget [$tbl curselection],0 -text
.tbl-corner

Asignarle una acción a botón existente
% .btn configure -command {puts [$tbl cellcget [$tbl curselection],0 -text]}

Al hacer click en el botón...
.tbl-corner



Luego selecciono el tercer renglón en la tabla...y hacer click en botón
.tbl
(ya que ese es el contenido de esa celda)

Monday, May 19, 2014

editando con tkcon

 La instalación de ActiveTcl viene con una consola mejorada (tkcon), la cual, por ejemplo, te puede servir para editar de mejor manera cuando estés trabajando de manera interactiva:



En el "pantallazo", puedes ver como se crea un nuevo proc, para ser editado de inmediato, con el comando edit.
El comando "edit" te permite editar ese proc en ventana nueva y desde la cual puedes:
a) salvar ese proc en un archivo nuevo (menú "File" >>> "Save As...")
b) agregarlo a un archivo existente (menú "File" >>> "Append To...")
c) y/o enviarlo a la consola en la que estas trabajando (menú "Send To..." y seleccionando la opcion "Send To slave", que de hecho es la única opción que viene bajo ese menú)


si cierras la ventana de edición, puedes re-editar ese proc, tecleando:
edit sampleProc

Por cierto, la opción "Append To", te pregunta si deseas sobre-escribir el archivo, lo cual puede crear alguna confusión ya que realmente no lo sobre-escribe, solo lo agrega, tal como lo indica la opción seleccionada.

te invito a usar esta prestación de tkcon como herramienta de desarrollo!

Tuesday, May 13, 2014

jugando a multiplicar

El ejemplo de hoy es excelente para confirmar el porque Tcl/Tk es:
"El poder de lo simple!"



Script: A little multiplication toy



Este script tiene únicamente 2 procedimientos ("main" y "recompute") y tiene como característica interesante el hecho de que no hay que presionar algún botón para calcular el total de la multiplicación de los 2 números que se hayan capturado, sino que se va calculando automáticamente según se vayan "entrando" los factores.

* Vea como es que ".*" y ".=" son nombres validos para controles en la ventana principal.
* las cajas de captura (entry) están asociadas a las variables a y b
* el comando "trace variable" es el que hace posible que, un procedimiento sea ejecutado cada vez que se escribe (w = write) en dicha variable.
* el procedimiento en cuestión es "recompute" el cual simplemente calcula el valor de c como el resultado de la multiplicación. Esto ocurre en cada cambio que se hace en las cajas de texto/captura.
* se hace un manejo de errores con catch por si uno de los factores es aun inexistente o se le introduce algo que produce un error
* Para finalizar, y a manera de "bonus", se recomienda apreciar la técnica de hacer un pack de todos los "hijos" de ".", a través de los comandos "eval" y "winfo children"

hasta el próximo "post" !

Sunday, May 11, 2014

Eventos en el canvas

Hoy, continuaré comentando el código de "i-Map and indexed map viewer", en esta ocasión enfocado en como asociar acciones en respuesta a eventos ocurridos.
El comando usado para esta tarea es:

bind

Veamos el siguiente código:



Subrayado en rojo:
la opción -modifycmd del control ComboBox se usa para definir que procedimiento ejecutar cuanto el valor seleccionado cambie, es decir, cuando el usuario haga una nueva selección.

La sección marcada con azul, muestra como asociar el desplazamiento de la vista del canvas en respuesta a que las teclas arriba,abajo,izquierda y derecha (Up,Down,Left,Right) sean presionadas.

También se muestra, resaltado en amarillo, como asociar un click sobre el canvas con el cambio de texto en el titulo de la aplicación, en base a las coordenadas x,y de la posición del mouse al momento del click.

Acerca de esta otra sección de código:



Ya que se hizo este programa para poder ser ejecutado en una PocketPC (tomar en cuenta que este código se publicó en 2003!), se hicieron asociaciones para que los triángulos dibujados en el canvas, apuntando en cuatro direcciones, generaran eventos como si fueran las teclas arriba,abajo,izquierda y derecha.

Subrayado en azul, se resalta la sección que, uno a uno, define la generación de eventos ante un click en esos triángulos, durante su creación, los identificadores únicos se han asignado a variables cuyo nombre nos recuerda la dirección a la que apuntan.

hasta el próximo script!

Saturday, May 10, 2014

Resaltando lugares en mapas

En esta ocasión voy a comentar el código "iMap: an indexed map viewer", el cual puede verse completo en:
http://wiki.tcl.tk/8771

Este ejemplo, toma un mapa (archivo gif el cual debe ser previamente descargado de http://www.bioenergywiki.net/images/thumb/7/71/Uk-map.gif/300px-Uk-map.gif)

Desde luego, el archivo debe ser renombrado a UK_Map.gif para que no falle así:



Pues bien, el funcionamientos de este programa es como sigue:
* Al seleccionar algún lugar en el "combo box", la región de interés es desplazada al área visible y un cuadro rojo aparece y desaparece resaltando el punto exacto.

* Hay cuatro triángulos apuntando a los cuatro puntos cardinales a los cuales se les puede hacer click para mover la vista del mapa en esa dirección.

* Adicionalmente, si se hace click en algún punto del mapa, la ubicación x,y de dicho punto se muestra en la barra de titulo de la aplicación.



Comentando el código:
1) Marcado en amarillo, vea como se toman los datos x,y del arreglo "data", el cual fue previamente cargado con el proc "index:"
2) Subrayado en azul, se toma solo el segundo para de coordenadas de la región completa del mapa (se recomienda estudiar el comando bbox del canvas) y junto con las coordenadas del punto de interés, se mueve (xview/yview moveto) la "vista" del canvas a la región que resulte de los cálculos.
3) El efecto de "flash" del cuadro rojo, se logra con el almacenamiento del identificador único de dicho cuadro, en la variable "id" (subrayada en rojo) para que, a través de ese "id", la propiedad "width" de las lineas que lo forman,pueda ser alternada en 5 y 0, lo cual hace el efecto de desaparacer tras 300,600 y 900 milisegundos.

En la siguiente publicación, seguiré comentando otra sección de este mismo código que puede resultar de interés para el principiante.

Thursday, May 8, 2014

checkbuttons

En esta ocasión, veremos como usar las opciones que hayan sido seleccionadas en los llamados checkbuttons.
Tomaremos de ejemplo el script "A symmetric doodler", creado por Richard Suchenwirth y disponible en http://wiki.tcl.tk/2859

El estudio de la sección de interés sera apoyada por el siguiente diagrama:



1) El comando bind define cual procedimiento será ejecutado cuando el evento click (el cual se escribe como <1>), suceda en la ventana $w, la cual, en este caso, le es asignado el canvas:
symdoodle [canvas .c -height $size -width $size -bg $bg]

2) Antes de hacer los trazos en el canvas, se corre el proc "readCheckbuttons"

3) El proc "readCheckbuttons" hace uso de la técnica de usar una sola variable (un arreglo) para los valores globales, en este caso:
g(hori)
g(vert)
afectan el flujo de ejecución, lo cual es lo esperado.

4) Los indices "hori" y "vert" de la variable "g", fueron previamente asociados a los checkbuttons e inicializados como "verdadero" o "opción activada"

Hay mucho mas que aprender de este ejemplo, te invito a estudiar como es que lo demás funciona.

Tuesday, May 6, 2014

Carrera de caballos (o etiquetas en el canvas)

He estado pensando en proveer pequeñas dosis de Tcl a través de ejemplos.
Es decir, crear ejemplos cortos que ilustren un concepto básico. Pero, porque no usar los excelentes ejemplos ya creados en el wiki de Tcl?
Ahora bien, que valor agregado puede tener el re-uso de ejemplos ya disponibles en otro sitio?
Creo que la respuesta a eso es:
- Mi explicación está en español
- Me enfocaré en algún concepto especifico que pueda servir al principiante
- Daré mi propia versión acerca de como es que funciona alguna sección del código existente y/o algún tip al respecto.

Veamos si esta idea puede servirle a alguien...

Tema: Etiquetas (tags) en el canvas
Ejemplo de referencia: "Horseracing in Tcl"
(solo se muestra aqui un proc)



* El proc horse "arma" (equino y jockey) para cada uno de los 10 caballos en la variable "horses"
* En amarillo, observe como se asocian varias lineas y óvalos a través de una etiqueta (tag), como un solo elemento, llamado:
horse0, horse1...horse9
* Subrayado en rojo, cada caballo, una vez creado, se va posicionando en coordenadas:
x (fija en 70)
y (cambiando) en incrementos de 30 + un "offset" de 14
* Subrayado en azul, es también interesante ver como se toman colores al azar, a partir de diferentes "sets" usando el procedimiento 'lpick'
* Y, para finalizar (por hoy), véase la creación de "cajas de captura" (entry) en el canvas, usando la siguiente linea de comando:

Listo para programar?
arrancan!


Monday, May 5, 2014

BLT 101

BLT es una extension para Tk, el cual agrega la capacidad de realizar varios tipos de gráficas, "geometry managers" -no sé como traducir esto ultimo, y otros comandos de utilidad:
http://incrtcl.sourceforge.net/blt/

Como les habia comentado en una publicación anterior, la versión de Tcl que tengo instalada es:
(ActiveState ActiveTcl 8.4.20.0) 1 %

No tengo instalado BLT en este momento:
% package require BLT
can't find package BLT

Pero tengo RBC, lo cual significa (Refactored BLT Components).
Veamos si funciona el ejemplo mínimo:

% package require rbc
0.1
% rbc::barchart .g -title "a chart example"
.g

% pack .g

Hasta ahorita, se ve así:



Crear una serie de datos:
% .g element create BT1 -xdata {1 2 3 4 5 6 7 8}\
-ydata {.76 .98 .88 .92 .96 .98 .91 .80}\
-label "Series 1" -showvalues y
BT1

Otra serie mas:
% .g element create BT2 -xdata {1 2 3 4 5 6 7 8}\
-ydata {.1 .2 .3 .4 .5 .6 .7 .8}\
-label "Series 2" -showvalues y -foreground red
BT2

Por alguna razón no veo la segunda serie de datos...
Checando bien la documentación, veo que debo configurar la gráfica de este modo:
% .g configure -barmode aligned

Ahora si:


Como en el caso del canvas, este ejemplo de BLT es el mínimo, te recomiendo la pagina del Tcl wiki:
El cual es un buen punto de partida para explorar las muchas otras prestaciones de este librería (o extensión)

Muy pronto, publicaré algunos otros ejemplos con BLT, ya que es una de mis extensiones favoritas y que me ha resultado muy útil.

Hasta la próxima!