El PIC16F72-I/SP funciona como un microcontrolador RISC de arquitectura Harvard de 8 bits con buses de memoria de programa y de datos independientes.
Arquitectura Harvard: El PIC16F72 utiliza una arquitectura Harvard modificada en la que la memoria de programa y la memoria de datos tienen espacios de direcciones y buses separados. El bus de memoria de programa tiene 14 bits de ancho (para acomodar instrucciones de 14 bits), mientras que el bus de memoria de datos tiene 8 bits de ancho. Esta separación permite el acceso simultáneo a instrucciones y datos, mejorando el rendimiento en comparación con las arquitecturas von Neumann en las que las instrucciones y los datos comparten el mismo bus.
Conjunto de instrucciones RISC: El conjunto de instrucciones consta de sólo 35 instrucciones de una palabra (excepto las ramas de programa, que son de dos ciclos). La mayoría de las instrucciones se ejecutan en un solo ciclo (200 ns a 20 MHz). Las instrucciones tienen 14 bits de ancho e incluyen operaciones aritméticas (ADD, SUB), lógicas (AND, OR, XOR), de movimiento de datos (MOV, SWAP), de manipulación de bits (BSF, BCF, BTFSS, BTFSC) y de control (GOTO, CALL, RETURN, RETLW). El sencillo conjunto de instrucciones reduce el tamaño del código y el tiempo de ejecución de las aplicaciones orientadas al control.
Funcionamiento en pipeline: El PIC16F72 utiliza un pipeline de 2 etapas: mientras se ejecuta una instrucción, la siguiente se obtiene de la memoria de programa. Este solapamiento permite que la mayoría de las instrucciones se ejecuten en un solo ciclo. Las instrucciones de bifurcación (GOTO, CALL) tardan dos ciclos porque la tubería debe ser vaciada y rellenada con la instrucción de destino.
Memoria de programa: La memoria de programa Flash de 2K x 14 bits almacena el código de aplicación. El contador de programa es de 13 bits de ancho, permitiendo el direccionamiento de hasta 8K posiciones (el PIC16F72 utiliza sólo 2K de este espacio). El vector de reinicio está en la dirección 0x0000, y el vector de interrupción está en la dirección 0x0004. La Flash es programable en serie en circuito (ICSP) a través de los pines PGD y PGC, lo que permite actualizar el firmware sin retirar el dispositivo de la placa.
Memoria de datos (RAM): Los 128 bytes de memoria de datos están organizados como un archivo de registro en bancos. La memoria de datos está dividida en cuatro bancos (Banco 0-3), cada uno de hasta 128 bytes. Los Registros de Función Especial (SFR) que controlan los periféricos ocupan las direcciones inferiores de cada banco. Los Registros de Propósito General (GPRs) para variables de usuario ocupan las direcciones superiores. El banco se selecciona mediante los bits RP1:RP0 del registro STATUS. La mayoría de las aplicaciones utilizan sólo el Banco 0 y el Banco 1 para la mayoría de las operaciones.
Pila de hardware de 8 niveles: La pila de hardware almacena las direcciones de retorno de las instrucciones CALL y las rutinas de servicio de interrupción. La pila tiene 13 bits de ancho (coincidiendo con el contador de programa) y 8 niveles de profundidad. No hay detección de desbordamiento o subdesbordamiento de la pila; si se superan las 8 llamadas anidadas, se pierde la dirección de retorno más antigua. La pila no es accesible como memoria de datos (a diferencia de otras arquitecturas MCU).
Sistema de interrupciones: El PIC16F72 tiene un único vector de interrupción en 0x0004. Todas las fuentes de interrupción comparten este vector, y la rutina de servicio de interrupción debe sondear los bits de bandera de interrupción para determinar qué fuente activó la interrupción. Las fuentes de interrupción incluyen: Desbordamiento TMR0, desbordamiento TMR1, captura/comparación CCP, eventos MSSP (SPI/I2C), conversión A/D completa, y pin INT externo (RB0). Los registros INTCON, PIE1 y PIR1 controlan la activación de interrupciones y las banderas.
Temporizador0: temporizador/contador de 8 bits con un preescalador programable de 8 bits (1:2 a 1:256). Puede ser sincronizado desde el reloj de ciclo de instrucción interno (FOSC/4) o desde un pin externo (RA4/T0CKI). El preescalador se comparte con el temporizador de vigilancia; puede asignarse al Timer0 o al WDT, pero no a ambos simultáneamente.
Temporizador1: temporizador/contador de 16 bits con preescalador programable (1:1, 1:2, 1:4, 1:8). Puede ser sincronizado desde FOSC/4, desde un pin externo (RC0/T1CKI), o desde un oscilador de cristal externo de 32,768 kHz conectado a los pines T1OSO y T1OSI. La opción del oscilador de cristal permite que Timer1 sirva como reloj en tiempo real que sigue funcionando durante el modo SLEEP.
Temporizador2: Temporizador de 8 bits con un registro de periodo de 8 bits (PR2) y un preescalador (1:1, 1:4, 1:16) y un postescalador (1:1 a 1:16). Timer2 se utiliza principalmente como la base de tiempo PWM para el módulo CCP. Cuando TMR2 es igual a PR2, se reinicia en el siguiente ciclo y activa el postescalador.
Módulo CCP: El módulo de Captura/Comparación/PWM funciona en tres modos. (1) Modo captura: captura el valor de Timer1 cuando se produce un evento en el pin RC2/CCP1 (flanco ascendente, descendente o cada 4/16 flanco ascendente). (2) Modo comparación: genera una interrupción o evento de salida cuando Timer1 coincide con el valor del registro CCPR1. (3) Modo PWM: genera una señal PWM con una resolución de ciclo de trabajo de 10 bits en el pin RC2/CCP1. El periodo PWM se establece mediante PR2 y el preescalador de Timer2; el ciclo de trabajo se establece mediante el registro CCPR1L y los bits CCP1X:CCP1Y.
Módulo ADC: El ADC de 5 canales y 8 bits convierte una tensión de entrada analógica en uno de los pines AN0-AN4 (RA0-RA4) en un valor digital. La conversión utiliza un algoritmo de aproximación sucesiva con un tiempo de conversión de aproximadamente 20 us a la máxima velocidad de reloj recomendada. La tensión de referencia del ADC es la tensión de alimentación (VDD). El resultado se almacena en el registro ADRES.
Módulo MSSP: El puerto serie síncrono maestro puede configurarse como maestro SPI o esclavo I2C. En modo SPI, genera el reloj (SCK) y controla la transferencia de datos a dispositivos SPI externos. En modo I2C, responde a la dirección I2C esclavo, recibiendo y transmitiendo datos bajo control maestro. La implementación I2C soporta direccionamiento de 7 bits y modo estándar (100 kHz).