Tema 6: Microcontroladores Carlos Garre del Olmo 1
Microcontroladores Contenidos Introducción a los microcontroladores. Principales familias y sus características. La familia PIC16. Programación de microcontroladores. Diseño de sistemas empotrados. Introducción a los DSP 2
Palabra de Configuración Palabra de configuración: Son 14 bits ubicados en la dirección 2007h de la memoria de programa. Sólo es accesible si la MCU está en modo de programación (mayor voltaje en Vdd). CP (Code Protection): Si está a 0, toda la memoria de programa está protegida. PWRTE: Habilita el Power-up Timer. WDTE: Habilita el Watchdog Timer. FOSC1-FOSC0: Seleccionan la fuente de reloj: 00: LP (Low Power Crystal) Cristal externo con baja frecuencia y mínimo consumo. 01: XT (Crystal/Resonator) Cristal externo con frecuencia media (4MHz) y consumo medio. 10: HS (High Speed Crystal/Resonator) Cristal externo con máximas frecuencia (20MHz) y consumo. 11: RC (Resistor/Capacitor) Circuito RC interno. Depende de: Rext, Cext, Vdd, ºC... 3
Modo SLEEP SLEEP: Instrucción para entrar en modo SLEEP. Para salir del modo SLEEP: Interrupciones: RB0/INT, EEPROM write, PORTB change. Reset externo en el pin MCLR. Fin de cuenta del WDT no provoca reset. La interrupción TMR0 no se puede dar, porque se detiene toda la temporización. Los pines de salida se congelan y mantienen el último valor. Cuando entramos en SLEEP, el WDT se pone a 0 pero no se detiene utiliza su propio oscilador RC. 4
PIC16F87xA 16F876A: 28 pines. 16F877A: Exactamente igual pero con 40 pines (3 más analógicos, y 9 más digitales). Comparten el mismo datasheet! 16F873A: Versión reducida del 16F876 (/2 las tres memorias). 16F874A: Versión reducida del 16F877 (/2 las tres memorias). Nos centramos en el 16F876A: Mismo juego de instrucciones que 16F84A. 14 3KB programa, 368B RAM, 256B EEPROM. 14 fuentes de interrupción. USART, SPI, I2C. 2x CCP. 2x Timers 8 bits + 1x 16 bits. 5 ADC de 10 bits. Sólo en los A: 2 comparadores analógicos. Puertos E/S: A (6b), B (8b), C (8b) MUX... 5
Arquitectura PIC16F876A 6
Memoria de datos del PIC16F876A Dividida en 4 bancos (RP1-RP0). No sólo cambian los SFR, sino también los GPR. Algunos SFR nuevos: PORTC, TRISC. PIR1, PIR2, INTCON, PIE1, PIE2: interrupciones. TMR1L, TMR1H, T1CON: Timer 16b. TMR2, T2CON, PR2: Timer 8b. SSPBUF, SSPCON, SSPCON2, SSPADD, SSPSTAT, TXREG, RCREG, RCSTA, TXSTA, SPBRG: puertos serie. CCPR1L, CCPR1H, CCP1CON: Módulo CCP1 (igual para CCP2). ADRESH, ADRESL, ADCON0, ADCON1: Entradas A/D. Memoria de programa paginada en 4 páginas. 7
16F876A: Interrupciones ADIF: Conversión A/D terminada. RCIF: Buffer de recepción de la USART lleno. TXIF: Buffer de transmisión de la USART lleno. SSPIF: Fin de transmisión SPI ó I2C. CCP1F: Capture en módulo CCP1. TMR2IF: Coinciden registros TMR2 y PR2. TMR1IF: Overflow en Timer 1. CMIF: Ha cambiado la entrada del comparador. BCLIF: Colisión en el bus I2C. CCP2IF: Capture/Compare en módulo CCP2. 8
PIC16F876A: Conversión A/D ADRESH y ADRESL: Resultado de la conversión en 10 bits. ADCON0: configuración del módulo A/D. ADCS2-ADCS0: fuente de reloj (Ej: 001 = Fosc/8). CHS2-CHS0: Selección de canal (hasta 100). GO/DONE: Si lo pones a 1, empieza una conversión. Se pone a 0 por hardware. ADON: Activa/desactiva el módulo A/D. ADCON1: configuración de los pines E/S. ADFM: 1 = Justificado a la derecha: (ADRESH = 000000xx; ADRESL = xxxxxxxx). PCFG3-PCFG0: Configuración de los pines (próxima transparencia...). 9
PIC16F876A: Pines A/D 10
PIC16F876A: Conversión A/D 1. Configurar módulo A/D: TRIS (=entradas), PCFG, ADFM (=1), ADCS (=001), ADON (=1). 2. Configurar interrupciones: ADIF (=0), ADIE (=1), PEIE (=1), GIE (=1). PEIE es la máscara para todas las interrupciones nuevas con respecto al 16F84 (llamadas interrupciones de periféricos). 3. Seleccionar un canal (CHS). 4. Activar el bit GO/DONE Momento en el que muestreamos. 5. Esperar fin de conversión: Polling al bit GO/DONE. Interrupción ADIF. 6. El resultado está en ADRH-ADRL. 7. Limpiar bit ADIF (ADIF = 0). 11
Microcontroladores Contenidos Introducción a los microcontroladores. Principales familias y sus características. La familia PIC16. Programación de microcontroladores. Diseño de sistemas empotrados. Introducción a los DSP 12
Entornos de Desarrollo Los fabricantes de MCUs proveen al usuario de entornos de desarrollo, generalmente gratuitos. Estos entornos constan de varias herramientas: Editor: editor de texto para escribir el código fuente. Compiladores y ensamblador: generación de código máquina partiendo de código ensamblador o de lenguajes de alto nivel (C, Basic, Pascal). Simulador: ejecución del código generado sobre una MCU simulada en el propio PC. Simulación de periféricos, estímulos externos,... Depurador: puntos de ruptura, lectura de memoria, step into/over... Programador: conexión con tarjetas de programación para transmitir el código a la MCU. Emulador: permite emular el sistema sobre el propio circuito. Librerías: multitud de librerías para facilitar la programación. Entorno de desarrollo de Microchip: MPLAB MPLAB C Compiler, MPASM, MPSIM, MPLAB REAL ICE, MPLAB PM3,... Manejo de MPLAB Enunciado de la práctica. 13
PIC16 ASM: Operaciones de Byte ADDWF f,d: Si d=0: W = W + f. Si d=1: f = W + f f es un registro de 0 a 127: direccionamiento directo o indirecto (INDF). Modifica flags Z, C, DC. CLRF f: f = 0. CLRW: W = 0. COMF f,d: W/f = NOT(f). DECF f,d: W/f = f 1 DECFSZ f,d: SZ = Skip if Zero. Si el resultado del decremento es 0, entonces convierte la próxima instrucción en un NOP. MOVF f,d: W/f = f. MOVWF f: f = W. RLF f,d: Rotate Left through carry. SUBWF f,d: W/f = f W SWAPF f,d: d<7,4> = f<3:0>; d<3,0> = f<7,4> ANDWF, INCF, INCFSZ, IORWF, NOP, RRF, XORWF. 14
PIC16 ASM: Operaciones de Bit y de Control Operaciones de Bit: BCF f,b: Pone a 0 el bit b del registro f. BSF f,b: Pone a 1 el bit b del registro f. BTFSC f,b: Si el bit b del registro f es 0, convertimos la siguiente instrucción en un NOP. BTFSS f,b: Si el bit b del registro f es 1, convertimos la siguiente instrucción en un NOP. Operaciones de Control: CALL k: PC se guarda en la pila. PC<10:0> = k (k es de 11 bits). PC<12:11> = PCLATH<4:3> (PCLATH se usa para cambiar de página). Es una instrucción de 2 ciclos! GOTO k: Salto incondicional. No se guarda PC. 2 ciclos! RETFIE y RETURN: Retorno de interrupción y de subrutina. 2 ciclos! RETLW k: Retorno de subrutina, y W=k (8 bits). 2 ciclos! funciones. CLRWDT, SLEEP. 15
PIC16 ASM: Operaciones con Inmediatos ADDLW k: W = W + k (k es de 8 bits). ANDLW k: W = W and k IORLW k: W = W or k MOVLW k: W = k SUBLW k: W = k W XORLW k: W = W xor k processor radix DEC PORTA EQU 0x05 OPTION EQU 0x03 TRISA EQU 0x85 RP0 EQU 5 GOTO main 16F84A main BSF OPTION,RP0 ; Banco 1 (para usar TRISA) CLRF TRISA ; Puerto A = salidas BCF OPTION,RP0 ; Banco 0 (para usar PORTA) loop BCF PORTA,0 BSF PORTA,0 GOTO loop END ; Apagamos led ; Encendemos led ; bucle infinito... 16
PIC16: Programación en C #include <pic16f876a.h> void main(void) { TRISA = 0; // Puerto A = salidas } // Bucle infinito... while (1) { } RA0 = 0; // Apagamos led RA0 = 1; // Encendemos led 17
Proceso de Desarrollo 1. Escribir el código en el editor de MPLAB. 2. Simular y depurar el código. 3. Pinchar el PIC en el programador. 4. Conectar el programador al PC (USB, puerto paralelo, puerto serie...). 5. Enviar el programa desde el PC al programador: MPLAB sólo soporta algunos programadores. En la mayoría de los casos necesitaremos utilizar otro software para comunicarnos con el programador, como IC-Prog: 1. Cargamos en IC-Prog el fichero hexadecimal con el código máquina ya ensamblado. 2. Configuramos IC-Prog para nuestro programador. 3. Configuramos la MCU (code protection, fuente de reloj, WDT...). 4. Escribimos el código. 5. Verificamos la escritura. 6. Desconectamos el programador del PC. 7. Despinchamos el PIC del programador. 8. Pinchamos el PIC en nuestro circuito. 18