PROGRAMACIÓN ELECTRÓNICA
DE MEMORIAS ICOM-RAM
Saludos Colegas. Los equipos de radio marca Icom, modelos IC-271, IC-471, IC-745,
IC-750, IC-751, IC-765, IC-1271, IC-M700, R-71 y similares, incluyen un
módulo de memoria RAM en su circuitería, la cual contiene información digital
complementaria del funcionamiento y frecuencias. Debido a que la retención de dicha información es respaldada mediante una batería de
litio, en caso de posibles fallas, en el año 1.991 un Colega
Radioaficionado de nombre Andrew D Gerald (N2CBU), publicó una sencilla
alternativa de reprogramación de dichas memorias RAM, mediante un circuito
interface, software (ICOM-RAM.exe), descripción de la data en formato *.bin y
posibles mejoras de límites de frecuencias, pero que en la actualidad, la arquitectura
de computadores personales y sistemas operativos de 32 ó 64 bits, pudieran
presentar incompatibilidades.
Posteriormente se han publicado
múltiples alternativas de reprogramación, mayor información sobre el contenido
de la memoria Icom-RAM, interfaces más elaborados, circuitos no dependientes de
baterías, etc.
En caso de
no disponer del hardware y software adecuado, o de los conocimientos
informáticos básicos, como último recurso o alternativa, en el presente artículo
se describen procedimientos para reprogramación,
modificaciones y lectura de memorias Icom-RAM, mediante sencillos circuitos
electrónicos que pudieran “no depender de interfaces de computadores
personales” (incluso mediante el mismo circuito interface N2CBU), los
cuales generan de códigos binarios con niveles lógicos compatibles TTL,
permitiendo la asignación manual de grupos de bits que conforman los datos y
selección de direcciones de memorias.
Nota: en junio del 2022 se adicionó al presente artículo, un sencillo método de escritura y lectura de memorias Icom RAM, mediante tarjeta de desarrollo Arduino.
CONTENIDO
- · Descripción de componentes, funcionamiento y conocimientos básicos: ① Niveles lógicos. ② Datos. ③ Direcciones de memoria. ④ Interpretación del direccionamiento y capacidad de memoria. ⑤ Compuertas lógicas OR.
- · Funcionamiento básico del circuito Icom-RAM: ① Alimentación. ② Escritura en memoria.
- · Procedimiento para programación electrónica por bits (manual).
- · Modificación de límites de frecuencias.
- · Comentarios finales (Código Arduino para programar memorias Icom RAM. Desarrollo de software en Access 2010).
- · Data decodificada en bits y tabulada, de equipos Icom HF IC-751 y VHF IC-271.
NOTAS:
La lectura de los 2 primeros temas
del contenido, no serán necesarios para expertos. En la WEB se han publicado 2 archivos (data
en bits_IC-271.pdf e Data en bits_IC-751.pdf), los cuales contienen
exclusivamente la data decodificada en bits, debidamente tabulada.
DESCRIPCIÓN
DE COMPONENTES, FUNCIONAMIENTO Y CONOCIMIENTOS BÁSICOS, NECESARIOS PARA
PROGRAMAR MEMORIAS ICOM-RAM
NIVELES LÓGICOS
Igual que en cualquier circuito
compatible con sistemas binarios TTL, por
cada bit son posibles 2 niveles lógicos:
① El H ó 1 representa el nivel alto (High), con posible presencia
de voltaje (aproximado a +5 voltios DC) o nivel flotante.
② El L ó 0 representa el nivel bajo (Low), con ausencia de voltaje,
debido a la conmutación hacía el polo negativo de la fuente de alimentación. (las entradas y salidas de los puertos
paralelos estándar, son compatibles niveles lógicos TTL).
Para sistemas TTL, el nivel lógico
activo y que produce cambios es “0” (sistemas de lógica negativa), es decir, una entrada será reconocida al conmutarla
hacía el polo negativo de la fuente de alimentación, igualmente las salidas
conmutan al negativo.
Los circuitos de tecnología C-MOS
estándar, típicamente el nivel lógico activo y que produce cambios es “1” (sistemas de lógica positiva), es decir, se reconoce una entrada cuando se
conmuta hacía el polo positivo de la fuente de poder, o presencia de voltaje
positivo. Igualmente sucede con las salidas.
El circuito integrado IC2 (HD7432P)
del módulo de memoria Icom-RAM, es de lógica negativa (TTL), mientras que el
IC1 (D444C) es de tecnología C-MOS, pero con entradas y salidas compatibles
TTL.
DATOS
La data del módulo de memoria
Icom-RAM tiene un ancho de 4 bits (D0 al D3). En la tabla siguiente se
muestran las 16 combinaciones posibles de cada DATO (en código binario).
En lógica digital binaria, los bits
en estado “1” son significativos. No se
consideran los bits en estado “0”.
El valor significativo de cada bit, lo
determina su posición (típicamente de derecha a izquierda), donde:
·
D0: 20 = 1.
·
D1: 21 = 2.
·
D2: 22 = 4.
·
D3: 23 = 8.
Ejemplos:
①El dato 9 representado en binario es 1001 y equivale a sumar las posiciones de bits que se encuentran en
estado “1” lógico, es decir, 23 y 20. Resultado: 8 + 1
= 9.
②El dato 7 representado en binario es 0111 y equivale a sumar las posiciones de bits que se encuentran en
estado “1” lógico, es decir, 22, 21 y 20. Resultado: 4 + 2
+1 = 7.
③El dato E representado en binario es 1110 (14 en decimal) y equivale a sumar las posiciones de
bits que se encuentran en estado “1” lógico, es decir 23 , 22
y 21. Resultado: 8 + 4 + 2 = 14.
DIRECCIONES
DE MEMORIAS
Mediante la combinación binaria de 10
bits (A0 al A9), es posible seleccionar 1024 direcciones de memorias, donde A0 equivale al bit menos significativo
(20 = 1) y A9 es el bit
mayor significativo (29 = 512). En este caso, las direcciones de memorias se
representan mediante 3 dígitos alfanuméricos y éste a su vez se compone de 2
dígitos de 4 bits cada uno, más un dígito de 2 bits [(A9 A8) (A7 A6 A5 A4) (A3 A2
A1 A0)].
Dígito menos significativo (de 4
bits), a la derecha:
·
A0: 20 = 1.
·
A1: 21 = 2.
·
A2: 22 = 4.
·
A3: 23 = 8.
Dígito intermedio (de 4 bits):
·
A4: 24 = 16.
·
A5: 25 = 32.
·
A6: 26 = 64.
·
A7: 27 = 128.
Dígito más significativo (de 2 bits), a la izquierda:
·
A8: 28 = 256.
·
A9: 29 = 512.
Ejemplos:
① La dirección de memoria 0E2 decodificada en bits es 00 1110 0010 y equivale a sumar las
posiciones que se encuentran en estado lógico = “1”, es decir, 27, 26,
25 y 21. Resultado: 128 + 64 + 32 + 2 =
226 (de las 1024 direcciones de memoria, la 0E2 equivale a la posición 226).
② La dirección de memoria 13F decodificada en bits es 01 0011 1111 y equivale a sumar las
posiciones que se encuentran en estado lógico = “1”, es decir, 28, 25,
24, 23, 22, 21 y 20. Resultado: 256 + 32 + 16 + 8 + 4 + 2 + 1 = 319 (de las 1024 direcciones de
memoria, la 13F equivale a la posición 319).
③ La dirección de memoria 370 decodificada en bits es 11 0111 0000 y equivale a sumar las
posiciones que se encuentran en estado lógico = “1”, es decir, 29, 28,
26, 25 y 24. Resultados: 512 + 256 + 64 + 32 +
16 = 880 (de las 1024 direcciones de memoria, la 370 equivale a la
posición 880).
.
INTERPRETACIÓN
DEL DIRECCIONAMIENTO Y CAPACIDAD DE MEMORIA ICOM-RAM
En la página del Colega N2CBU o desde
la Web en general, es posible descargar imágenes y archivos de datos Icom-RAM (en formato binario: *.bin), de la mayoría de equipos de la época.
La imagen siguiente corresponde a la
data Icom-RAM original del equipo HF IC-751, donde:
·
Total 1024 registros (caracteres alfanuméricos 0 al F) de datos, organizados en 4 columnas (0, +1,
+2, +3) de 16 filas cada una (000 al 3C0) y en cada fila de éstas 4 columnas hay
16 registros o caracteres, es decir, 4 columnas x 16 filas x 16 registros =
1024 posiciones o direcciones de memorias.
·
Sabiendo que cada registro de datos (o dirección de memoria) se compone de 4 bits, entonces 4 bits multiplicado por 1024 direcciones =
4096 bits (capacidad de memoria = 4
Kbits).
La imagen siguiente muestra 3
ejemplos de direcciones de memorias:
COMPUERTAS LÓGICAS
DIGITALES “OR”, DE 2 ENTRADAS
Son dispositivos electrónicos compuestos de circuitos de
conmutación que se comportan según la tabla siguiente. Para que el nivel lógico de salida sea H ó 1,
al menos una de sus 2 entradas debe ser igual a H ó 1.
FUNCIONAMIENTO BÁSICO DEL
CIRCUITO ICOM-RAM
ALIMENTACIÓN
El módulo Icom-RAM es alimentado
mediante los +5 VDC que ingresan al terminal #12 del conector J1, pero en
ausencia del mismo, la batería de litio (BT1) alimenta exclusivamente al
circuito integrado IC1 (pin #18 del uPD444C). Ambas alimentaciones separadas mediante diodos D1 y D2.
El terminal #11 del conector J1 (AD10) permanece en “0” (cero lógico = L = Low) mientras el equipo de radio
está energizado, por lo tanto igualmente permanece en “0” la salida de la
compuerta IC2a, habilitando las entradas y salidas (datos y direcciones) del
circuito integrado IC1 (pin #8 = /Chip Select. La línea de subrayado superior indica que dicha entrada es negada, es
decir, se activa con “0”), permitiendo lectura, escritura y normalizando su
consumo de energía (operating supply
current = 9 mA to 40 mA).
En ausencia de energía, el nivel
lógico de AD10 cambia al estado flotante (equivale al “1” en sistemas TTL) y
mediante la resistencia R1, la entrada /Chip Select cambia al nivel “1”. Esta condición hace que las salidas y entradas
del IC1 cambien al estado de alta impedancia, disminuyendo el consumo de
energía.
Notas
importantes: Por debajo de +2 VDC en el
pin #18 del IC1, no se garantiza retención de data en la memoria (según
Datasheet). En caso de requerir reemplazo de la batería de litio (BT1), será
necesario adicionar alimentación temporal al IC1 (de +3 a +5 voltios DC, en el
pin #18 de IC1).
Según comunicado “Tech Talk From Icom”, el tiempo de vida promedio de la batería de
litio es de 180 años, suministrando 100 nanoamperios (0.0001 miliamperios). La corriente de memoria Icom-RAM,
ronda desde 10 hasta 30 nanoamperios, estimando
tiempos de vida hasta de 600 años.
Según Datasheet, µPD444-1 µPD444-2 and µPD444-3 Low power standby = 1 µA
to 5 µA (0.001 mA → 0.005 mA, lo que es igual a 1000 → 5000 nanoamperios), es decir, por alguna razón existen 2 ceros de diferencia en los cálculos (probablemente asociado al diseño de construcción del D444C).
ESCRITURA EN
MEMORIA
La lectura y escritura de datos es
posible, al habilitar todas las entradas y salidas del chip de memoria,
mediante AD10 = /CS = “0” (/Chip Select negado, en pin #8 de IC1 y terminal
#11 de J1).
La escritura
sobre registros de datos ubicados entre las primeras 256 direcciones de memoria (000 ↔ 0FF), se protegen mediante nivel “0” en el
terminal #3 (/WP) de conector J2.
La escritura de datos se realiza al
cambiar de nivel “1” al “0” en el terminal #8 (/WR) de J2. Para las primeras 256 direcciones, se
requiere /WP = “1” en el terminal #3 de J2 (también puede ser flotante).
Condiciones para escribir:
1. Módulo de memoria
energizado (+5 VDC en el terminal #12 de J1).
2. /CS debe permanecer en “0”
(/Chip Select = AD10 en el terminal #11 de J1).
3. Dirección de memoria
seleccionada (A0 ↔ A9).
4. Ingresar la entrada de
datos, correspondiente a la dirección de memoria seleccionada (D0 ↔ D3).
5. Escritura habilitada (/WP
= “1”, interruptor abierto).
6. Escribe dato en memoria (al pulsar /WR, pasa al nivel “0” y vuelve al “1”).
Ejemplo;
Se requiere modificar el límite
superior de frecuencias de un equipo IC-751, hasta 34 MHz (normal = 30 MHz. Dependiendo de los ajustes de fábrica,
existirá una frecuencia donde deje de oscilar):
1. Desenergizar el equipo de
radio y extraer el módulo de memoria Icom-RAM.
2. Deshabilitar escritura (/WP cerrado) y energizar módulo Icom-RAM (SW1 = On).
3. Seleccionar la dirección
de memoria “03B” (en código binario digital = 00 0011 1011).
4. Seleccionar el número “4”
en la entrada de datos (en código binario digital = 0100).
5. Habilitar escritura (/WP
abierto) y pulsar /WR por 1 segundo.
6. Deshabilitar escritura (/WP cerrado) y desenergizar el módulo Icom-RAM (SW1 = Off).
7. Volver a montar módulo Icom-RAM en el equipo de radio y probar límite superior desde el VFO.
7. Volver a montar módulo Icom-RAM en el equipo de radio y probar límite superior desde el VFO.
PROCEDIMIENTOS
PARA PROGRAMACIÓN ELECTRÓNICA, POR BITS (MANUAL)
La mayoría de software programadores
de memorias EPROM y similares, disponibles en la Web, permiten editar archivos
en formato *.bin, con direccionamiento de memoria compatible con la Icom-RAM (A0 → A9
= 1024 direcciones), pero típicamente con ancho de datos de 8 bits (D0 → D7. Para Icom-RAM solo será necesario decodificar
los primeros 4 bits D0 → D3 de cada registro de memoria).
Para que el equipo funcione, es
necesario cargar los registros de datos de las primeras 256 direcciones de
memoria. Es necesario aclarar que cuando
no se programa la memoria en su totalidad (1024 registros), al iniciar funcionamiento del radio recién
programado, es normal observar data basura en algunas memorias, RIT, NIT y VFO (se eliminan al cargar
las 32 memorias de frecuencias, valores normales en VFO, reset del RIT y NIT). Se sugiere cargar datos, por lo menos
hasta las 48 ó 64 direcciones de memorias siguientes de la 256 (12F ó 13F),
esto ayudará a iniciar el equipo, con valores normales en ambos VFO.
A continuación se describe el
procedimiento de programación electrónica, suponiendo que no se dispone de la
imagen impresa del archivo de datos *.bin:
PASOS
1. Editar el archivo *.bin correspondiente
al modelo de equipo Icom requerido, mediante cualquier software programador de
memorias EPROM o similares, por ejemplos, HxD
Hex editor y PONY Programer.
Ejemplo:
2. Debido a que el ancho de datos es de
8 bits (2 dígitos por registro), después de imprimir el archivo, es
necesario suprimir (borrar) el dígito de la izquierda en cada registro (letra
“F”), esto se debe a que la longitud de datos de la Icom-RAM es de 4 bits.
También es
posible realizar una captura de pantalla, mediante la tecla “Print Screen” del
teclado, para luego pegarlo en “Paint” del mismo Windows o cualquier editor de
imágenes y borrar dichos caracteres “F”. Ejemplo:
3. Decodificar la información en bits,
correspondiente a cada registro de dato y direccionamiento de memoria a cargar (tabular para facilitar la programación).
A
continuación se muestra un ejemplo de tabulación de las primeras 16 posiciones
de memoria. La primera columna de la
izquierda es de uso referencial:
.
4. Implementar el circuito de
programación. Los más sencillos consisten en generar niveles lógicos mediante
grupos de interruptores o desde un puerto paralelo de ordenador personal. Nota: Mientras
menos elaborado sea el circuito para programar la memoria Icom-RAM, mayor será el
nivel de dificultad para grabar o leer datos, en especial al seleccionar
direcciones de memorias.
Los 2 primeros circuitos siguientes, se sugieren exclusivamente para realizar modificaciones en específicas direcciones de memorias, debido a que requieren dedicación y tiempo para seleccionar las 1024 direcciones, o por lo menos las primeras 256 necesarias.
Los 2 primeros circuitos siguientes, se sugieren exclusivamente para realizar modificaciones en específicas direcciones de memorias, debido a que requieren dedicación y tiempo para seleccionar las 1024 direcciones, o por lo menos las primeras 256 necesarias.
La
ventaja del interfaces paralelos, es reducir costos y facilitar la carga manual
mediante cualquier software de prueba para dichos puertos paralelos (se ha probado con el programa LPT Port Test
Utility i386 x64), o realizar un programa que interprete el archivo *.bin
y cargue automáticamente la información en la Icom-RAM.
El circuito siguiente permite leer los bits que conforman el código binario,
correspondientes a los registros de datos almacenados en la memoria Icom-RAM y
mediante la selección manual de direcciones de memorias, realizar el
procedimiento inverso, es decir, inicialmente se lee la información en bits, para
tabular datos y direcciones, codificar la información y luego crear el archivo
*.bin mediante cualquier software programador de memorias EPROM o
similares.
Para facilitar
la selección de direcciones de memorias, es necesario adicionar cualquier
circuito contador binario, compatible con sistemas TTL, el cual permita
incrementar progresivamente dichas direcciones (preferible con entradas de
Reset, Forward y Reverse).
Se sugiere
monitorear los bits del contador binario, mediante grupos de diodos emisores de
luz (preferiblemente diodos leds de bajo consumo y alto desempeño).
Complementar
los 8 bits del puerto paralelo y voltaje de programación, permite adaptar el
mismo circuito N2CBU para programar memorias ROM, EPROM y similares.
El alto
consumo de diodos leds estándar, pudieran causar “cargabilidad de salidas TTL”
(Maximun Current Output L = 2 mA. Maximum Current Output H = 1 mA), la cual a su vez causa posibles
errores de lectura o escritura de datos y direcciones de memorias. Para evitarlo, se sugiere adicionar
dispositivos amplificadores por cada bit.
Es posible amplificar la iluminación de leds y garantizar lectura o escritura de datos, mediante el circuito integrado ULN2003, el cual contiene 7 arreglos de transistores Darlingtong, con salidas de colector abierto, que soportan cargas hasta de 500 mA y 50 VDC por cada bit.
Es posible amplificar la iluminación de leds y garantizar lectura o escritura de datos, mediante el circuito integrado ULN2003, el cual contiene 7 arreglos de transistores Darlingtong, con salidas de colector abierto, que soportan cargas hasta de 500 mA y 50 VDC por cada bit.
En caso que
el IC1 sea el D444D -2, se sugiere adicionar ULN2003 en circuito de datos (el
D444C si permite conectar directamente hacía diodos LED de bajo consumo).
5. En caso que el módulo de memoria a
programar, previamente haya funcionado en un equipo Icom de modelo diferente, se
sugiere realizar reset total, desconectando la batería, cortocircuitar temporalmente
los pines #18, #9 del IC1 y volver a conectar la batería. Todas las 1024 celdas de
memoria pasan al nivel “1” (“F” = 1111) .
6. Conectar el módulo de memoria al
circuito de programación. Deshabilitar
escritura (WP = “0”) y luego energizar dicho circuito desde una fuente de
poder de 5 voltios DC, o ingresar mayor voltaje (desde +7.5 hasta +20 voltios. Soporta +35 VDC) mediante un regulador de
voltaje LM7805, como se indica en los diagramas.
7. Seleccionar la dirección de memoria
requerida, mediante la combinación de bits A0 al A9, o desde el contador de
direcciones.
8. Seleccionar la data (D0 al D3) correspondiente
a dicha dirección seleccionada.
9. Habilitar escritura (WP = “1”).
10. Escribir (WR debe pasar de nivel “1”
al “0” para escribir y volver al nivel “1”).
11. Seleccionar la dirección de memoria
siguiente, o incrementar contador. Repetir
los pasos #9 y #10 hasta la dirección 0FF (00 1111 1111), o por lo menos hasta la 13F (01 0011
1111).
12. Al culminar la programación, antes de desenergizar el circuito interface, es aconsejable que /WP esté en “0” y antes de desconectar el módulo de memoria Icom-RAM, se sugiere esperar que se descargue totalmente la alimentación 5 VDC.
12. Al culminar la programación, antes de desenergizar el circuito interface, es aconsejable que /WP esté en “0” y antes de desconectar el módulo de memoria Icom-RAM, se sugiere esperar que se descargue totalmente la alimentación 5 VDC.
13. Probar el módulo de memoria en el
radio. Inicialmente es posible observar data basura en algunas memorias,
RIT, NIT y VFO.
14. Eliminar data basura mediante reset
del RIT, NIT y grabando las 32 memorias de frecuencias antes de darle uso al
equipo.
MODIFICAR LÍMITES DE
FRECUENCIAS, PARA ICOM IC-751
El límite máximo de frecuencia (en MHz) del equipo HF
IC-751, se establece entre las direcciones 03C ↔ 03A (referencias 61 ↔ 59) y el límite inferior, entre las direcciones 032 ↔ 030 (referencias 51 ↔ 49). La tabla siguiente muestra la configuración
original (100 KHz ↔ 30.0 MHz).
En la Web es posible descargar el archivo de la data IC-751, con selector de bandas adaptado para frecuencias Cunabaf, CB11 metros y AM comercial
La imagen siguiente incluye las frecuencias HF Cunabaf, canales CB 11 metros y otros rangos de poca importancia para el presente archivo:
MODIFICAR LÍMITES DE
FRECUENCIAS, PARA ICOM IC-271
La programación del límite máximo de frecuencia (en MHz) del equipo VHF
IC-271, se establece entre las direcciones 049 ↔ 046 (referencias 74 ↔ 71) y
el límite inferior, entre las direcciones 043 ↔ 040 (referencias 68 ↔ 65). Bien ajustado, dicho equipo permite un ancho de banda de 14 MHz y la programación permite seleccionar rangos entre 100 MHz hasta 199 MHz
Las tablas siguientes muestran las configuraciones originales
de los equipos IC-271 (144.0 MHz ↔ 146.0 MHz) e IC-271A (143.8 Hz ↔ 148.2 MHz).
Archivo IC-271 (139 MHz - 153 MHz):
PARA FINALIZAR
Desarrollo de código de programa Arduino para leer o escribir memorias Icom RAM:
El código presentado a continuación, es tomado de un programa para copiar efectos de juegos de luces en memorias EEPROM, serie 27CXX, el cual funciona en Arduinos Mega, Due y Nano, pero que en este caso fue adaptado para bus de datos de 4 bits. De esta manera funciona en cualquier tipo de Arduino, como por el ejemplo el Uno y Uno-R3.
Requiere 52 segundos para un ciclo completo de escritura o de lectura de memoria.
Exclusivamente lee o escribe en las primeras 512 direcciones de la memoria Icom RAM, es decir, únicamente existe posibilidad de grabar la configuración y las primeras 9 memorias, el resto se programa desde los botones del radio.
Al encender el radio por 1ra vez, mostrará el VFO-A, inicialmente se sugiere grabar el VFO-B en todas las 32 memorias y luego realizar la programación al gusto.
En caso de no usar la entrada D11 (Leer sin conectar). el programa repite ciclos de escritura. Si se desea únicamente leer la memoria, entonces Leer se debe conectar a GND, o desconectar la entrada D13 (/WR).
La pausa entre cada ciclo es de 30 segundos (lapso de tiempo suficiente para quitar la alimentación y desconectar la Icom RAM).
La entrada D12 (Veloz) se usa para reducir 10 veces la velocidad del ciclo de lectura o escritura y es útil para visualizar o comparar el contenido grabado u observar el proceso con mayores detalles.
La matriz del codeString presentada es de 32 filas x 16 columnas, donde cada registro está conformado de un byte hexadecimal, del cual solo se usa la parte derecha del mismo. En este caso de suministran 2 archivos que contienen data para memorias Icom IC-271 (con rangos de frecuencia entre 138.5 MHz hasta 152.5 MHz) y del IC-751, con rangos de frecuencias desde 50 KHz hasta 30 MHz, además incluye CB 11 metros en el selector de bandas y AM comercial (1.800 - 2.020 MHz, 3.500 - 4.020 MHz, 7.000 - 7.300 MHz, 10.100 - 10.160 MHz, 14.000 - 14.360 MHz, 18.060 - 18.180 MHz, 21.000 - 21.460 MHz, 24.890 - 25.000 MHz, 28.000 - 29.710 MHz, 26.950 - 27.420 MHz y 530 - 1.700 KHz). Esta data se puede editar para cualquier otro modelo de radio marca Icom, o parte derecha del byte de datos de cualquier memoria EEPROM serie 27CXX.
La tarjeta Arduino Nano tiene un precio que difícilmente supere 10 $. Seguidamente se debe descargar el software ID_Arduino, más el driver para el cable USB. Luego se abre uno de los archivos siguientes, según sea el caso.
Enlace IC-271:
Enlace IC-751:
Se transfiere hacia la tarjeta Arduino y listo, sólo debe esperar que terminen el primer ciclo de escritura, o si prefiere puede dejar que realice el segundo ciclo de escritura y continuar con los ciclos de lectura en baja velocidad, para así verificar que realmente se copió la información.
El software ID_Arduino tiene un monitor serial que permite visualizar los procesos de escritura y de escritura, aunque una vez grabado el código en la tarjeta Arduino, no hace falta el ordenador y también es posible usar LED en cada señal para visualizar datos, direcciones y control.
La figura siguiente muestra un ejemplo del monitor serial del ID_Arduino, en este caso se observa el proceso cuando el contador ADD está escribiendo en las direcciones de memorias que contienen los rangos de frecuencias para el IC-271.
En la imagen siguiente se aprecia en modo de lectura de la Icom RAM IC-751. En la 1ra fila hay un desplazamiento, sin importancia
Estructura del código de programa Arduino (en este caso para el IC-751):
//Declara los contadores
int contadorADD = 0; //Contador del bus de direcciones
int contadorDatos = 0; //Contador de bytes del codeStrings, para transferir al bus de datos
int contadorColumnas = 0; //Contador para acomodar la indicación serial en 16 columnas
//Matriz de 512 Kb para grabar en la memoria Icom RAM IC-751 (únicamente se usa la parte derecha de cada byte)
byte* codeStrings[512]={
0x00,0x00,0x0F,0x01,0x0F,0x0F,0x01,0x0F,0x0F,0x00,0x00,0x02,0x0F,0x0F,0x0F,0x0F,
0x00,0x00,0x00,0x0B,0x00,0x00,0x06,0x08,0x06,0x08,0x00,0x00,0x00,0x03,0x02,0x00,
0x00,0x05,0x09,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x00,
0x08,0x01,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00,
0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x03,0x07,
0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x06,0x01,0x00,0x01,0x00,0x00,0x00,
0x00,0x04,0x01,0x00,0x00,0x06,0x03,0x04,0x01,0x00,0x00,0x06,0x00,0x08,0x01,0x00,
0x00,0x08,0x01,0x08,0x01,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x06,0x04,0x01,
0x02,0x00,0x00,0x09,0x08,0x04,0x02,0x00,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x00,
0x00,0x08,0x02,0x00,0x00,0x01,0x07,0x09,0x02,0x00,0x00,0x05,0x09,0x06,0x02,0x00,
0x00,0x02,0x04,0x07,0x02,0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x07,0x01,
0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x00,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x00,0x00,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x01,0x09,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x08,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x00,0x00,0x03,0x02,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x02,0x04,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x02,0x01,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x00,0x05,0x08,0x02};
const byte WR = 13; //En estado Low graba datos en la memoria Icom RAM
const byte Veloz = 12; //Velocidad rápida = HIGH y lenta = Low
const byte Leer = 11; //Lee la memoria cuando está en Low (deshabilita la escritura)
//Crear dato de 4 bits, para escribir en la memoria Icom RAM
byte DB0 = 0; //Bit de dato 0 (escribe)
byte DB1 = 0;
byte DB2 = 0;
byte DB3 = 0; //Bit de dato 3 (escribe)
int numero = 0; //Número de 4 bit de cada dato de la matriz (parte derecha de cada byte del codeString)
//4 bit del bus de datos para leer la memoria
byte Inp0 = 0; //Bit de dato 0 (leer)
byte Inp1 = 0;
byte Inp2 = 0;
byte Inp3 = 0; //Bit de dato 3 (leer)
int total1 = 0; //código de 4 bit leído de la memoria Icon RAM
void setup() {
//Set del puerto serial a 9600 baudios
Serial.begin(9600);
//Set de salidas digitales Arduino para el bus de direcciones AD0 al AD8
for(int i=2;i<=10;i++) { //Inicializa variables de salida
pinMode(i, OUTPUT);
}
//Set de entradas y salidas digitales para el control
pinMode(11, INPUT_PULLUP); //Leer = Entrada, conectada a GND, únicamente en modo de lectura
pinMode(12, INPUT_PULLUP); //Veloz = Entrada, conectada a GND selecciona la velocidad lenta
pinMode(13, OUTPUT); //WR = Salida, ordena la escritura cuando pas de nivel HIGH a LOW
}
void loop() {
//Set de entradas analógicas Arduino, para manejar el bus de datos de 4 bits
pinMode(A0, INPUT); //Bit de dato DB0
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT); //Bit de dato DB3
//Set de variables de control
digitalWrite(WR, HIGH); //Por el momento la salida D13 debe no estar en modo de escritura
boolean Leer = digitalRead(11); //La entrada D11 asigna nivel lógico a la entrada Leer
boolean Veloz = digitalRead(12); //La entrada D12 asigna nivel lógico a la variable Veloz
//Lectura del bus de datos e imprime en el puerto serial, o transfiere el codeString hacia el bus de datos, e imprime en el puerto serial
if((Leer) == 0) {
boolean Inp0 = digitalRead(A0); boolean Inp1 = digitalRead(A1); boolean Inp2 = digitalRead(A2); boolean Inp3 = digitalRead(A3); //Asigna niveles lógicos
int total1 = (Inp0 * 1) + (Inp1 * 2) + (Inp2 * 4) + (Inp3 * 8); //Crea del dato leído desde la memoria
if((Veloz) == 1) { delay (150); } else { delay (1500); } // Selecciona la velocidad del ciclo de programa
Serial.print(" ");
if ((contadorColumnas) < 16) { Serial.print(total1, HEX); } else { Serial.println(total1, HEX); contadorColumnas = 0; }
}
else {
numero = codeStrings[contadorDatos];
Serial.print("Write Nº:"); Serial.print(contadorADD); Serial.print(", ADD Hex ="); Serial.print(contadorADD, HEX); Serial.print(", Data ="); Serial.println(numero, HEX);
DB0 = bitRead(numero, 0); DB1 = bitRead(numero, 1); DB2 = bitRead(numero, 2); DB3 = bitRead(numero, 3); //lee la parte derecha de cada byte del codeString
delay (1);
}
//Crea las salidas digitales para el bus de direcciones (ADD0 al ADD8)
int k; //Declara una variable local "k"
k=contadorADD; //Iguala la variable K, con el contador de direcciones
for(int i=2; i<=10; i++) { //Declara la variable local "i" para crear el bus de direcciones en salidas D2 hasta el D10
digitalWrite(i, k%2); //Crea los estados de las salidas digitales D2 al D10, en función del modulo de la division entre 2
k=k/2; //Divide entre 2 cada ciclo de bit de batos que incremente
}
//Asigna las entradas analógicas como bits de salidas digitales en estado HIGH, para el bus de datos DB0 al DB3
if((Leer) == 1) {
pinMode(A0, OUTPUT); //DB0
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT); //DB3
if((DB0) > 0) { digitalWrite(A0, HIGH); }
if((DB1) > 0) { digitalWrite(A1, HIGH); }
if((DB2) > 0) { digitalWrite(A2, HIGH); }
if((DB3) > 0) { digitalWrite(A3, HIGH); }
if((Veloz) == 1) { delay (40); } else { delay (400); }
//Ordena la grabación d datos en la memoria
digitalWrite(WR, LOW);
if((Veloz) == 1) { delay (10); } else { delay (100); }
digitalWrite(WR, HIGH);
if((Veloz) == 1) { delay (60); } else { delay (600); }
//Vuelve a normalizar las entradas analógicas a estados lógicos LOW
digitalWrite(A0, LOW);
digitalWrite(A1, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
}
if((Veloz) == 1) { delay (10); } else { delay (100); }
//Incrementa los contadores hasta la dirección Nº = 512 y espera 30 segundos para reiniciar desde cero (0)
if((contadorADD) < 512) { contadorDatos++; contadorADD++; contadorColumnas++; } else { contadorDatos=0; contadorADD=0; delay (30000); }
}
Desarrollo de softwarw para leer o grabar memorias Icom RAM, directamente desde un puerto paralelo (sin circuitos adicionales):
Actualmente, en la mediada de las posibilidades del tiempo libre, se está desarrollando un sistema de bases de datos relacionales en Microsoft Access 2010, para realizar la programación de memorias Icom-RAM directamente desde el puerto paralelo, sin requerir circuito adicional. Por el momento solo están disponibles para descargar los formularios y bases de datos, aún faltan las instrucciones VisualBasic para controlar los bits del puerto paralelo.
En el extremo superior del formulario se muestran las direcciones de memoria en formatos decimal, hexadecimal y binario de 9 bits. El botón "SUBE" incrementa el contador de direcciones y el botón "BAJA" cuenta de forma regresiva. Los bits de la figura inferior están en línea con los del monitor de la parte superior del formulario.
En el cuadro "DATO" se muestran los bits de cada registro de datos, los cuales están en línea con los de la figura inferior. Los datos están cargados para memorias Icom RAM IC-751 e IC-271, aunque en el cuadro "REEMPLAZAR_DATO" es posible modificar al gusto. Mediante el botón "DATA_BASE" se tiene acceso directo a la base de datos donde también es posible modificar dichos registros:
Para recorrer todos los registros de la tabla, mediante la flecha de la columna izquierda o desplazando la barra derecha. Adicionalmente se dejan los controles de navegación en el extremo inferior del formulario. El botón "REGRESA", cierra la ventana y vuelve a cargar el formulario de carga de datos. Estos son los enlaces para descargar:
Programa para cargar data Icom RAM IC-271 (132.5 - 152.5 MHz):
Programa para cargar data Icom RAM IC-751 (50 KHz - 31 MHz y rangos mejorados):
Los requerimientos son:
Actualmente solo es necesario tener instalado del Microsoft Access 2010 (o superior) en el Windows. Para el futuro será necesario cargar el "inpout32.dll" en la carpeta system32 ó system del windows y ordenador con puerto paralelo. En caso de posible error de habilitación de contenido, se debe posicionar el puntero del mouse en cualquier lugar del formulario, hacer clic en la tecla auxiliar del mismo, cerrar el formulario y habilitar el contenido:
El programa también resulta útil como referencia binaria para la carga de datos de forma electrónica (manual), aunque en la web están disponibles algunos archivos complementos del artículo actual: “Data en bits IC-271.pdf”, “Data en bits IC-751.pdf” y para
Venezuela “Data in bits
IC-751_Venezuela.pdf”.
Nota: Las incompatibilidades entre las librerías del inpout32 y el Access 2010 han dificultado el correcto funcionamiento del puerto paralelo.
Es posible clonar memorias Icom RAM, en cualquier otro tipo de memoria, incluyendo la misma Icom RAM, EPROM (de cualquier capacidad), o similares. Sencillamente se conectan el paralelo (datos y direcciones) ambas memorias y generando un pulso de escritura (/WR) por cada dirección seleccionada. Particularmente he desplazado un lugar, las salidas del contador CD4040, de manera que quede desocupada la salida Q1 (del contador) y aprovecharla para generar la escritura /WR. Próximamente se mostrará el diagrama sugerido.
La ventilación forzada de la mayoría de equipos HF
de marca Icom, desalojan su calor interno de forma eficiente, incluso puede permanecer arrancado dicho ventilador en baja velocidad mientras el equipo recibe, pero algunos
diseños activan la ventilación forzada exclusivamente cuando el equipo transmite y genera suficiente calor para
activar sus interruptores térmicos. En lugares calurosos, esta condición pudiera afectar el correcto funcionamiento de la memoria Icom RAM y otras etapas del equipo. Como posible alternativa se sugiere adicionar una resistencia de aproximadamente 100 Ω ó hasta 200 Ω, en paralelo con el interruptor térmico
“S2” de la etapa final de RF. Se muestra un ejemplo:
MODIFICACIÓN PARA CORREGIR ALTA TEMPERATURA EN EQUIPOS IC-751, IC-745, IC-M700 Y OTROS
Hasta la próxima. 73´S. QRV.
Instructor de
electrónica, en el Radio Club Venezolano.
23-06-2018.
Enlaces para descargar el archivo, en formato PDF (igualmente es posible descargarlos desde www.qrz.com/db/YY5RM)
Archivo completo (24-06-2018): https://documentcloud.adobe.com/link/review?uri=urn:aaid:scds:US:8a970f1c-e5ec-4124-b8d3-ab482cf0c185
Archivo completo (24-06-2018): https://www.dropbox.com/s/xq9s6ft1k9okuw6/Programar%20Memorias%20Icom-RAM%20y%20Data.pdf?dl=0
Código de programa Arduino para leer o escribir memorias Icom Ram (06-07-2022):
Archivo sin data (18-06-2018): https://documentcloud.adobe.com/link/review?uri=urn:aaid:scds:US:51cde37e-5af3-46d0-9764-b017802b987c
Data IC-751 (original): https://files.acrobat.com/a/preview/03d5a3e1-9483-46e7-97b6-3e4d03673f84
Data IC-751 CUNABAF y CB 11 metros (adaptada para Venezuela): https://files.acrobat.com/a/preview/72e0e390-3d61-46d1-9529-339291f97e0e
Data IC-271 (10-07-2018): https://files.acrobat.com/a/preview/019eba4f-e4fa-4659-99ef-b4b4aa47d362
Corregir alta temperatura en equipos Icom IC-751, IC745, IC-M700 y otros:
QRV
Data IC-751 (original): https://files.acrobat.com/a/preview/03d5a3e1-9483-46e7-97b6-3e4d03673f84
Data IC-751 CUNABAF y CB 11 metros (adaptada para Venezuela): https://files.acrobat.com/a/preview/72e0e390-3d61-46d1-9529-339291f97e0e
Data IC-271 (10-07-2018): https://files.acrobat.com/a/preview/019eba4f-e4fa-4659-99ef-b4b4aa47d362
Corregir alta temperatura en equipos Icom IC-751, IC745, IC-M700 y otros:
QRV