Este artículo necesita citas adicionales para su verificación . ( diciembre de 2009 ) ( Aprenda cómo y cuándo eliminar este mensaje de plantilla ) |
El microcontrolador COP8 de National Semiconductor es un microcontrolador de núcleo CISC de 8 bits , cuyas principales características son:
- Gran cantidad de pines de E / S
- Hasta 32 KB de memoria Flash / ROM para código y datos
- EMI muy bajo (sin errores conocidos)
- Muchos periféricos integrados (pensados como diseño de un solo chip)
- Programación en el sistema
- Cadena de herramientas de ensamblador gratis . Compiladores comerciales de C disponibles
- Libre de multitarea OS y TCP / IP stack
Tiene un ciclo de máquina de hasta 2 millones de ciclos por segundo, pero la mayoría de las versiones parecen poder overclockear hasta 2,8 millones de ciclos por segundo (reloj de 28 MHz). [ cita requerida ]
Registros y mapa de memoria [ editar ]
La COP8 utiliza espacios de datos e instrucción separados ( arquitectura de Harvard ). [1] : 2-1 [2] : 2-4 El espacio de direcciones de instrucciones es de 15 bits (32 KiB como máximo), mientras que las direcciones de datos son de 8 bits (256 bytes como máximo, ampliadas mediante cambio de banco).
Para permitir la detección de errores de software, todas las direcciones de instrucciones no válidas se leen como cero, que es una instrucción de captura. La RAM no válida por encima de la pila se lee como todos unos, que es una dirección no válida.
La CPU tiene un acumulador de 8 bits y un contador de programa de 15 bits . Se mapean en memoria 16 registros adicionales de 8 bits (R0 – R15) y una palabra de estado de programa de 8 bits . Hay instrucciones especiales para acceder a ellos, pero también se pueden usar instrucciones generales de acceso a la RAM.
El mapa de memoria se divide en la mitad de RAM y la mitad de registros de control de la siguiente manera:
Direcciones | Usar |
---|---|
0x00–6F | RAM de uso general, utilizada para la pila |
0x70–7F | Sin usar, se lee como todo uno (0xFF) para atrapar subflujos de pila |
0x80–8F | Sin usar, se lee sin definir |
0x90 – BF | Registros de control periférico adicionales |
0xC0 – CF | Registros de control periférico. |
0xD0 – DF | Puertos de E / S de propósito general L, G, I, C y D |
0xE0 – E8 | Reservado |
0xE9 | Registro de desplazamiento de microhilos |
0xEA – ED | Se registra el temporizador 1 |
0xEE | Registro CNTRL, bits de control para microcable y temporizador 1 |
0xEF | PSW, palabra de estado del programa de la CPU |
0xF0 – FB | R0 – R11, registros de propósito general (RAM adicional) |
0xFC | R12, también conocido como X, registro de puntero indirecto secundario |
0xFD | R13, también conocido como SP, registro de puntero de pila |
0xFE | R14, también conocido como B, registro de puntero indirecto primario |
0xFF | R15, también conocido como S, registro de extensión de segmento de datos |
Si la RAM no está almacenada, entonces R15 (S) es simplemente otro registro de propósito general. Si la RAM está almacenada, la mitad inferior del espacio de direcciones de datos (direcciones 0x00–7F) se dirige a un banco de RAM seleccionado por S. Los registros de propósito especial en la mitad superior del espacio de direcciones de datos siempre están visibles. Los registros de datos en 0xF x se pueden utilizar para copiar datos entre bancos.
Los bancos de RAM distintos del banco 0 tienen todos los 128 bytes disponibles. La pila (direccionada a través del puntero de pila) siempre está en el banco 0, sin importar cómo esté configurado el registro S.
Transferencias de control [ editar ]
Además de 3 bytes JMP
y JSR
las instrucciones que puede abordar todo el espacio de direcciones, las versiones de 2 bytes de estas instrucciones pueden saltar dentro de una página de 4K. La instrucción especifica los 12 bits bajos y los 3 bits altos de la PC se conservan. (Están pensados principalmente para modelos con hasta 4K de ROM).
También hay instrucciones indirectas de salto e indirecto de acumulador de carga que utilizan el contenido del acumulador como los 8 bits bajos de una dirección; se conservan los 7 bits altos de la PC actual.
Para bifurcaciones de corta distancia, hay 63 instrucciones de 1 byte que realizan bifurcaciones relativas a PC desde PC-32 a PC + 31. Esta es una adición de 15 bits y no se aplican requisitos de límites de página.
Las ramas condicionales per se no existen, ni el procesador proporciona los indicadores de estado ZCVN tradicionales , aunque la palabra de estado del programa contiene indicadores de acarreo y medio acarreo para aritmética multibyte. Más bien, hay una serie de instrucciones para comparar y omitir. Por ejemplo, IFEQ
compara sus dos operandos y omite la siguiente instrucción si no son iguales. Se puede omitir cualquier instrucción; no se limita a las sucursales.
Una característica única de la arquitectura COP8 es la IFBNE
instrucción. Esto compara los 4 bits bajos del registro B (puntero de memoria) con una constante inmediata de 4 bits, y se puede usar para hacer un bucle hasta que B llegue al final de un búfer pequeño (hasta 16 bytes).
Una extensión interesante de este mecanismo es la RETSK
instrucción de retorno y salto, que permite que cualquier llamada de subrutina salte condicionalmente la siguiente instrucción. Esto proporciona una forma muy compacta de devolver un valor booleano de una subrutina.
Conjunto de instrucciones [ editar ]
Los operandos COP8 se enumeran en destino, orden de origen. La mayoría de las instrucciones tienen el acumulador A como uno de los operandos. El otro operando generalmente se elige entre un valor inmediato de 8 bits, una dirección RAM de 8 bits o [B]
la dirección RAM seleccionada por el registro B. Algunas instrucciones también soportan RAM abordar por el registro X ( [X]
), y post-inc / decremento variantes ( [B+]
, [B−]
, [X+]
, [X−]
).
El direccionamiento indirecto a través de B es particularmente rápido y se puede realizar en el mismo ciclo en el que se ejecuta la instrucción.
Por otro lado, el direccionamiento RAM absoluto no se codifica directamente en la mayoría de los casos. Más bien, un código de operación de prefijo de "direccionamiento directo" especial, seguido de una dirección de 1 byte, puede preceder a cualquier instrucción con un [B]
operando y lo cambia a un operando directo de memoria. Esto agrega dos bytes y tres ciclos a la instrucción. (Las instrucciones de salto condicional omiten el prefijo y la siguiente instrucción como un par).
Todas las instrucciones de "movimiento" se llaman LD
(carga) incluso si el destino es una dirección de memoria. Inusualmente, no hay LD
instrucciones con el acumulador como fuente; las tiendas se realizan con la X
instrucción que intercambia el acumulador con el operando de memoria, almacenando A y cargando el contenido de la memoria anterior. (Esto no requiere tiempo adicional; X A,[B]
es una instrucción de un ciclo).
Hay instrucciones para buscar de tablas en ROM. Estos combinan los 7 bits altos del contador de programa (PCU) con el acumulador, obtienen un byte de esa dirección y lo colocan en el acumulador ( LAID
instrucción) o los 8 bits bajos del contador de programa PCL ( JID
instrucción). Debido a que la siguiente instrucción ejecutada debe estar en la misma página de ROM de 256 bytes que la tabla misma, no es posible una tabla de 256 entradas.
Código de operación | Operandos | Mnemotécnico | Ciclos | Descripción | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | - | INTR | 7 | Interrupción de software (push PC, PC ← 0x00ff) |
0 | 0 | 0 | compensar | - | - | JP + disp5 | 3 | PC ← PC + desplazamiento ; saltar 1–31 bytes hacia adelante (desplazamiento = 0 reservado) | ||||
0 | 0 | 1 | 0 | Addrhi | addrlo | - | JMP addr12 | 3 | Dirección de PC [11: 0] ← . Los 3 mejores bits de PC conservados. | |||
0 | 0 | 1 | 1 | Addrhi | addrlo | - | JSR addr12 | 5 | Saltar a la subrutina: presione PC, proceda como JMP. | |||
0 | 1 | 0 | 0 | k | - | - | IFBNE # imm4 | 1 | Ejecute la siguiente instrucción si (B & 15) ≠ k ; omitir si (B & 15) = k . | |||
0 | 1 | 0 | 1 | k | - | - | LD B, # imm4 | 1 | B ← 15 - k (cero extendido) | |||
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | k | - | ANDSZ A, # imm8 * | 2 | Omitir si A & k = 0 (= IFBIT # bit , A) |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | addrlo | - | JSRB addr8 † | 5 | Pulse PC, salte a la subrutina de ROM de arranque en la dirección [5] |
0 | 1 | 1 | 0 | 0 | 0 | 1 | - | - | - | (reservado para la ROM de arranque † ) [5] | ||
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | - | - | CLR A | 1 | A ← 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | - | - | INTERCAMBIAR A | 1 | A ← A << 4 | A >> 4; intercambiar bocados |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | - | - | DCOR A | 1 | Decimal correcto después de la suma BCD |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | - | - | PRESIONE A * | 3 | [SP] ← A, SP ← SP − 1 |
0 | 1 | 1 | 0 | 1 | un poco | - | - | RBIT # bit , [B] | 1 | Restablecer (borrar a 0) un bit de RAM dado | ||
0 | 1 | 1 | 1 | 0 | un poco | - | - | IFBIT # bit , [B] | 1 | Pruebe el bit de RAM dado, omita si es cero | ||
0 | 1 | 1 | 1 | 1 | un poco | - | - | SBIT # bit , [B] | 1 | Establecer (en 1) el bit de RAM dado | ||
1 | 0 | 0 | metro | 0 | código de operación | operando | - | Operaciones ALU, A ← A operando op | ||||
1 | 0 | 0 | 0 | 0 | código de operación | - | - | OP A, [B] | 1 | Operación ALU con A y [B] (con [ dirección ] usando el prefijo DIR) | ||
1 | 0 | 0 | 1 | 0 | código de operación | k | - | OP A, # imm8 | 2 | Funcionamiento ALU con A e inmediato k | ||
1 | 0 | 0 | metro | 0 | 0 | 0 | 0 | operando | - | ADC A, operando | C, A ← A + operando + C; agregar con llevar | |
1 | 0 | 0 | metro | 0 | 0 | 0 | 1 | operando | - | SUBC A, operando | C, A ← A + ~ operando + C (A - operando - ~ C) | |
1 | 0 | 0 | metro | 0 | 0 | 1 | 0 | operando | - | IFEQ A, operando | Omitir si operando A ≠ | |
1 | 0 | 0 | metro | 0 | 0 | 1 | 1 | operando | - | IFGT A, operando | Omitir si A ≤ operando | |
1 | 0 | 0 | metro | 0 | 1 | 0 | 0 | operando | - | AÑADIR A, operando | Un operando ← A + (¡transporte sin cambios!) | |
1 | 0 | 0 | metro | 0 | 1 | 0 | 1 | operando | - | Y A, operando | A ← A & operando | |
1 | 0 | 0 | metro | 0 | 1 | 1 | 0 | operando | - | XOR A, operando | A ← A ^ operando | |
1 | 0 | 0 | metro | 0 | 1 | 1 | 1 | operando | - | O A, operando | A ← A | operando | |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | - | - | IFC | 1 | Omitir si se lleva claro |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | - | - | IFNC | 1 | Omitir si se lleva el juego |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | - | - | INC A | 1 | A ← A + 1 (acarreo sin cambios) |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | - | - | DIC A | 1 | A ← A - 1 (acarreo sin cambios) |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | - | - | POP A * | 3 | SP ← SP + 1, A ← [SP] |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | - | - | RETSK | 5 | Pop PC, omita una instrucción |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | - | - | RETIRADO | 5 | Pop PC alto, pop PC bajo |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | - | - | RETI | 5 | Regresar y habilitar interrupciones |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | k | - | LD A, # imm8 | 2 | A ← k |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | k | - | IFNE A, # imm8 * | 2 | Omitir si A = k |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | k | - | LD [B +], # imm8 | 3 | [B] ← k , B ← B + 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | k | - | LD [B -], # imm8 | 3 | [B] ← k , B ← B - 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | dirección | - | XA, addr8 | 3 | A ↔ [ dirección ], intercambio |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | dirección | - | LD A, addr8 | 3 | A ← [ dirección ] |
1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | k | - | LD [B], # imm8 | 2 | [B] ← k |
1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | k | - | LD B, # imm8 * | 2 | B ← k (= LD R14, # k , un ciclo más rápido) |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | - | - | RC | 1 | C ← 0; restablecer llevar a 0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | - | - | CAROLINA DEL SUR | 1 | C ← 1; establecer llevar a 1 |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | - | - | XA, [B +] | 2 | A ↔ [B], B ← B + 1 |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | - | - | XA, [B−] | 2 | A ↔ [B], B ← B − 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | - | - | ESTABLECIDO | 3 | A ← ROM [PCU: A]; cargar desde ROM |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | - | - | JID | 3 | PCL ← ROM [PCU: A]; saltar a través de la tabla ROM |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | - | - | XA, [B] | 1 | A ↔ [B] |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | - | - | (reservado) | ||
1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | - | - | RLC A * | 1 | C, A ← A, C; girar a la izquierda a través de acarreo (= ADC A, A) |
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | dirección | k | IFEQ addr8 , # imm8 * | 3 | Omitir si [ dirección ] ≠ k |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | - | - | LD A, [B +] | 2 | A ← [B], B ← B + 1 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | - | - | LD A, [B−] | 2 | A ← [B], B ← B − 1 |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | Addrhi | addrlo | JMPL addr15 | 4 | PC ← dirección |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | Addrhi | addrlo | JSRL addr15 | 5 | Pulse PC, PC ← dirección |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | - | - | LD A, [B] | 1 | A ← [B] |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | - | - | (reservado) | ||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | - | - | RRC A | 1 | A, C ← C, A; girar a la derecha a través del transporte |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | - | - | (reservado) | ||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | - | - | XA, [X +] | 3 | A ↔ [X], X ← X + 1 |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | - | - | XA, [X−] | 3 | A ↔ [X], X ← X − 1 |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | - | - | VIS * | 5 | PC ← ROM [ tabla de vectores ]; Selección de interrupción vectorial |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | - | - | RPND * | 1 | Restablecer el indicador de interrupción pendiente |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | - | - | XA, [X] | 3 | A ↔ [X] |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | - | - | (reservado) | ||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | - | - | NOP | 1 | No operacion |
1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | - | - | IFNE A, [B] * | 1 | Omitir si A = [B] |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | - | - | LD A, [X +] | 3 | A ← [X], X ← X + 1 |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | - | - | LD A, [X−] | 3 | A ← [X], X ← X − 1 |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | dirección | k | LD addr8 , # imm8 | 3 | [ dirección ] ← k |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | dirección | - | DIR addr8 | 3 | Cambiar el operando de la siguiente instrucción de [B] a [ dirección ] |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | - | - | LD A, [X] | 3 | A ← [X] |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | (reservado) | ||
1 | 1 | 0 | 0 | Registrarse | - | - | Registro DRSZ | 3 | registrar ← registrar - 1, saltar si el resultado es cero | |||
1 | 1 | 0 | 1 | Registrarse | k | - | Registro LD , # imm8 | 3 | registro ← k (= LD 0xf0 + registro , # k , un byte más corto) | |||
1 | 1 | 1 | compensar | - | - | JP - disp5 | 3 | PC ← PC - 32 + desplazamiento ; saltar de 1 a 32 bytes hacia atrás | ||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | Mnemotécnico | Ciclos | Descripción |
*: Solo en núcleos de "familia de funciones" (COP888 / COP8SA); no presente en núcleos de "familia básica" (COP800).
†: Solo en modelos de "familia flash" (COP8TA / COP8C) con ROM de arranque para programación en el sistema
Referencias [ editar ]
- ^ a b Manual del usuario básico de la familia COP8 (PDF) . Revisión 002. National Semiconductor . Junio de 1996. Número de literatura 620895-002 . Consultado el 2 de enero de 2021 .
- ↑ a b Aleaf, Abdul (julio de 1996). "Comparación de COP878x con la familia COP8SAx7 mejorada - Consideraciones de hardware / software" (PDF) . Semiconductor Nacional . Nota de aplicación 1043.
- ^ Manual del usuario de la familia de funciones COP8 . Revisión 005. National Semiconductor . Marzo de 1999. Número de literatura 620897-005. Extraído de la imagen ISO comprimida 530094-003_COP8_Tools_Docs_Aug1999.zip , recuperado el 7 de enero de 2020.
- ^ "Guía del diseñador COP8SAx" (PDF) . Semiconductor Nacional . Enero de 1997. Número de literatura 620894-001.
- ^ a b "Microcontrolador basado en flash CMOS COP8SBR9 / COP8SCR9 / COP8SDR98-Bit con memoria de 32k, EEPROM virtual y caída de tensión" (PDF) (hoja de datos). Semiconductor Nacional . Abril de 2002 . Consultado el 6 de enero de 2021 .
Enlaces externos [ editar ]
- Microcontroladores integrados de semiconductores nacionales ( CR16 y COP8)
- microcontrolador-preguntas frecuentes / COP8 , 1995
- "COP8 Nacional de Semiconductores" . 25 ° Directorio anual de microprocesadores / microcontroladores de EDN. EDN . 24 de septiembre de 1998.