Monday, December 17, 2018

Ejemplo de la operacion "element closest" en BLT

Fuente: https://www.tek-tips.com/viewthread.cfm?qid=503800
Adaptado para RBC.

package require rbc

rbc::vector create x(20)
rbc::vector create y(20)

x seq 1 20
y random

rbc::graph .g
pack .g -expand yes -fill both

.g element create data -xdata x -ydata y

toplevel .report -bg black
label .report.info -textvariable status -justify left -bg yellow
pack .report.info -padx 2 -pady 2

wm withdraw .report
wm overrideredirect .report 1

.g element bind data {
    if {[.g element closest %x %y click]} {
        set status "Clicked on \"$click(name)\" element\n"
        append status "Data point $click(index)\n"
        append status "x value: $click(x), y value $click(y)"
       
        wm geometry .report +%X+%Y
        wm deiconify .report
    }
}

.g element bind data {
    wm withdraw .report
}

Sunday, November 25, 2018

Galeria de Fotos

Instale' apache.

El contenido lo prepare' con 2 programas:
  1. https://wiki.tcl-lang.org/page/PhotoAlbum+-A+Web+Gallery+Creation+Tool
  2. https://wiki.tcl-lang.org/page/MajaMaja
Tuve 3 problemas:
1) MajaMaja no queria correr ya que se quejaba de la version de Itcl.
>>> Solo tuve que quitar la restriccion de version en el script.

2) Las Imagenes aparecen bien si abro el archivo index.html sin que intervenga el web server, pero aparecen "rotas" si las trato de accesar desde el navegador a traves de apache.
>>> Tuve que borrar "file:" del script, en la parte del atributo "src" de las imagenes.

3) Las Imagenes aparecen rotadas, aunque segun yo, las corrija con el editor de imagenes de MS.
>>> Tuve que editarlas con ImageMagick, el cual si las corrige realmente.

y listo !



Thursday, April 5, 2018

Sample Post

Title:

color code


馃槉


Martes 5 Abril 2018

Sunday, December 6, 2015

Modulo I2C para LCD y el PICkit Serial Analyzer

El diagrama del modulo "backpack":
                                     +
         1   2  3                    |
         +   +  +                    |
         |   |  |            +-------+-------+
         |   |  |            |       2       |
       +-+---+--+---+        |               |
     16| A0 A1 A2   |        |               |
+-------+V        P0+--------+4 RS          3+-----+
       |            |        |               |
       |          P1+--------+5 RW           |
     15|            |        |               |
+------+SDA       P2+--------+6 EN           |
       |            |        |               |
       | PCF8574  P3|        |    LCD        |
     14|            |        |               |
+------+SCL         |     DB4|               |
       |          P4+--------+11             |
       |            |     DB5|               |
     13|          P5+--------+12             |
+------+INT         |     DB6|               |
       |          P6+--------+13             |
       |            |     DB7|               |
       |          P7+--------+14             |
       |            |     DB3|               |
       |  8         |     +--+10             |
       +--+---------+     DB2|               |
          |               +--+9              |
          v               DB1|               |
                          +--+8              |
                          DB0|               |
                          +--+7      1       |
                             +-------+-------+
                                     |
                                     v

La interconexion entre el LCD y el PICkit serial analyzer:



La secuencia de inicializacion del LCD para 4 bits:

Escribir una "A" en el display:

Informacion de referencia:

La clave:
En mi caso, el ajuste del contraste me jugo' una mala pasada pues llegue' a pensar que estaba haciendo algo mal con la inicializacion a 4 bits, cuando, en realidad, solo faltaba ajustar el control de contraste en el modulo "backpack"

.

Saturday, August 29, 2015

command line screencast

mkcast
https://github.com/KeyboardFire/mkcast

doitlive
http://www.linux-magazine.com/Online/Blogs/Productivity-Sauce/Run-Live-Presentations-in-Terminal-with-doitlive

El primero, graba la interaccion en la consola como un gif agregando una vista con caracteres grandes en la parte baja de la pantalla para mejorar la visibilidad de lo que se teclea.

El segundo, permite grabar una serie de comandos, para luego ser reproducidos al ritmo de teclear lo que sea, a la hora de la presentacion, lo que te hara' parecer un as del teclado.

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!