sábado, 23 de junio de 2018

PROGRAMACIÓN DE MEMORIAS RAM ICOM IC-751, IC-271 Y OTROS ( Electrónicamente )


PROGRAMACIÓN ELECTRÓNICA DE MEMORIAS ICOM-RAM


Por: Ing. Ramón Miranda, YY5RM (ramon.miranda811@hotmail.com)

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.

Es importante aclarar que las modificaciones de equipos Icom, descritas en el presente artículo, son exclusivamente en calidad experimental.  Al culminar los ensayos, el equipo debe retornar a su diseño original.



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 20Resultado: 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 20Resultado: 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 21Resultado: 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:
Nota importante: Ejecutando el programa ICOM-RAM.exe (diseñado por el Colega N2CBU), mediante computadores personales (PC) y sistemas operativos actuales, es posible obtener errores de incompatibilidad, seguramente corregible mediante amplios conocimientos informáticos. En este ejemplo se procedió a cargar la data del mismo archivo anterior (ram751.bin), desde un PC de 64 bits, en ambientes Windows XP, 7 ó 10 (se usaron las herramientas: “Solucionar problemas de compatibilidad”, “Virtual PC” y “Setver”, con resultados negativos).




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.





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.




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.
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.
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.




EQUIVALENCIAS PARA EL ARDUINO UNO



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



Este y otros artículos que he escrito, son de libre uso y sus últimas versiones siempre estarán disponibles en https://www.qrz.com/db/YY5RM o ingresando a www.qrz.com (YY5RM en el buscador).

Hasta la próxima.  73´S.  QRV.



Por: Ing. Ramón Miranda.
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):