;RC<7:0> tiene 8 leds ;RB<0> tiene un pulsador. RB<0>=1/0 es no-pulsado/pulsado PRACTICA 0: TUTORIAL MPLAB + ICD2 Introducción #include "p16f876.inc" Este tutorial muestra las opciones básicas para el ensamblado, linkado, y simulación de programas sobre los PIC, usando el software MPLAB v7.50. También incluye la depuración usando el mismo software junto con el depurador ICD2. La aplicación para el tutorial es una placa con un PIC16F876, conectado a 8 diodos led (en los puertos RC0-RC7), y un pulsador en RB0, tal como aparece en la Fig.1. El reloj del sistema es de tipo RC, de frecuencia 4MHz. PIC16F876 VDD MCLR/VPP RB7/PGD RA0/AN0 RB6/PGC RA1/AN1 RB5 RA2/AN2/VREF+ RB4 RA3/AN3/VREF- RB3/PGM RA4/T0CKI RA5/AN4/SS 4.7kΩ VSS OSC1/CLKIN 22pF OSC2/CLKOUT PC MPLAB VDD VDD VDD VSS RC1/T1OSI/CCP2 RC6/TX/CK 10nF equ 0x20 ;Es un GPR en Banco#0 org 0h ;Vector de RESET nop movlw 00h banksel TRISC ;Banco#1 movwf TRISC ;Todos los bits RC<7:0> de salida bcf OPTION_REG,NOT_RBPU ;Habilita pull-up en RB<7:0> banksel PORTC ;Banco#0 movwf PORTC ;Apaga todos los leds clrf COUNT ;COUNT=0 loop1 btfss PORTB,0 goto inccnt goto loop1 ;Espera a pulsador en RB<0>=0 inccnt incf COUNT,F movf COUNT,W movwf PORTC ;COUNT++ y RC<7:0>=COUNT loop2 btfss PORTB,0 goto loop2 goto loop1 ;Espera a pulsador en RB<0>=1 10kΩ RB1 RB0/INT RC7/RX/DT RC3/SCK/SCL USB o RS232 start RB2 RC0/T1OSO/T1CLK RC2/CCP1 ICD2 COUNT end RC5/SDO Code 1: Código ensamblador del firmware RC4/SDI/SDA Creación del proyecto y Simulación 8x470Ω 8xLED Fig1. Placa de la aplicación El firmware se encarga de controlar el encendido de los leds, en función del número de pulsaciones realizadas sobre el pulsador. Inicialmente los leds se encuentran apagados, y a medida que se realiza una nueva pulsación se muestra por los leds el número de pulsaciones efectuadas, en formato binario. Esta dividido en dos partes, una primera parte de inicialización, que configura los puertos RC0-RC7 como salida y el puerto RB0 como entrada. También se inicializa a cero un GPR (0x20) como contador del número de pulsaciones efectuadas, y se apagan los leds. La segunda parte es un bucle infinito que espera a la pulsación de RB0, incrementa el contador de pulsaciones y muestra su valor por los leds, y espera que se deje de accionar el pulsador antes de continuar con la siguiente iteración del bucle. 1. Arrancar el MPLAB 2. Crear nuevo proyecto (Project / New). Poner como nombre p0, y como directorio C:\TMP\p0 3. Crear nuevo archivo (icono New File), teclear el código del firmware, y guardar el fichero (incono Save File) con el nombre p0.asm, en el directorio C:\TMP\p0. 4. Añadir este fichero a las fuentes del proyecto, pulsando el botón derecho del ratón sobre Souce Files dentro de la ventana que contine el fichero del proyecto p0.mcp. Configurar el proyecto para el PIC16F876 (Configure / Select Device). Configurar (Configure / Configuration Bits) el oscilador RC, WDT deshabitado, y resto de parámetros como aparecen en la siguiente figura. Guardar el proyecto (Project / Save Project) Proyecto p0.mcp: •p0.asm Configure Bits 7. Realizar reset (icono Reset), y empezar a ejecutar paso a paso (Step Into). Abrir la ventana para visualizar la memoria de programa (View / Program Memory) y ventana de SFRs (View / Special Funcition Registers). Observar como evoluciona el programa y los SFRs que son usados por el firmware a medida que se va ejecutando. 8. Para mejorar la depuración es mejor visualizar unicamente aquellos SFRs y GPRs que nos interesan. Cerrar las dos ventanas anteriores y abrir una ventana Watch (View / Watch), y añadir la visualización de PORTB, PORTC (SFRs de los valores de los puertos), TRISB, TRISC (SFRs de la configuración de los puertos) y COUNT (el GPR usado como contador), con Add SFR o Add Symbol para añadir SFR o GPR respectivamente. Volver a efectuar un Reset y volver a ejecutar paso a paso. 9. El valor inicial de PORTB<0>=0 (que ha sido configurado como entrada) porque el simulador asigna al pin RB0=0, que es el estado correspondiente a cuando el pulsador está accionado. Para simular la acción de presión o dejar de accionar el pulsador se abre una ventana de estímulos (Debugger / Stimulus / New Workbook). Los estímulos sobre RB0 los haremos nosotros cuando deseemos, por lo que hay que ir a la pestaña Asynch (Asynchronous Stimulus). Asignar a RB0 una acción Set High y otra acción Set Low. Disparar (Fire) el estímulo RB0=1 (simula pulsador no accionado) y ejecutar un paso o reset. Experimentar como evoluciona el código a medida que se simula como se va pulsando/dejando de pulsar el pulsador. Figura 2. Proyecto p0.mcp y fichero fuentes p0.asm, y las opciones de configure bits 5. Ensamblar y linkar (icono Build All). Si el código es correcto aparecerá en la ventana Output / Build el mensaje Build Succeeded. Aparecen también dos mensajes (no son errores ni warnings) que indican que se acceden a registros que no son del banco 0, para que te asegures que la selección del banco es correcta. Executing: "C:\Tecno\MPLAB7.5\MPASM Suite\MPAsmWin.exe" /q /p16F876 "p0.asm" /l"p0.lst" /e"p0.err" Message[302] C:\TMP\P0\P0.ASM 13 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] C:\TMP\P0\P0.ASM 14 : Register in operand not in bank 0. Ensure that bank bits are correct. Loaded C:\TMP\p0\p0.COD. BUILD SUCCEEDED: Wed Feb 13 13:48:44 2008 6. Para simular el PIC16F876 con este firmware seleccionar como herramienta de depuración el simulador (Debugger / Select Tool / MPLAB SIM). Cambiar las opciones del simulador (Debugger / Settings) • Processor frecuency: 4MHz • Resto de opciones: por defecto Estimulo RB0=1 (Fire) Estímulo RB0=0 PORTB<0>=1 Figura 3. Ventanas Watch y de Estímulos asíncronos 10. Simular el código de forma animada (boton Animate), pulsando primero Reset. Comprobar el correcto funcionamiento del código con la estimulación de RB0. 10. Una vez comprobado el correcto funcionamiento del código, volver a ejecutar un Reset. Colocar un punto de ruptura en la instrucción que modifica los leds de estado (seleccionar la línea de la instrucción movf PORTC y con botón derecho de ratón, Set Breakpoint). El código se puede simular sin necesidad de ejecutar paso a paso; una vez se alcanza el punto de ruptura: 11. También es posible medir el tiempo que paso hasta alcanzar una instrucción. Seleccionar View / StopWatch, realizar un reset y ver paso a paso cuantos ciclos máquina y tiempo requieran las instrucciones que no son de salto y las de salto. Volver a realizar un reset y ver el tiempo que pasa hasta alcanzar el punto de ruptura. Experimentar en diferentes sitios. Creación del proyecto y Simulación Se van a repetir los pasos anteriores realizados con el simulador, pero en este caso depurando el sistema real (PIC16F876 con LEDs y pulsador) con el ICD2. 1. Asegurarse de que la placa PCB no esté alimentada. Conectar el ICD2 al PC y a la cabecera con el PIC16F877. Conectar la cabezera a la placa PCB con los leds y pulsador. Finalmente alimentar la placa a 9V. 2. En MPLAB cambiar el programador al ICD2 (Programmer / Select Programmer / MPLAB ICD2). Aparecerá un mensaje de warning debido a que la cabecera lleva el PIC16F877 mientras que el proyecto está configurado para PIC16F876. Ambos PICs son iguales, excepto que el 877 tiene más pines (40 pines en lugar de 28) y puertos conectados a estos, pero por lo demás son compatibles Connecting to MPLAB ICD 2 ...Connected Setting Vdd source to target ICDWarn0020: Invalid target read=0x4D) ...Reading ICD Product ID Running ICD Self Test ...Passed MPLAB ICD 2 Ready device id 3. Programar el PIC (icono Program Target Device) MPLAB ICD 2 Ready Programming Target... ...Validating configuration fields ...Erasing Part ...Programming Program Memory (0x0 - 0x12) ... (expected=0x4F, …Verify Succeeded ...Programming succeeded 4. Cambiar el depurador a ICD2 (Debugger / Select Debugger / MPLAB ICD2) 5. Repetir la ejecución paso a paso, añadir breakpoints, visualizar los GPRs y SFRs de interés, y demás pasos realizados durante la simulación, pero esta vez usando el botón RB0 de la placa