47
El ensamblador El entorno de trabajo MPLAB El ensamblador que utiliza por defecto el MPLAB es el MPASM ALGUNAS DIRECTIVAS del ASM Ya la primera línea LIST P = 16F84 Definine el procesador a utilizar durante todos los procesos (ensamblado, emulación, grabación).

Niple diapopsitiva

Embed Size (px)

Citation preview

Page 1: Niple   diapopsitiva

El ensambladorEl entorno de trabajo MPLAB El ensamblador que utiliza por defecto el MPLAB es el MPASMALGUNAS DIRECTIVAS del ASMYa la primera línea

LIST P = 16F84

Definine el procesador a utilizar durante todos los procesos (ensamblado, emulación, grabación).

Page 2: Niple   diapopsitiva

La directiva ORG, seguida de una posición de memoria, indica al ensamblador dónde debe situar ese código y se coloca, antes de la primera instrucción.

Los casos de direcciones especiales serán también descritos más adelante en el presente texto.

Page 3: Niple   diapopsitiva

La directiva END es imprescindible e indica al ensamblador el final del programa. REM, indica que lo que le sigue es un comentario.

Page 4: Niple   diapopsitiva

El ensamblador exige una cierta tabulación mínima de sus distintos elementos. De este modo la definición de variables podrá escribirse en la 1ª columna de cualquier línea, mientras que las directivas e instrucciones deberán ir en la 2ª columna, como mínimo. Las tabulaciones características son las empleadas por nosotros, ya que, aunque no son imprescindibles, clarifican la lectura del programa.

Page 5: Niple   diapopsitiva

Nos planteamos un nuevo problema: Crearemos un programa para un PIC16F84A funcionando a 4MHZ encargado de contar hasta 0x5f. Cuando lo alcance se detendrá en un bucle no operativo. El valor del contador se visualizará en 8 diodos LED conectados al puerto B. ,

Page 6: Niple   diapopsitiva

LIST P=16C84 ; Seleccionamos el micro ; Asignación de etiquetas a registros.

f EQU 0x01 ; registro fportb EQU 0x06 ; Dirección del registro del puerto B estado EQU 0x03 ; Dirección del registro de estado conta EQU 0x0C ; Lo usamos como variable contadora ORG 0 ; El programa comienza en la dirección 0 GOTO inicio ; salta a la dirección 5 para sobrepasar el vector INT. ORG 5 inicio BSF estado,5 ; Selecciona banco 1 para llegar a TRISB MOVLW 0x00 MOVWF portb Y se especifica que es de salida BCF estado,5 ; Selección del banco 0 para trabajar directamente ; con el puerto CLRF conta ; Ponemos nuestro contador a 0

Page 7: Niple   diapopsitiva

Bucle1 INCF conta,f ; conta + 1 --> conta (incrementa el contador) MOVF conta,W ; conta se carga en W MOVWF portb ; W se carga en el registro de datos del puerto B MOVLW 0x5f ; W <-- 0x5f (Final de cuenta deseado) SUBWF conta,W ; conta - W --> W. Si es cero, la cuenta está acabada BTFSS estado,2 ; Explora Z y si vale 1 es que W vale 0 ; se produce "brinco" en ese caso por fin de cuenta GOTO bucle1 ; Si Z = 0 se vuelve a bucle1 bucle2 GOTO bucle2 ; Si Z = 1 se produce un bucle infinito END

Page 8: Niple   diapopsitiva

OTRO EJEMPLO EN ASM

Page 9: Niple   diapopsitiva

LIST P = 16F84 ;Indicamos el modelo de PIC a utilizar ; Definición de registros portb EQU 0x06 ;Hemos conectado el display al puerto B ;La dirección 0x06 corresponde al registro PORTB ;(puerto B) en el banco1 TRISB EQU 0X06 ; y TRISB en banco 1 Estado EQU 0X03 ; La dirección del registro de estado es la 0x03 pc EQU 0x02 ; Contador de Programa, es decir, ;dirección de memoria actual de programa ; Definición de bits banco EQU 0X05 ; Bit del registro de estado correspondiente ; al banco de datos Z EQU 0X02 ; Bit indicador de que el registro W está a cero

Page 10: Niple   diapopsitiva

; Definición de constantes w EQU 0 ; Destino de operación = w f EQU 1 ; Destino de operación = registro ; Definición de variables contador EQU 0X0C ; Contador digito EQU 0X0D ; Para almacenar el dígito ; Comienzo del programa. ORG 0X00 ; Cubrimos el vector de reset GOTO inicio ; Saltamos a la primera dirección tras el vector de interrupción

Page 11: Niple   diapopsitiva

; ************************ Inicialización de variables ************************* ORG 0X05 inicio BSF estado, banco; Cambiamos a la segunda página de memoria CLRF TRISB ; Programa la puerta B como de todo salidas BCF estado,banco ; Volvemos a la página 0. CLRF portb ; Apaga el display, por si había residuos CLRF contador ; Borra el contador (dirección 0x0C) CLRW ; Borramos el registro W ; ************************* Cuerpo Principal ************************** Reset CLRF digito ; Comienza a contar por el 0 Siguien MOVF digito,w ; Coloca el siguiente dígito a evaluar en W CALL Tabla ; Llama a la subrutina para coger el dato ; y hacer la conversión decimal-7 segmentos MOVWF portb

Page 12: Niple   diapopsitiva

Pausa DECFSZ contador ; Decremento contador y repite GOTO Pausa ; hasta que valga 0 INCF digito,f ; Incrementa el valor del dígito al siguiente MOVF digito,w ; Pone el valor del dígito en W XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9 BTFSC estado,Z ; Comprobando con un xor si W vale 0 (Z=1) GOTO Reset ; Si Z=1 resetea el dígito y comienza la cuenta GOTO Siguien ; En caso contrario, continua la cuenta con el siguiente ;dígito

Page 13: Niple   diapopsitiva

Tabla ADDWF pc,f ; Suma al contador de programa el valor de offset, es decir, ; el valor del dígito. Así se genera un PC distinto según su valor, ; asegurando que vaya a la línea correcta de la tabla

RETLW 0x3F ; 0 en código 7 segmentos RETLW 0x06 ; 1 en código 7 segmentos RETLW 0x5B ; 2 en código 7 segmentos RETLW 0x4F ; 3 en código 7 segmentos RETLW 0x66 ; 4 en código 7 segmentos RETLW 0x6D ; 5 en código 7 segmentos RETLW 0x7D ; 6 en código 7 segmentos RETLW 0x07 ; 7 en código 7 segmentos RETLW 0x7F ; 8 en código 7 segmentos RETLW 0x6F ; 9 en código 7 segmentos END

Page 14: Niple   diapopsitiva

EL PIC EN DETALLE

EJEMPLO MIREMOS UN PIC 16F84A

(EL MAS SIMPLE DE LA FAMILIA FLASH)

QUE NOS OFRECE?

MEMORIA DE PROGRAMA

MEMORIA DE DATOS

MEMORIA EEPROM ( FLASH ) Como asi??? es eeprom o flash

Ja! Pues es el equivalente en tecnología flash de una supuesta memoria eeprom que venia en el antecesor pic 16c84

Page 15: Niple   diapopsitiva
Page 16: Niple   diapopsitiva

High Performance RISC CPU Features:• Only 35 single word instructions to learn• All instructions single cycle except for pro gram branches which are two-cycle• Operating speed: DC - 10 MHz clock inputDC - 400 ns instruction cycle

Page 17: Niple   diapopsitiva

LA MEMORIA DISPONIBLE

Page 18: Niple   diapopsitiva

• 14-bit wide instructions• 8-bit wide data path• 15 special function hardware registers• Eight-level deep hardware stack• Direct, indirect and relative addressing modes • Four interrupt sources: - External RB0/INT pin- TMR0 timer overflow - PORTB<7:4> interrupt on change- Data EEPROM write complete• 1000 erase/write cycles Flash program memory• 10,000,000 erase/write cycles EEPROM data memory• EEPROM Data Retention > 40 years

Page 19: Niple   diapopsitiva

Peripheral Features:• 13 I/O pins with individual direction control• High current sink/source for direct LED drive- 25 mA sink max. per pin (entrando)- 20 mA source max. per pin (saliendo)• TMR0: 8-bit timer/counter with 8-bit programmable prescaler

Page 20: Niple   diapopsitiva

Special Microcontroller Features:• In-Circuit Serial Programming (ICSP™) - via two pins (ROM devices support only Data EEPROM programming) • Power-on Reset (POR)• Power-up Timer (PWRT)• Oscillator Start-up Timer (OST)• Watchdog Timer (WDT) with its own on-chip RC oscillator for reliable operation• Code-protection• Power saving SLEEP mode• Selectable oscillator optionsCMOS Flash/EEPROM Technology:• Low-power, high-speed technology• Fully static design• Wide operating voltage range:- Commercial: 2.0V to 6.0V- Industrial: 2.0V to 6.0V• Low power consumption:- < 2 mA typical @ 5V, 4 MHz-1 5 µA typical @ 2V, 32 kHz-< 1 µA typical standby current @ 2V

Page 21: Niple   diapopsitiva

LA CONEXIÓN BASICA PARA QUE FUNCIONE

Page 22: Niple   diapopsitiva

EL TEMPORIZADOR TMR0

TIENE DOS FORMAS DE OPERAR (EXCLUSIVAS; UNA O LA OTRA NO AMBAS)

CONTADOR DE EVENTOS

RELOJ DE TIEMPO REAL

CONFIGURACION DE ESTE CONTADOR O TMR0

QUE SE QUIERE CONTAR?

EVENTOS EXTERNOS O PULSOS INTERNOS QUE SE DERIVAN DEL CRISTAL (MUY PRECISOS)

Page 23: Niple   diapopsitiva
Page 24: Niple   diapopsitiva

Dos registros fundamentales en la operacion del TMR0

En TMR0 se almacena el conteo (ojo banco 0)

En OPTION se configura el TMR0 (ojo banco 1)

Page 25: Niple   diapopsitiva
Page 26: Niple   diapopsitiva

Preescalador o prescaler mejor dicho divisor de frecuencia

Page 27: Niple   diapopsitiva
Page 28: Niple   diapopsitiva
Page 29: Niple   diapopsitiva

LA FILOSOFIA DE TRABAJO EN LA CONFIGURACION DEL TMR0

PROGRAMAR LOS BITS INDIVIDUALES EN CUESTION DEL REGISTRO OPTION DE MODO QUE SE CONECTE LO QUE SE DESEA SEGÚN EL GRAFICO ANTERIOR.

EJEMPLO: UNA ONDA ULTRASONICA ES GENERADA POR ELPIC

PARA IMPLEMENTAR UN MEDIDOR DE DISTANCIAS

CUAL SERIA EL TIEMPO MAXIMO A REGISTRAR Y LA MAXIMA DISTANCIA A MEDIR SI:

F=40KHZ (ONDA ULTRASONICA Y LA FRECEUNCIA DEL CRISTAL O RESONADOR DEL PIC ES 4MHZ

Page 30: Niple   diapopsitiva

SOLUCION

EL SONIDO SE PROPAGA A RAZON DE 340 m/S

(APROXIMADO)

UN PRESCALADOR MAXIMO ES DE 256 osea por cada 256 pulsos derivados del reloj interno el TMR0 cuenta

un flanco

Si el cristal es de 4mhz el reloj interno es de

1MHZ o F/4

Osea 1uS por flanco pero el maximo prescaler es de 256

Cada 256 conteos en TMR0 se incrementa en uno

256*1uS*255=65280uS

Page 31: Niple   diapopsitiva

65280/2 = 32640uS se demora en ir y volver

V=D/T 340m/s=x/32640uS osea que puede medir hasta 11.09 metros

Y la resolucion teorica es de 256uS o de 8.7 cm

Y la resolucion fisica es de Lamda/2 o de

(340m/s) / 40Khz = 0.0085m o 8.5mm/2 = 4.25mm

Page 32: Niple   diapopsitiva

COMO MEJORARIA USTED LA RESOLUCION DEL SISTEMA?

Page 33: Niple   diapopsitiva

Aumentando el registro de Conteo o TMR0 o cuenta en cascada con un registro auxiliar ?

O bajando el prescaler ?

O una combinacion de los dos anteriores

Page 34: Niple   diapopsitiva

8.5mm es lo maximo a 40Khz (lo mas fino)

Con un registro de 8 bits son 8.5*255 son casi 2.1675metros medios

Pero esto es irreal ya que solo podemos contar multiplos binarios de 1 uS

Y el maximo conteo es de 255*256=65280 microsegundos (MUCHO)

Como es un sistema de 8 bits cuantizamos 255 valores

Que sean lamdas 8.5mm x 255 o 1.08metros que cuente cada 25uS

1,2,4,8,16,32,64,128,256…..etc

Dos opciones con prescaler de 16 y mide menos de 1.08m o con 32 y mide mas de 1.08m pero se sacrifica la resolucion.

Page 35: Niple   diapopsitiva

Ahora con 32

32*255*1uS= 8.16mS

E = 340m/S * 8.16mS = 2.7744 metros (10.88mm de resolucion)

Page 36: Niple   diapopsitiva
Page 37: Niple   diapopsitiva

TAREA

SE DESEA DISEÑAR UN EQUIPO PARA MEDIR DESFASE DE DOS ONDAS DE 60Hz

CUAL DEBE SER EL PRESCALER PARA OBTENER LA MAXIMA RESOLUCION DEL APARATO SI USAMOS UN TRM0 (DE 8 BITS)

Page 38: Niple   diapopsitiva

LAS INTERUPCIONES

POR FLANCO EN EL PIN INT

POR CAMBIO EN PINES B7,B6,B5,B4

POR DESBORDE DEL TMR0

AL TERMINAR UNA OPERACIÓN DE ESCRITURA EN LA MEMORIA

EEPROM (FLASH)

Page 39: Niple   diapopsitiva
Page 40: Niple   diapopsitiva

EN EL VEMOS UN PAR DE BITS

UNO HABILITA LA INTERUPCION

OTRO DETECTA LA INTERUPCION

Page 41: Niple   diapopsitiva
Page 42: Niple   diapopsitiva

LOGICA DE LA INTERUPCION

Page 43: Niple   diapopsitiva

SALVAR EL CONTEXTO

Parece que cuando se atiende la interupcion de borran o dañan algunos reg en el PIC la estrategia es salvarlos en RAM antes de atender el nucleo de la interupcion y al regresar restablecer los registros criticos antes de retornar el control del programa principal

Page 44: Niple   diapopsitiva

EXAMPLE : SALVANDO STATUS y W reg EN ram

PUSH MOVWF W_TEMP ; Copy W to TEMP register, SWAPF STATUS, W ; Swap status to be saved into W MOVWF STATUS_TEMP ; Save status to STATUS_TEMP register ISR : ; Interrupt Service Routine : ; should configure Bank as required : ;POP SWAPF STATUS_TEMP, W ; Swap nibbles in STATUS_TEMP register ; and place result into W MOVWF STATUS ; Move W into STATUS register ; (sets bank to original state) SWAPF W_TEMP, F ; Swap nibbles in W_TEMP and place result in W_TEMP SWAPF W_TEMP, W ; Swap nibbles in W_TEMP and place result into W

Page 45: Niple   diapopsitiva

REALIZAMOS LO SIGUIENTEa) SALVAMOS EL REG W.b) SALVAMOS EL STATUS EN STATUS_TEMP.c) EJECUTAMOS EL NUCLEO DE LA INT.d) RESTABLECEMOS STATUS (Y SELECCIONAMOS BANCO)e) RESTABLECEMOS W

Page 46: Niple   diapopsitiva

EJEMPLOS EN ASSEMBLER

1 PAGINA

http://perso.wanadoo.es/chyryes/tutoriales/pic13.htm

2 PAGINA???

PICLOOPS (BUSCAR EN GOOGLE)

NIPLE PROGRAMAR POR DIAGRAMAS DE FLUJO

http://www.niplesoft.net/index.htm

Otras aplicaciones

http://host.nigde.edu.tr/muzam/UZAM_PLC_with_PIC16F648A.htm

http://www.electronicsoft.net/en-us/dept_9.html

http://www.matrixmultimedia.com/product.php?Prod=Flowcode%20V3%20for%20PIC&PHPSESSID=

Page 47: Niple   diapopsitiva

FLOWCODE 3 DEMO

http://microcontrollershop.com/product_info.php?cPath=148&products_id=527

ETHERNET

http://www.dontronics-shop.com/pic-mini-web-mini-web-server-tcp-ip-development-board-for-pic-micro.html