Assembler para PICs Características generales del lenguaje: • Emplea los mnemotécnicos de las instrucciones del μC. En nuestro caso corresponderá al set de instrucciones de los PICs de la gama media (35 instrucciones). • Permite la utilización de etiquetas, tanto para apuntar a direcciones como para definir valores constantes. • Permite expresar las cantidades numéricas en diferentes bases. • Se guarda en un archivo en formato ASCII, utilizando la extensión *.ASM • Cuenta con una serie de pseudo-instrucciones o directivas (además de las ya conocidas ORG, EQU y END) específicas para estos μCs. Veamos algunas… Assembler para PICs: Directivas más usadas PROCESSOR __CONFIG ó FUSES Define el PIC que se va a usar y determina el set de instrucciones. Ejemplo: PROCESSOR PIC16F84A Define la palabra de configuración específica para el PIC que se esté usando. Ejemplo: __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC donde: _PWRTE_ON: activa el power-up timer _WDT_OFF: desactiva el watchdog _XT_OSC: configura oscilador con cristal Los parámetros permitidos para __CONFIG dependerán del modelo de PIC que se esté usando y de las características especiales de este. INCLUDE Incluye como parte del programa al archivo indicado. Generalmente usado para incluir definiciones estándar de etiquetas, o bien archivos de usuario conteniendo por ejemplo subrutinas de uso frecuente. Ejemplo: INCLUDE <P16F84A.INC> ó INCLUDE "DELAY100.INC" Assembler para PICs: Directivas más usadas RADIX Define la base numérica usada por default. Puede ser dec, hex u oct Ejemplo: RADIX dec Representación numérica: Tipo: Sintaxis: Ejemplo: d' ' d'197' . .197 h' ' h'7E' 0x 0x7e Octal o' ' 0'123' Binario b' ' b'00101101' a' ' a'C' ' ' 'C' Decimal Hexadecimal ASCII Assembler para PICs Palabra de configuración: parámetros de la directiva __CONFIG Característica Parámetro Función Aplicable a Watchdog _WTD_ON / _WDT_OFF activa / desactiva 16F84 y 16F628 Power-up timer _PWRTE_ON / _PWRTE_OFF activa / desactiva 16F84 y 16F628 Protección de código _CP_ON / _CP_OFF activa / desactiva 16F84 y 16F628 _XT_OSC Cristal normal 16F84 y 16F628 _HS_OSC Cristal HF (> 4MHz) 16F84 y 16F628 _RC_OSC Circuito RC 16F84 y 16F628 _LP_OSC Cristal low power 16F84 y 16F628 _INTOSC_OSC_CLKOUT clock interno 4MHz con salida por pin 15 solo 16F628 _INTOSC_OSC_NOCLKOUT clock interno 4MHz sin salida solo 16F628 Entrada MCLR _MCLRE_ON / _MCLRE_OFF pin 4 actúa como MCLR / RA5 solo 16F628 Low voltaje programming (LVP) _LVP_ON / _LVP_OFF pin 10 actúa como LVP PGM / RB4 solo 16F628 Oscilador de clock Nota: diferentes parámetros se combinan con la operación & Assembler para PICs Configuration word 16F84: Assembler para PICs Configuration word 16F628: Assembler para PICs Ejemplos para el PIC 16F84: • oscilador a cristal (4 MHz) • watchdog activado! • power-up timer activado • (sin protección de código) __CONFIG _PWRTE_ON & _WDT_ON & _XT_OSC • oscilador con circuito RC • sin watchdog • protección de código activada • (power-up timer desactivado) __CONFIG _CP_ON & _WDT_OFF & _RC_OSC Assembler para PICs Ejemplos para el PIC 16F628: __CONFIG _MCLRE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF • MCLR disponible en pin 4 • oscilador a cristal • sin watchdog • RB4 en pin 10 __CONFIG _MCLRE_ON & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _LVP_OFF • pin 4 asignado a RA5 y no a MCLR • oscilador interno sin cristal, y sin clockout en pin 15 • sin watchdog • RB4 en pin 10 Assembler para PICs Watchdog timer (WDT): •Cuenta con su propio oscilador interno (independiente del oscilador principal de clock) •Un fin de cuenta (time-out) del WDT puede producir: • Un RESET si el pic está ejecutando instrucciones de forma normal. • Un WAKEUP si el pic esta en modo SLEEP •Puede ser desactivado de forma permanente en la palabra de configuración. •El período básico de time-out es de alrededor de 18ms (no es preciso). •Se puede ampliar hasta 2.3seg haciendo uso del prescaler (ver registro OPTION). •El bit 4 del registro STATUS indica (con un cero) si se produjo un time-out. •Existe la instrucción CLRWDT que reinicia el WDT timer y previene el RESET. Assembler para PICs Programa de ejemplo: PROCESSOR P16F84A INCLUDE <P16F84A.INC> ; Carga etiquetas para el PIC 16F84 ; Proteccion de codigo = OFF ; Watchdog = Usado ! ; Power up Timer = Usado ! ; Tipo de oscilador = Cristal XT (4MHz) __CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC CUENTA1 CUENTA2 EQU EQU 0C 0D ORG GOTO 0000 INICIO ORG RETFIE 0004 INICIO BSF MOVLW MOVWF BCF STATUS,RP0 B'00000000' TRISB STATUS,RP0 LOOP MOVLW MOVWF CALL MOVLW MOVWF CALL GOTO B’11110000’ PORTB DELAY B’00001111’ PORTB DELAY LOOP ; primera posicion de la RAM ; ; ; ; ; entramos al bank 1 movemos 00000000b a W puerto B todo salida volvemos al bank 0 no modifico OPTION => el WDT es de ~18 ms ; demora de ~100ms (con un cristal de 4MHz) Assembler para PICs Programa de ejemplo: subrutina de delay DELAY SAL2 D1MS SAL1 MOVLW MOVWF CALL NOP DECFSZ GOTO RETURN D'100' CUENTA2 D1MS MOVLW MOVWF CLRWDT DECFSZ GOTO RETURN D'249' CUENTA1 END CUENTA2 SAL2 CUENTA1 SAL1 ; ; ; ; ; ; ; 1c 1c 1c+1ms 1c *** se podría reiniciar el watchdog aquí *** 1c/2c 2c 2c ; ; ; ; ; ; 1c 1c 1c *** aquí reinicia el watchdog *** 1c/2c 2c 2c