Tengo, en mi computadora, un disco con Linux, que uso para casi todo lo que hago en ella, desde llevar una contabilidad con GNU-CASH, escuchar música, entrar a la la web con Firefox, programar en Netbeans, ver videos con VLC y todo lo que pueda hacer que no necesite Windows, sobre todo porque simplemente funciona mejor y hay programas gratis muy buenos!.
Además, la pc tiene también un disco con Windows 7, nonsanto (por decirlo así), que uso principalmente (únicamente) para jugar algunos juegos de steam (al momento de escribir este post, Farcry 4 me quita horas!)
Problema
Para gestionar el arranque de uno u otro sistema operativo, estaba usando el método de selección desde el BIOS, pero me dejaba intranquilo el que el sistema operativo seleccionado (windows por ejemplo) tenía "visibilidad" del/los otro/s disco/s, permitiendo por ejemplo formatear la instalación de Linux, y viceversa, Linux tenía acceso de escritura (peor!) al disco de Windows, lo que si me encontraba un día medio dormido podía hacer que dañe su instalación.
Otro problema relacionado a esto es que si, digamos, reinstalaba Windows, el disco de instalación tendría visibilidad del disco de Linux, pudiendo (y de hecho lo hizo) arruinar el arranque del mismo. Lo mismo al instalar Linux. La solución que ya muchos conocerán es, desconectar los discos no usados durante la instalación.
Incluso durante las actualizaciones de versiones de linux o al pasar de Windows 7 a 8, por ejemplo, suceden cambios en los sectores de arranque de los discos supuestamente no involucrados.
En esta imagen se puede ver como desde Linux tengo acceso al filesystem de Windows (en una muy mala foto...)
Alternativas Comerciales
Ya captado el problema, ahora veamos soluciones:
Hace unos días estuve intentando conseguir un switch de alimentación para mis discos SATA. La idea era apagar el que no está en uso.
Me encontré con algunas variantes algo burdas que ofrecían una de estas opciones:
Llave rotativa que alimenta uno u otro disco según la posición.
Botón de alimentación de hasta 6 discos individualmente.
Llave física y botón de selección, algo complicado... pero inspirador.
Porqué burdas?, simple, si mientras el sistema operativo A está en uso, alguien (o yo) apaga el disco pulsando el botón equivocado, o girando la llave, sería como apagar de repente la computadora, pudiendo provocar fallos en el sistema de archivos y hasta daños físicos en los discos por aparcamiento brusco (algo poco frecuente, pero existente todavía).
Solución adoptada.
Teniendo algo de tiempo libre, decidí buscar una solución mejor, y se me ocurrió un switch "inteligente" basado en microcontrolador (a casi todo le quiero poner un microcontrolador...) que permita seleccionar el disco a usar, pero en lugar de cambiar inmediatamente, espere a que el equipo se apague, y cambie al ser encendido nuevamente, permitiendo visualizar cual será el siguiente disco de arranque antes de apagar.
Buscando alternativas para minimizar el hardware necesario, llegué a un panel con tres leds y un botón de selección conectados a una mini placa con una PIC y algunos componentes baratos, todo del tamaño de un disco de 2.5" para que entre en una bahía libre.
El comportamiento del botón debería permitir una pulsación larga para entrar en modo selección, pulsaciones rápidas entre las opciones, y de nuevo una pulsación larga para "guardar" la opción seleccionada.
Si el disco seleccionado es distinto del actual, cuyo led está permanentemente encendido, debería indicarlo iluminando intermitentemente el led correspondiente al próximo arranque. Para complicarlo y porque tenía tiempo y espacio de memoria en la PIC, se me ocurrió que quedaría mejor si el led de opción seleccionada se apagaba y encendía gradualmente en lugar de simplemente titilar, Para eso implementé por código un seudo PWM de 8 pasos.
También me pareció buena idea que si se demora mucho tiempo en confirmar la selección, el microcontrolador cancela y vuelve al estado de espera.
Intentando reducir hardware, implementé PWM por software y también debouncing. (para los menos entendidos, debouncing es el evitar el bouncing (que astuto!), que es el efecto que se produce al pulsar un botón en donde hasta que el botón queda firmemente presionado, se producen innumerables pulsaciones cortas o "rebotes". Como las PIC son muy rápidas, pueden interpretar que cada rebote es una pulsación distinta y esto es lo que se debe evitar. Lo mismo sucede al soltar el botón.
En síntesis, el resultado es este:
(el vídeo tiene comentarios en ingles, porque son pocos comentarios, y porque youtube lo ve todo el mundo, y todo el mundo habla inglés... o eso parece!)
Construcción
Bien, dicho y visto esto, si has llegado a este punto, es porque necesitas mas detalles. Excelente! a continuación todos los detalles!
Como la implementación debe ser de bajo costo, dejaremos al software hacer todo lo posible, minimizando así el hardware necesario. Entonces este es el bosquejo del esquemático que por falta de tiempo no emprolijé y quedó final:
Si quieres hacer un aporte, no vendría mal pasarlo en limpio en eagle o similar!!
Usando ese esquemático pretendí seleccionar entre algunos relays de 12VDC que tenía disponibles, pero finalmente compré unos adecuados, necesitaba que sean de 12VDC, doble inversor, y capaces de manejar algo de corriente por si decidía luego instalar más de un disco por canal.
Hablando un poco sobre alimentación SATA, te contaré que el conector original tiene las tres alimentaciones, 3.3VDC, 5VDC y 12VDC. Pero sucede que como las fuentes antiguas tenían sólo 5VDC y 12VDC, muchas fuentes antiguas fueron "renovadas" vendiendose con conectores tipo SATA, pero sin la salida de 3.3VDC, simplemente porque los cables no estaban. Entonces, los fabricantes de dispositivos SATA decidieron no confiar en la presencia de 3.3VDC y, en cambio, generar en cada dispositivo los 3,3VDC necesarios a partir de los 5VDC. Por esa razón sólo operaremos con 5VDC y 12VDC, y funcionará por un tiempo, hasta que aparezcan discos sata que requieran 3.3vdc, lo que considero menos probable a que cambie el standard en poco tiempo, (discos M.2?).
Así queda el layout de la placa hecho con autocad:
Y así se ubican los componentes:
No pude poner los link a los DWG ni PDF porque taringa los bloquea!!
Los agujeros de montaje son coincidentes con los que tiene abajo un disco de 2.5", por lo que puede montarse en una bahía libre.
En breve, las lineas de 12 VDC pasan a través de un fusible de 1A para luego alimentar los tres relays, cada uno controlado por la pic mediante tres transistores BC337 configurados en corte/saturación. Un diodo en paralelo con cada bobina evita que se dañen los transistores al momento del corte de alimentación. Los 5 VDC también pasan por un fusible de 250ma para alimentar la PIC, y los leds con tres transistores en igual configuración que los relays. El cristal de 4MHZ y los dos capacitores de 18pf son según manual de la PIC, y un pequeño capacitor mas de .1uf sirve para absorver pequeñas fluctuaciones de alimentación. Muy simple!
Como no tenía ganas de hacer la placa con tanto detalle la construí con un fibrón indeleble, porque quería hacerlo rápido y dedicarme a la programación!!
Así quedó construído:
Firmware
La implementación del firmware la programé en C utilizando PCWHD, una versión antigua que sólo corre en XP, por lo que lo hice en una maquina virtual usando VirtualBox.
Este es el código C del programa:
** Lamentablemente no puedo cargar el código de programa porque Taringa me bloquea el post!
** Supongo que lo subiré a algún lado...
El programa compilado a hex para programar la PIC:
:1000000000308A005C2800000A308900831608143A
:1000100083120808AE002E082D02031924280A3086
:1000200089002D0888000B088C008B138316081597
:1000300055308900AA308900881488181D280811B5
:1000400083120C088C1B8B0000342D08013A031915
:100050003028033A03193A28013A031944284E2854
:10006000AE08031D352886103628861483168610A0
:1000700083124E28AE08031D3F280611402806159E
:100080008316061183124E28AE08031D49288611D7
:100090004A2886158316861183124E2800340130B3
:1000A000AD00AE0125200230AD00AE0125200330A9
:1000B000AD00AE012520003484011F308305950179
:1000C00097019601990198019A019E0183160108F2
:1000D000C03901388100093083128C00073081015A
:1000E000813084000008F03907388000640000087F
:1000F000F7398C19F0390C048000F1306500660086
:10010000831605118312051183168511831285113B
:10011000831685108312851083168610831286102D
:100120008316061183120611831686118312861117
:100130000A308900831608148312080892001208F6
:10014000013A0319AA28033A0319AF28013A0319FF
:10015000B428B9288316051183120515C328831600
:10016000851183128515C328831685108312851483
:10017000C32883160511831205150130AD00042034
:1001800001309200C328A201A101A401A301A6018C
:10019000A501A701A801A90103081839033883158F
:1001A00003160B3A0319D828103A0319D928DA286C
:1001B000DA28DA2864009A019608031DE2289708D5
:1001C0000319E72816080319970396032D298316A8
:1001D000061683129401061A940A150814020319CC
:1001E0000C29140895000130970090309600140BEC
:1001F000FD28990198019A010B2919080D3C031C4F
:100200000A29031D07291808793C031C0A29013013
:100210009A000B299A012D29140B2C2919080C3C42
:1002200003181E29FF3A031D19291808843C0318D6
:100230001E290D309900843098002B29980A031943
:10024000990A18087A3C031D2B2919080D3C031D37
:100250002B2902309A002D299A011E08FC3E031812
:10026000E729043EFB2A4F201208AD000130AE0002
:1002700025200A3089008316081483120808930089
:1002800013081202031949291308AD002A08AE0009
:1002900025201A0803195329013A03195429033A4E
:1002A000031955295C295C295C291B30A0005830B2
:1002B0009F0001309E005C29E729A008031D6429E6
:1002C0001F08013C031878291F080319A0039F0386
:1002D0000130AD002708AE0025200230AD00270810
:1002E000AE0025200330AD002708AE00252086296A
:1002F0004F203A30AC009830AB000A3089008316AA
:10030000081483120808930002309E00E729AB0806
:10031000031D9629AC08031D96299E010A30890009
:1003200083160814831208089300D2292B08031996
:10033000AC03AB030130AD00AE0125200230AD00AF
:10034000AE0125200330AD00AE0125201308AD001D
:100350002808AE0025201A080319B529013A031907
:10036000B629033A0319C829D229D2293A30AC0058
:100370009830AB00930A1308033C0318C1290130DD
:1003800093000430A400B030A3000130A800D229AB
:100390001308AD0004201B30A00058309F0003302C
:1003A0009E00D229E729A008031DDA291F08013C75
:1003B0000318E5291F080319A0039F034F20130802
:1003C000AD002708AE002520E6299E01E729A108F7
:1003D000031DED29A2080319F22921080319A2031C
:1003E000A103032A0130A2002C30A1002708013A02
:1003F0000319FE29013A0319002A032AA701032A37
:100400000130A700032AA308031D092AA408031921
:100410000E2A23080319A403A3031B2A0430A400F3
:10042000B030A3002808013A031D182AA8011B2A8E
:100430000130A8001B2AA508031D212AA6080319BC
:10044000EC2A26089D0025089C002908031D852A02
:100450001C088C001D088F0009300F02031D342A70
:10046000C4300C0203196D2A08300F02031D3C2A08
:1004700088300C0203196F2A07300F02031D442A2B
:1004800050300C020319722A06300F02031D4C2A49
:1004900018300C020319752A04300F02031D542A68
:1004A000E0300C020319782A03300F02031D5C2A86
:1004B000A8300C0203197B2A02300F02031D642AA4
:1004C00070300C0203197E2A01300F02031D6C2AC2
:1004D00038300C020319812A842A9B01842A0130B6
:1004E0009B00842A03309B00842A07309B00842AC7
:1004F0000F309B00842A1F309B00842A3F309B00D2
:10050000842AFF309B00842AE22A1C088C001D08E4
:100510008F0009300F02031D912AC4300C02031909
:10052000CA2A08300F02031D992A88300C020319C9
:10053000CD2A07300F02031DA12A50300C020319E7
:10054000D02A06300F02031DA92A18300C02031905
:10055000D32A04300F02031DB12AE0300C02031924
:10056000D62A03300F02031DB92AA8300C02031942
:10057000D92A02300F02031DC12A70300C02031960
:10058000DC2A01300F02031DC92A38300C0203197E
:10059000DF2AE12A7F309B00E12A3F309B00E12ADD
:1005A0001F309B00E12A0F309B00E12A07309B009F
:1005B000E12A03309B00E12A01309B00E12A9B01E4
:1005C000E12AE22A25080319A603A5031B0D9B0DAA
:1005D000AA011B18AA0AF92A0930A600C430A500EE
:1005E0002908013A031DF62AA901F92A0130A900B8
:1005F000F92ADA2863000A148A140A11023E031841
:0C0600008A0A820033295D298729D3294A
:02400E00F53F7C
:00000001FF
;PIC16F84A
No puse mucho detalle en la explicación del programa, porque es bastante simple de entender. En corto, al arrancar verifica la dirección eeprom 10, donde reside el dato del relay seleccionado, y actúa sobre el relay adecuado.
Luego entra en un bucle infinito que mediante contadores lee e interpreta la tecla, y en base a eso cambia la función a realizar. También dentro del búcle, hay contadores que actúan sobre la variable flipflopPwm y otras similares, que a su vez intermitentemente encienden o apagan el led seleccionado según la frecuencia de cada flip flop definida por su contador o contadores relacionados.
Así quedó en mi gabinete:
El programa, junto con el hex para programar la PIC, puede bajarse desde aquí:
(remover la letra @ y pegar en el navegador. No es lo correcto, pero no encontré otra forma de pasar el código...)
http: [email protected] @[email protected]@[email protected]/kjsk2blrk]
Gracias por tu lectura, espero que te sirva de inspiración, y recordá que esto es sólo una guía, una implementación que yo hice; espero tus comentarios e ideas de mejoras!
Además, la pc tiene también un disco con Windows 7, nonsanto (por decirlo así), que uso principalmente (únicamente) para jugar algunos juegos de steam (al momento de escribir este post, Farcry 4 me quita horas!)
Problema
Para gestionar el arranque de uno u otro sistema operativo, estaba usando el método de selección desde el BIOS, pero me dejaba intranquilo el que el sistema operativo seleccionado (windows por ejemplo) tenía "visibilidad" del/los otro/s disco/s, permitiendo por ejemplo formatear la instalación de Linux, y viceversa, Linux tenía acceso de escritura (peor!) al disco de Windows, lo que si me encontraba un día medio dormido podía hacer que dañe su instalación.
Otro problema relacionado a esto es que si, digamos, reinstalaba Windows, el disco de instalación tendría visibilidad del disco de Linux, pudiendo (y de hecho lo hizo) arruinar el arranque del mismo. Lo mismo al instalar Linux. La solución que ya muchos conocerán es, desconectar los discos no usados durante la instalación.
Incluso durante las actualizaciones de versiones de linux o al pasar de Windows 7 a 8, por ejemplo, suceden cambios en los sectores de arranque de los discos supuestamente no involucrados.
En esta imagen se puede ver como desde Linux tengo acceso al filesystem de Windows (en una muy mala foto...)
Alternativas Comerciales
Ya captado el problema, ahora veamos soluciones:
Hace unos días estuve intentando conseguir un switch de alimentación para mis discos SATA. La idea era apagar el que no está en uso.
Me encontré con algunas variantes algo burdas que ofrecían una de estas opciones:
Llave rotativa que alimenta uno u otro disco según la posición.
Botón de alimentación de hasta 6 discos individualmente.
Llave física y botón de selección, algo complicado... pero inspirador.
Porqué burdas?, simple, si mientras el sistema operativo A está en uso, alguien (o yo) apaga el disco pulsando el botón equivocado, o girando la llave, sería como apagar de repente la computadora, pudiendo provocar fallos en el sistema de archivos y hasta daños físicos en los discos por aparcamiento brusco (algo poco frecuente, pero existente todavía).
Solución adoptada.
Teniendo algo de tiempo libre, decidí buscar una solución mejor, y se me ocurrió un switch "inteligente" basado en microcontrolador (a casi todo le quiero poner un microcontrolador...) que permita seleccionar el disco a usar, pero en lugar de cambiar inmediatamente, espere a que el equipo se apague, y cambie al ser encendido nuevamente, permitiendo visualizar cual será el siguiente disco de arranque antes de apagar.
Buscando alternativas para minimizar el hardware necesario, llegué a un panel con tres leds y un botón de selección conectados a una mini placa con una PIC y algunos componentes baratos, todo del tamaño de un disco de 2.5" para que entre en una bahía libre.
El comportamiento del botón debería permitir una pulsación larga para entrar en modo selección, pulsaciones rápidas entre las opciones, y de nuevo una pulsación larga para "guardar" la opción seleccionada.
Si el disco seleccionado es distinto del actual, cuyo led está permanentemente encendido, debería indicarlo iluminando intermitentemente el led correspondiente al próximo arranque. Para complicarlo y porque tenía tiempo y espacio de memoria en la PIC, se me ocurrió que quedaría mejor si el led de opción seleccionada se apagaba y encendía gradualmente en lugar de simplemente titilar, Para eso implementé por código un seudo PWM de 8 pasos.
También me pareció buena idea que si se demora mucho tiempo en confirmar la selección, el microcontrolador cancela y vuelve al estado de espera.
Intentando reducir hardware, implementé PWM por software y también debouncing. (para los menos entendidos, debouncing es el evitar el bouncing (que astuto!), que es el efecto que se produce al pulsar un botón en donde hasta que el botón queda firmemente presionado, se producen innumerables pulsaciones cortas o "rebotes". Como las PIC son muy rápidas, pueden interpretar que cada rebote es una pulsación distinta y esto es lo que se debe evitar. Lo mismo sucede al soltar el botón.
En síntesis, el resultado es este:
(el vídeo tiene comentarios en ingles, porque son pocos comentarios, y porque youtube lo ve todo el mundo, y todo el mundo habla inglés... o eso parece!)
Construcción
Bien, dicho y visto esto, si has llegado a este punto, es porque necesitas mas detalles. Excelente! a continuación todos los detalles!
Como la implementación debe ser de bajo costo, dejaremos al software hacer todo lo posible, minimizando así el hardware necesario. Entonces este es el bosquejo del esquemático que por falta de tiempo no emprolijé y quedó final:
Si quieres hacer un aporte, no vendría mal pasarlo en limpio en eagle o similar!!
Usando ese esquemático pretendí seleccionar entre algunos relays de 12VDC que tenía disponibles, pero finalmente compré unos adecuados, necesitaba que sean de 12VDC, doble inversor, y capaces de manejar algo de corriente por si decidía luego instalar más de un disco por canal.
Hablando un poco sobre alimentación SATA, te contaré que el conector original tiene las tres alimentaciones, 3.3VDC, 5VDC y 12VDC. Pero sucede que como las fuentes antiguas tenían sólo 5VDC y 12VDC, muchas fuentes antiguas fueron "renovadas" vendiendose con conectores tipo SATA, pero sin la salida de 3.3VDC, simplemente porque los cables no estaban. Entonces, los fabricantes de dispositivos SATA decidieron no confiar en la presencia de 3.3VDC y, en cambio, generar en cada dispositivo los 3,3VDC necesarios a partir de los 5VDC. Por esa razón sólo operaremos con 5VDC y 12VDC, y funcionará por un tiempo, hasta que aparezcan discos sata que requieran 3.3vdc, lo que considero menos probable a que cambie el standard en poco tiempo, (discos M.2?).
Así queda el layout de la placa hecho con autocad:
Y así se ubican los componentes:
No pude poner los link a los DWG ni PDF porque taringa los bloquea!!
Los agujeros de montaje son coincidentes con los que tiene abajo un disco de 2.5", por lo que puede montarse en una bahía libre.
En breve, las lineas de 12 VDC pasan a través de un fusible de 1A para luego alimentar los tres relays, cada uno controlado por la pic mediante tres transistores BC337 configurados en corte/saturación. Un diodo en paralelo con cada bobina evita que se dañen los transistores al momento del corte de alimentación. Los 5 VDC también pasan por un fusible de 250ma para alimentar la PIC, y los leds con tres transistores en igual configuración que los relays. El cristal de 4MHZ y los dos capacitores de 18pf son según manual de la PIC, y un pequeño capacitor mas de .1uf sirve para absorver pequeñas fluctuaciones de alimentación. Muy simple!
Como no tenía ganas de hacer la placa con tanto detalle la construí con un fibrón indeleble, porque quería hacerlo rápido y dedicarme a la programación!!
Así quedó construído:
Firmware
La implementación del firmware la programé en C utilizando PCWHD, una versión antigua que sólo corre en XP, por lo que lo hice en una maquina virtual usando VirtualBox.
Este es el código C del programa:
** Lamentablemente no puedo cargar el código de programa porque Taringa me bloquea el post!
** Supongo que lo subiré a algún lado...
El programa compilado a hex para programar la PIC:
:1000000000308A005C2800000A308900831608143A
:1000100083120808AE002E082D02031924280A3086
:1000200089002D0888000B088C008B138316081597
:1000300055308900AA308900881488181D280811B5
:1000400083120C088C1B8B0000342D08013A031915
:100050003028033A03193A28013A031944284E2854
:10006000AE08031D352886103628861483168610A0
:1000700083124E28AE08031D3F280611402806159E
:100080008316061183124E28AE08031D49288611D7
:100090004A2886158316861183124E2800340130B3
:1000A000AD00AE0125200230AD00AE0125200330A9
:1000B000AD00AE012520003484011F308305950179
:1000C00097019601990198019A019E0183160108F2
:1000D000C03901388100093083128C00073081015A
:1000E000813084000008F03907388000640000087F
:1000F000F7398C19F0390C048000F1306500660086
:10010000831605118312051183168511831285113B
:10011000831685108312851083168610831286102D
:100120008316061183120611831686118312861117
:100130000A308900831608148312080892001208F6
:10014000013A0319AA28033A0319AF28013A0319FF
:10015000B428B9288316051183120515C328831600
:10016000851183128515C328831685108312851483
:10017000C32883160511831205150130AD00042034
:1001800001309200C328A201A101A401A301A6018C
:10019000A501A701A801A90103081839033883158F
:1001A00003160B3A0319D828103A0319D928DA286C
:1001B000DA28DA2864009A019608031DE2289708D5
:1001C0000319E72816080319970396032D298316A8
:1001D000061683129401061A940A150814020319CC
:1001E0000C29140895000130970090309600140BEC
:1001F000FD28990198019A010B2919080D3C031C4F
:100200000A29031D07291808793C031C0A29013013
:100210009A000B299A012D29140B2C2919080C3C42
:1002200003181E29FF3A031D19291808843C0318D6
:100230001E290D309900843098002B29980A031943
:10024000990A18087A3C031D2B2919080D3C031D37
:100250002B2902309A002D299A011E08FC3E031812
:10026000E729043EFB2A4F201208AD000130AE0002
:1002700025200A3089008316081483120808930089
:1002800013081202031949291308AD002A08AE0009
:1002900025201A0803195329013A03195429033A4E
:1002A000031955295C295C295C291B30A0005830B2
:1002B0009F0001309E005C29E729A008031D6429E6
:1002C0001F08013C031878291F080319A0039F0386
:1002D0000130AD002708AE0025200230AD00270810
:1002E000AE0025200330AD002708AE00252086296A
:1002F0004F203A30AC009830AB000A3089008316AA
:10030000081483120808930002309E00E729AB0806
:10031000031D9629AC08031D96299E010A30890009
:1003200083160814831208089300D2292B08031996
:10033000AC03AB030130AD00AE0125200230AD00AF
:10034000AE0125200330AD00AE0125201308AD001D
:100350002808AE0025201A080319B529013A031907
:10036000B629033A0319C829D229D2293A30AC0058
:100370009830AB00930A1308033C0318C1290130DD
:1003800093000430A400B030A3000130A800D229AB
:100390001308AD0004201B30A00058309F0003302C
:1003A0009E00D229E729A008031DDA291F08013C75
:1003B0000318E5291F080319A0039F034F20130802
:1003C000AD002708AE002520E6299E01E729A108F7
:1003D000031DED29A2080319F22921080319A2031C
:1003E000A103032A0130A2002C30A1002708013A02
:1003F0000319FE29013A0319002A032AA701032A37
:100400000130A700032AA308031D092AA408031921
:100410000E2A23080319A403A3031B2A0430A400F3
:10042000B030A3002808013A031D182AA8011B2A8E
:100430000130A8001B2AA508031D212AA6080319BC
:10044000EC2A26089D0025089C002908031D852A02
:100450001C088C001D088F0009300F02031D342A70
:10046000C4300C0203196D2A08300F02031D3C2A08
:1004700088300C0203196F2A07300F02031D442A2B
:1004800050300C020319722A06300F02031D4C2A49
:1004900018300C020319752A04300F02031D542A68
:1004A000E0300C020319782A03300F02031D5C2A86
:1004B000A8300C0203197B2A02300F02031D642AA4
:1004C00070300C0203197E2A01300F02031D6C2AC2
:1004D00038300C020319812A842A9B01842A0130B6
:1004E0009B00842A03309B00842A07309B00842AC7
:1004F0000F309B00842A1F309B00842A3F309B00D2
:10050000842AFF309B00842AE22A1C088C001D08E4
:100510008F0009300F02031D912AC4300C02031909
:10052000CA2A08300F02031D992A88300C020319C9
:10053000CD2A07300F02031DA12A50300C020319E7
:10054000D02A06300F02031DA92A18300C02031905
:10055000D32A04300F02031DB12AE0300C02031924
:10056000D62A03300F02031DB92AA8300C02031942
:10057000D92A02300F02031DC12A70300C02031960
:10058000DC2A01300F02031DC92A38300C0203197E
:10059000DF2AE12A7F309B00E12A3F309B00E12ADD
:1005A0001F309B00E12A0F309B00E12A07309B009F
:1005B000E12A03309B00E12A01309B00E12A9B01E4
:1005C000E12AE22A25080319A603A5031B0D9B0DAA
:1005D000AA011B18AA0AF92A0930A600C430A500EE
:1005E0002908013A031DF62AA901F92A0130A900B8
:1005F000F92ADA2863000A148A140A11023E031841
:0C0600008A0A820033295D298729D3294A
:02400E00F53F7C
:00000001FF
;PIC16F84A
No puse mucho detalle en la explicación del programa, porque es bastante simple de entender. En corto, al arrancar verifica la dirección eeprom 10, donde reside el dato del relay seleccionado, y actúa sobre el relay adecuado.
Luego entra en un bucle infinito que mediante contadores lee e interpreta la tecla, y en base a eso cambia la función a realizar. También dentro del búcle, hay contadores que actúan sobre la variable flipflopPwm y otras similares, que a su vez intermitentemente encienden o apagan el led seleccionado según la frecuencia de cada flip flop definida por su contador o contadores relacionados.
Así quedó en mi gabinete:
El programa, junto con el hex para programar la PIC, puede bajarse desde aquí:
(remover la letra @ y pegar en el navegador. No es lo correcto, pero no encontré otra forma de pasar el código...)
http: [email protected] @[email protected]@[email protected]/kjsk2blrk]
Gracias por tu lectura, espero que te sirva de inspiración, y recordá que esto es sólo una guía, una implementación que yo hice; espero tus comentarios e ideas de mejoras!