Introduction: CPU 8 BITS OVER ARDUINO (SDK-8BITS/8085AH)

About: Ing Electronics, Hobbies Electronics, RTOS, Programs, Embebed systems, Tecnology Retro and future.

Durante mi tiempo de dictar clases en la Universidad Central de Venezuela, siempre ocurría el problema de realizar el proyecto de microprocesadores I; sin muchos materiales, poco CLO2, backelitas etc. Me dispuse a realizar un microsistema intercambiador de microprocesadores de 8 Bits soportado por Arduino; como es esto: Usted elige el microprocesador como elemento intercambiador y controlador por logica del arduino para realizar practicas de diseño de computador; quedando un microcomputador pseudo virtualizado en los elementos de control. La idea surge de realizar un MICROPROCESADOR (los procesadores 8085, 8052, 8088, Z80 y 6502) como procesador principal programado por el Arduino como biblioteca y aprovechar el uso de las librerías de Arduino como base para programar la RAM/EPROM/EEPROM/PIA sobre USB (sin uso del RS232, cables etc) y otros circuito integrados TTL obsoletos; lo único admisible en el proyecto es usar RAMs o PIA 8155/8255 etc. El fin del proyecto es dictar el curso de MICROPROCESADORES I y plantear la evolución y uso de 8 bits como base a estudio de arquitectura de computadores. El diseño plantea generalizar el uso de microprocesador diseñando un librería para Arduino. Incorporar integrador TTL en forma de software y proporner el intercambio de dichos dispositivos para dictar clases de microprocesadores I-UCV/EIE.

Asimismo, aquellos entusiastas de los excelentes procesadores de 8bits que marcaron una epoca!!! espero me apoyen y disfruten el desarrollo del SDK-8BITS.

Step 1: Step 1: Paso Del Diseño.

Mi primer diseño lo implemente usando el 8155 como base a la memoria RAM (Programas) y puertos PIA del 8085 Microprocesador (Integradro emblematico INTEL).

Adjunto el Esquema del Desarrollo (Vs1). (hecho a mano)

Observe que el bloque que representa el ARDUINO (NANO) funciona como elemento de comunicación puerto USB al PC (Asi uso drivers propios de Arduino, sin problemas de usar drivers de USB distintos) se encuentra el bus bidireccional (compatible con varios integrados de 8 Bits INTEL, 8085, 8051, 8052...) justo con el puerto digital del ARDUINO D2..D9 vs AD0..AD7 (pines 12..19) del 8155 y luego uso los puertos D10..D13 como puerto de control del 8155 (PIA). Mediante el uso del Arduino desarrollo una funciones de Lectura y Escritura de MEMORIA del 8155. Es importante, señalar el uso del bus de control del 8155.

Io/M: indica al 8155 si uso memoria o puerto de I/O.

/RD: Lectura de la memoria RAM.

/WR: Escritura de memoria RAM.

ALE: Habilita el LATCH del captura de Direcciones en el puerto Bidireccional del 8155 y del 8085 AH.

Step 2: Step 2: Control Del 8085.

Adjunto imagenes de control de 8085, es de recordar que el proyecto puede incluir el 8052 como CPU totalmente compatible (en cuanto al bus bidireccional como el de control, ojo cuando PSEN = 0 en forma de microprocesador y busqueda de memoria externa).

Note el bus de control del 8155 PIA:

ALE: normalmente en 0 como lectura de DATOS, al hacer el cambio a 1 activa el LATCH interno del 8085AH, 8051, 8155 (PIA).

/WR: Pin de lectura normalmente en 1 indicando sin actividad, cuando el Arduino le mande un 0 le indicará a la memoria RAM del 8155 que ALMACENE DATO en lla memoria.

/RD: Pin de Escritura normalmente en 1 indicando sin actividad, cuando el Arduino le mande un 0 le indicará a la memoria RAM del 8155 que LEA DATO de la memoria.

io/M: Pin del 8155 que indica que actividad va hace ejecución el PIA posee 3 puerto de io y una memoria RAM de 256 posiciones de 8 bits, al indicar 0; le informa al 8155 que use la memoria para las actividades de RD y WR.

Step 3: Step 3: Montaje.

Incluyo en esta imagen el montaje del arduino NANO que lo uso para programar su memoria (8155/PIA) una vez programada salgo del estado de RESET (HiZ del procesador) y lo coloco en RUN (Reset en 1), el CPU leerá el programa en el buen assembler y procedera a realizar las ejecuciones almacenadas en el 8155. Note el CPU 8085AH con sus elementos de control y oscilador (resistencia 10K y 33pf para unos 100KHz de velocidad aproximadamente).

Step 4: Step 4: Programación Del Arduino.

Que queremos realizar aca: Un SDK-85, es decir un metodo para incorporar el programa HEX a la memorias del 8155 RAM. Note en la imagen un antes y un despues de la lectura de la memoria RAM del 8155. Solo queda realizar un IDE que incorpore las facilidades de inclusion de programas .HEX y que lea el Assembler.

Por ello procedí a realizar las dos funciones que adjunto a continuación:

LECTURA DE RAM DEL 8155:

int lectura_RAM(int direccion)
{ //CONDICION NORMAL digitalWrite(ale, LOW); digitalWrite(wr_, HIGH); digitalWrite(rd_, HIGH); digitalWrite(iom, LOW); //MEMORIA

//COLOCO DIRECCION QUE DESEO LEER pinMode(ad7, OUTPUT); pinMode(ad6, OUTPUT); pinMode(ad5, OUTPUT); pinMode(ad4, OUTPUT); pinMode(ad3, OUTPUT); pinMode(ad2, OUTPUT); pinMode(ad1, OUTPUT); pinMode(ad0, OUTPUT); //DIRECCION 0x00 ad0 = direccion % 2; direccion = direccion / 2; ad1 = direccion % 2; direccion = direccion / 2; ad2 = direccion % 2; direccion = direccion / 2; ad3 = direccion % 2; direccion = direccion / 2; ad4 = direccion % 2; direccion = direccion / 2; ad5 = direccion % 2; direccion = direccion / 2; ad6 = direccion % 2; direccion = direccion / 2; ad7 = direccion % 2; Serial.print(ad7); Serial.print("-"); Serial.print(ad6); Serial.print("-"); Serial.print(ad5); Serial.print("-"); Serial.print(ad4); Serial.print("-"); Serial.print(ad3); Serial.print("-"); Serial.print(ad2); Serial.print("-"); Serial.print(ad1); Serial.print("-"); Serial.print(ad0); Serial.println("-");

digitalWrite(ad7, LOW); digitalWrite(ad6, LOW); digitalWrite(ad5, LOW); digitalWrite(ad4, LOW); digitalWrite(ad3, LOW); digitalWrite(ad2, LOW); digitalWrite(ad1, LOW); digitalWrite(ad0, LOW); //ALE alee();

//LEO EL DATO 00h pinMode(ad7, INPUT); pinMode(ad6, INPUT); pinMode(ad5, INPUT); pinMode(ad4, INPUT); pinMode(ad3, INPUT); pinMode(ad2, INPUT); pinMode(ad1, INPUT); pinMode(ad0, INPUT);

//LEO LA INF EN LA DIRECCION 0x00 digitalWrite(rd_, HIGH); delay(10); digitalWrite(rd_, LOW); delay(10); digitalWrite(rd_, HIGH); delay(10);

int sad7 = digitalRead(ad7); int sad6 = digitalRead(ad6); int sad5 = digitalRead(ad5); int sad4 = digitalRead(ad4); int sad3 = digitalRead(ad3); int sad2 = digitalRead(ad2); int sad1 = digitalRead(ad1); int sad0 = digitalRead(ad0);

return sad7*128+sad6*64+sad5*32+sad4*16+sad3*8+sad2*4+sad1*2+sad0; }

ESCRITURA DEL RAM DEL 8155:

void escritura_RAM()

{ //CONDICION NORMAL digitalWrite(ale, LOW); digitalWrite(wr_, HIGH); digitalWrite(rd_, HIGH); digitalWrite(iom, LOW); //MEMORIA

//COLOCO DIRECCION QUE DESEO ESCRIBIR pinMode(ad7, OUTPUT); pinMode(ad6, OUTPUT); pinMode(ad5, OUTPUT); pinMode(ad4, OUTPUT); pinMode(ad3, OUTPUT); pinMode(ad2, OUTPUT); pinMode(ad1, OUTPUT); pinMode(ad0, OUTPUT); digitalWrite(ad7, LOW); digitalWrite(ad6, LOW); digitalWrite(ad5, LOW); digitalWrite(ad4, LOW); digitalWrite(ad3, LOW); digitalWrite(ad2, LOW); digitalWrite(ad1, LOW); digitalWrite(ad0, LOW);

//PULSO ALE COLOCO DIRECCION alee();

//COLOCO DATO EN AD PARA GRABAR int dato= 100;

digitalWrite(ad7, LOW); digitalWrite(ad6, HIGH); digitalWrite(ad5, LOW); digitalWrite(ad4, HIGH); digitalWrite(ad3, LOW); digitalWrite(ad2, HIGH); digitalWrite(ad1, LOW); digitalWrite(ad0, HIGH); //GRABO LA INF EN LA DIRECCION 0x00 digitalWrite(wr_, HIGH); delay(10); digitalWrite(wr_, LOW); delay(10); digitalWrite(wr_, HIGH); delay(10); }

void alee() { digitalWrite(ale, LOW); delay(10); digitalWrite(ale, HIGH); delay(10); digitalWrite(ale, LOW); delay(10); }