Ir al contenido

Arquitectura basica

El PIC18F4550 usa una arquitectura tipo Harvard, donde la memoria de programa y la memoria de datos estan separadas. Esto permite que el microcontrolador busque instrucciones y maneje datos usando espacios distintos.

Comparacion entre arquitectura Von Neumann y Harvard
El PIC18F4550 usa arquitectura Harvard: buses separados para programa (Flash) y datos (RAM). — Basado en Tema 1 — UNEXPO · Ing. Mecatrónica · Microcontroladores

Los seis registros del esquema general estan en Conceptos basicos. Esta figura es solo este chip:

Diagrama de bloques del PIC18F4550: bus de datos, bus de instrucciones, W, ALU, contador de programa, pila y puertos
PIC18F4550: W entra a la ALU, el registro de instruccion (IR) esta en el camino del bus de instrucciones, STKPTR apunta a la pila, y los puertos y perifericos cuelgan del bus de datos. — Diagrama de bloques PIC18F4550 — datasheet Microchip

Los numeros que van junto a las lineas no son direcciones. Dicen cuantos bits caben en ese camino.

NumeroDonde estaQue significa
8Bus de datos, W y la ALUUn byte. Viaja un dato de 0 a 255. Por eso el 8 se repite en casi todos los caminos de datos.
16Bus de instruccionesCada instruccion del PIC18 ocupa 16 bits. Sale de la Flash y entra al RI.
12Direccion de datos y FSRLa direccion de un dato. Con 12 bits se nombran 4096 posiciones. El FSR (el RDD del PIC) es de 12 bits.
4BSR, junto al bancoElige el banco de la memoria de datos. Esos 4 bits, mas los 8 que trae la instruccion, forman la direccion de 12.
21Table PointerPuntero de 21 bits hacia un byte de la memoria de programa. Lo usan las lecturas y escrituras de tabla.
20Junto al contador de programaEl PC llega hasta el bit 20. Se escribe PC<20:0>: del bit 0 al bit 20 hay 21 bits. El 20 del dibujo es ese bit mas alto, el mismo ancho con el que el PC apunta a la Flash.
ElementoFuncion
WREGRegistro de trabajo. Muchas operaciones pasan por el.
STATUSGuarda banderas como cero, acarreo y negativo.
SFRRegistros de funcion especial para controlar perifericos.
GPRRegistros de proposito general, usados como variables.
BSRSelecciona banco de memoria para acceder a registros.
PCContador de programa. Indica la proxima instruccion.

Los nombres de la clase (cualquier micro) y el nombre en el PIC18:

En claseEn el PIC18
Acumulador clasico (despues de la ALU)En el PIC no existe asi: W esta antes de la ALU (WREG)
STATUSSTATUS — banderas C, Z, DC, N, OV
Registros generalesGPR — bytes de la memoria de datos que tu usas como variables
RDDDireccion f de la instruccion (directo) o FSR (indirecto)
SPSTKPTR — tope de la pila
RI / IRRegistro interno del opcode. No lo escribes en el .ASM
PC y pilaPC y la pila de hardware (guarda direcciones, no datos)

La tabla resume el papel de cada uno. Abajo los ves en detalle con ejemplos de lo que haras en laboratorio. El mapa general (sin nombres del PIC) esta en Conceptos basicos — bloques de la CPU.

En el esquema general el ACC queda debajo de la ALU: ahi cae el resultado, y ese mismo valor puede volver a entrar como operando. En el PIC eso no existe. W esta antes de la ALU: es un operando que entra junto con otro dato. El resultado puede volver a un registro o a W.

Comparacion: en un microprocesador tradicional el acumulador queda debajo de la ALU; en el PIC el registro W esta antes de la ALU
Izquierda, microprocesador tradicional: los registros alimentan la ALU y el resultado cae en el acumulador. Derecha, PIC: W entra antes de la ALU y el resultado puede volver a un registro o a W. — Comparacion de clase — acumulador tradicional frente a W del PIC
Microprocesador tradicionalPIC18
Donde estaEl ACC queda debajo de la ALUW (WREG) esta antes de la ALU
Que entra a la ALUUn dato de los registros y, por el lazo, el propio acumuladorW y otro registro
Donde cae el resultadoSiempre en el acumuladorEn un registro (,F) o en W (,W)

Sigue siendo el registro de trabajo de 8 bits (un byte, 0 a 255 — ver Que significa 8 bits).

Piensa en el como una mano temporal del procesador: agarra un valor, opera con el y luego lo suelta en un registro o variable.

MOVLW D'5' ; carga 5 en WREG
ADDLW D'3' ; WREG = 5 + 3 → WREG vale 8
MOVWF contador ; copia WREG al GPR 'contador'

Sin WREG no podrias hacer un MOVLW, sumar dos numeros ni mover datos entre registros con la mayoria de instrucciones del PIC18.

Despues de muchas operaciones, el PIC guarda banderas en STATUS. Cada bandera es un bit: vale 1 (activa) o 0 (inactiva). Lo que importa en el parcial no es solo el nombre, sino que significa cada valor.

BitNombreQue mide
0CAcarreo (carry)
1DCAcarreo de digito (nibble bajo)
2ZResultado cero
4OVDesbordamiento con signo (overflow)
7NSigno del resultado (bit 7)

Que significa activa (= 1) vs inactiva (= 0)

Sección titulada «Que significa activa (= 1) vs inactiva (= 0)»
Bandera= 1 (activa)= 0 (inactiva)
ZEl resultado de la operacion es ceroEl resultado no es cero
CHubo acarreo mas alla del bit 7 (en sumas: el valor supera 255 en 8 bits sin signo)No hubo acarreo hacia afuera del byte
DCHubo acarreo del nibble bajo (del bit 3 al 4)No hubo acarreo de digito
NEl bit 7 del resultado es 1 → numero negativo en complemento a 2 (signed)El bit 7 es 0 → no es negativo en signed 8 bits
OVDesbordamiento con signo: el resultado no cabe en el rango -128 a +127La operacion con signo fue valida

Ejemplo con Z — ¿contador es cero? El PIC no tiene instruccion CMP (comparar); comparas operando y leyendo la bandera Z del registro STATUS:

MOVLW D'0' ; WREG = 0 (con esto vamos a comparar)
XORWF contador, W ; XOR bit a bit entre contador y WREG → resultado en W
; (compuerta XOR: bit igual → 0, bit distinto → 1)
; contador no cambia; solo se actualiza W y las banderas
;
; si contador = 0: todos los bits coinciden con WREG
; → resultado 00000000 → Z = 1 (activa)
; si contador = 5: hay bits distintos de cero
; → resultado 00000101 → Z = 0 (inactiva)

Ejemplo con C tras una suma. WREG solo guarda 8 bits (2⁸ = 256 valores: 0 a 255); si la suma pasa de 255, lo que no cabe se registra en C y en W queda el resto:

MOVLW D'200' ; WREG = 200
ADDLW D'100' ; 200 + 100 = 300
; 300 > 255 → no cabe en 8 bits
; sobra 256 (un byte completo) → C = 1 (acarreo)
; en WREG queda: 300 - 256 = 44

Las usas para decidir con saltos condicionales:

MOVLW D'0' ; referencia: comparar contra 0
XORWF contador, W ; ¿contador == WREG? → si igual, resultado 0, Z=1
BTFSS STATUS, Z ; salta si Z=1 (contador era 0)
GOTO sigue ; si Z=0 → salta al destino
GOTO manejar_cero ; si Z=1 → salta al destino
manejar_cero:
; contador era 0 ...
sigue:
; contador no era 0 ...

BTFSC salta si la bandera esta en 0; BTFSS salta si esta en 1.

En un parcial te pueden preguntar: “¿Como sabes si una operacion dio cero?” → Z = 1. “¿Como sabes si una suma desbordo 255?” → C = 1.

Los SFR (Special Function Registers) controlan el hardware interno: puertos, timers, ADC, UART, interrupciones, etc. Cada bit o byte de un SFR tiene un significado fijo definido por Microchip.

Ejemplo real — encender un LED en RB0. Para cambiar un solo bit de un SFR sin tocar los demas, el PIC usa BCF (Bit Clear File → pone el bit en 0) y BSF (Bit Set File → pone el bit en 1):

BCF TRISB, 0 ; TRISB es SFR, bit 0 → fuerza ese bit a 0
; (los bits 1..7 de TRISB no cambian)
; en TRISB: 0 = salida → RB0 queda como salida
BSF LATB, 0 ; LATB es SFR, bit 0 → fuerza ese bit a 1
; (los bits 1..7 de LATB no cambian)
; RB0 queda en alto → enciende el LED

No escribes el byte entero: BCF/BSF solo modifican el bit que indicas; el resto del registro se queda igual. TRISB y LATB son nombres fijos del hardware — no los inventas tu.

Otros SFR que usaras pronto: INTCON (interrupciones), TMR0 (Timer0), ADCON0 (ADC).

Los GPR son bytes de RAM que tu programa usa como variables: contadores, temporales, estados de una maquina de estados, etc. No controlan hardware directamente; guardan datos.

Con contador RES 1 haces dos cosas a la vez: el nombre (contador) define la variable — un simbolo que usaras en el codigo — y RES 1 le reserva 1 byte en RAM. Despues escribes INCF contador, F y el ensamblador ya sabe que direccion es.

; En la zona de variables:
contador RES 1 ; define 'contador' y reserva 1 byte en RAM
; En el codigo:
INCF contador, F ; contador = contador + 1
MOVF contador, W ; copia contador a WREG
DECFSZ contador, F ; decrementa; si llega a 0, salta la siguiente linea
GOTO espera

La diferencia clave frente a un SFR: contador es tuyo — puedes llamarlo como quieras y usarlo para lo que necesites. TRISB no — su nombre y funcion vienen del hardware.

Tanto los SFR como los GPR viven en la RAM de datos, dividida en bancos (0 a 15). El registro BSR indica en que banco estas parado cuando accedes a una direccion.

Muchos SFR (TRISB, LATB, INTCON…) estan en el banco de acceso (ACCESS) y no necesitas tocar BSR. Pero si reservas variables GPR en distintos bancos con RES, debes seleccionar el banco correcto:

; 'temp' declarada con: temp RES 1
MOVLW 0x01
MOVWF BSR ; activa banco 1
CLRF temp ; limpia la variable GPR en ese banco
CLRF BSR ; vuelve a banco 0

La ALU combina dos operandos y escribe el resultado. En el PIC18 un operando suele ser W (o un literal embebido en la instruccion) y el otro un registro de archivo f (GPR o SFR). Las banderas van a STATUS.

ALU del PIC18: entradas W y registro f, salida segun d hacia W o f, y banderas a STATUS
En el PIC, W esta antes de la ALU. El trapecio naranja es la ALU. d = 0 devuelve el resultado a W; d = 1 lo devuelve al registro f. — Arquitectura PIC18 — UNEXPO

El bit d (destino) de la instruccion dice donde queda el resultado:

dEn el codigoDonde queda el resultado
0 (destino 0),WEn el acumulador W
1,FEn el registro f
ADDWF contador, W ; d = 0 → W = W + contador; contador no cambia
ADDWF contador, F ; d = 1 → contador = contador + W

Como la instruccion dice de donde sale el dato:

ModoQue significaEjemplo
LiteralEl numero viaja dentro de la instruccion. No se lee de RAM.MOVLW .5
Directo (general)La instruccion nombra el registro (f). Ese nombre es la direccion en memoria de datos.MOVF contador, W
IndirectoFSR es el RDD: guarda la direccion. INDF es el dato que hay ahi.MOVF INDF, W lee lo que apunta FSR

Mas detalle de literales y de ,W / ,F en Ensamblador.

MOVLW .20
MOVWF FSR0L ; RDD = direccion 0x20
MOVF INDF0, W ; W = byte que hay en esa direccion

PC (Program Counter) apunta a la siguiente instruccion en Flash. No lo escribes a mano: lo cambian GOTO, BRA, CALL y RETURN.

La pila del PIC18 es un arreglo de direcciones del PC, no de variables. Es LIFO. STKPTR (el SP) marca el tope.

  • PUSH: mete una direccion. CALL hace PUSH de la direccion de retorno y luego carga el PC con el destino.
  • POP: saca esa direccion y la pone en el PC. RETURN hace POP.

CALL tiene que volver. Si no hay RETURN (o RETFIE en una interrupcion), esa direccion nunca sale de la pila: el programa no retoma donde estaba, y varios CALL sin retorno llenan la pila.

Una interrupcion tambien hace PUSH del PC. RETFIE hace POP y ademas vuelve a habilitar las interrupciones. Ver Interrupciones.

InstruccionQue hace con el PC¿Usa la pila?Cuando usarla
CALLSalta a una subrutinaSi — PUSHCodigo que debe volver (RETURN)
RETURNVuelve a la direccion apiladaSi — POPCierre de un CALL
GOTOSalta a cualquier etiquetaNoSaltos lejanos o bucles que no son subrutina
BRASalto relativo y cortoNoBucles locales, como un retardo

BRA y GOTO cambian el PC sin guardar retorno. Por eso un bucle de retardo usa BRA, no CALL. Comparacion de ciclos en Calculo de retardos — BRA vs GOTO.

inicio:
CALL retardo ; PUSH del PC; salta a retardo
GOTO inicio ; no apila: solo cambia el PC
retardo:
; ...
RETURN ; POP: el PC vuelve justo despues del CALL
  1. El PIC lee una instruccion desde memoria de programa.
  2. La decodifica.
  3. Ejecuta la operacion.
  4. Actualiza registros, banderas o perifericos.
  5. Avanza a la siguiente instruccion, salvo que haya salto o interrupcion.

Por que es importante diferenciar SFR y GPR?

Porque los SFR controlan hardware interno como puertos, timers e interrupciones; los GPR se usan como memoria de trabajo para variables del programa.

Examen interactivo

Arquitectura y elementos de la CPU

Basado en: Clase Tema 2 y 3 (1).pdf

0 de 0 respondidas

En arquitectura Harvard, programa y datos...
¿Que registro selecciona el banco de memoria?
Los SFR sirven para...
¿Donde queda el resultado de `MOVLW D'5'` antes de copiarlo con `MOVWF`?
Si la bandera Z de STATUS esta activa (Z = 1), significa que...
¿Que hace el registro PC (Program Counter)?
Un byte declarado con `contador RES 1` es un ejemplo de...
Para configurar RB0 como salida y encender un LED, ¿que registros SFR usarias?
Si C = 1 despues de una suma sin signo de 8 bits, significa que...
Si N = 1 en STATUS, el bit 7 del resultado es 1, lo que indica...
¿Que significa que el PIC18F4550 sea de 8 bits?
Tras `MOVLW D'200'` y `ADDLW D'100'`, ¿que queda en WREG y en la bandera C?
En `ADDWF contador, W`, el destino d = 0 significa que el resultado queda en...
¿Que instruccion cambia el PC sin usar la pila y con salto relativo corto?
En direccionamiento indirecto del PIC18, FSR e INDF son...