PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz

Slides:



Advertisements
Presentaciones similares
PIC 16F873 CONVERSIÓN A/D Y TRANSMISIÓN POR PUERTO SERIE
Advertisements

MICROCONTROLADORES.
Entrada / salida digital con ccs
PROGRAMACION 2 MICROCONTROLADORES BASIC STAMP.
Microcontroladores PIC16F84A.
INTERRUPCIONES Y TEMPORIZADORES Programación en C para electrónica.
Introducción Tecnología Electrónica.
PROGRAMACION DEL MICROCONTROLODADOR PIC16F877 Ing. Carlos Guerra Cordero.
Lenguaje Ensamblador Pic 16F84A.
M.C. Juan Carlos Olivares Rojas
Sesión 08: Interrupciones - IRQ. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Sistemas Digitales.
Real Colegio San José S.A.S Programación - BASIC.
PICmicro GAMA MEDIA: PIC16F84 [I]
Javier Mauricio Galvis Moreno
ESTADO Registro de ESTADO más utilizado  Es el registro más utilizado.  Ocupa la dirección 03 H tanto del Banco 0 como el Banco 1 de la Memoria de Datos.
Programación de microcontroladores PIC16f877a en linux
Parte I Pines de E/S Interrupciones
Arquitectura de Computadores Clase 6 Ciclo y Conjunto de Instrucciones IIC 2342 Semestre Rubén Mitnik Pontificia Universidad Católica de Chile Escuela.
PICOBLAZE (Microcontrolador Embebido de 8 bits). Picoblaze Es un microcontrolador de 8 bits, muy simple, orientado inicialmente para FPGAs de la familia.
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
SISTEMAS ELECTRÓNICOS 3ºGIERM1 1. Introducción 2. Tipos de datos 3. Estructuras típicas de programación 4. Manejo de bits Tema 7. Programación de microcontroladores.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
BUCLES – SUBRUTINAS – RETARDOS MICROCONTROLADORES.
El procesador Datapath y control. Universidad de SonoraArquitectura de Computadoras2 Introducción En esta parte del curso contiene: Las principales técnicas.
INTRODUCCION A LOS SISTEMAS DE COMPUTO ARQUITECTURA VON NEUMAN Ing. David Gonzalez.
ARDUINO INTRODUCCIÓN Y PROGRAMACIÓN. Podemos tener Señales analógicas y digitales. INTRODUCCIÓN.
PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz
Control, adquisición y monitoreo con Arduino y Visual Basic .net
PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz
Organización de computadoras
Estructuras de Control en Visual Basic.net
Programacion I Curso: 5 I (TT)
Introduction a la Programacion
Programación de PLCs: conversión normalizada y control del programa
Datapath para las instrucciones aritméticas y lógicas
Datapath para las instrucciones de brinco
Estructuras de Control en Visual Basic.net
Programación Básica con NQC
PSEUDOCÓDIGO Prof. Rafael Mourglia.
ARQUITECTURA DE HARD WARE COMPONENTES EN BLOQUES DEL PROCESADOR
Arquitectura 2013 Explicación 3 - continuación.
Clase 7 Assembly - Simulador MSX88.
Explicación 3 Periféricos.
Direccionamiento de puerto E/S mapeado en memoria
Organización del Computador
MC Beatriz Beltrán Martínez Primavera 2016
Estas dos líneas de código permiten al Asm iniciar en Code Segment
PANTALLA LCD.
Lenguaje Ensamblador. Repertorio de instrucciones Microprocesador Z80.
ESTRUCTURAS DE CONTROL EN VISUAL BASIC.NET Prof.: Rafael Mourglia.
Organización de la memoria
Programación.
CURSO BÁSICO DE MICROCONTROLADORES
HERRAMIENTAS DE PROGRAMACIÓN
INNOVACION TECNOLOGICA ELECTRONICA ESTUDIANTIL EN CIENCIAS
Introducción práctica la uso de la tarjeta Arduino.
Estructuras Repetitivas
CURSO PROGRAMACIÓN BÁSICA SEMANA 3 ¿Qué es un programa?
Electrónica 5 1er Semestre 2018
SENTENCIAS CONTROL DE FLUJO EN C I.E. Mario Jiménez.
CICLOS EN JAVA FOR, WHILE, DO WHILE Un ciclo en Java o bucle en Java (como prefieras llamarlo) permite repetir una o varias instrucciones cuantas veces.
Operaciones con Acumuladores
Informática Ingeniería en Electrónica y Automática Industrial
Tema 2 Estructura de un programa en C. IWI Tema 2 Programa en C U n programa en C es una serie de instrucciones en un lenguaje muy especifico (similar.
El procesador Datapath y control.
UNIVERSIDAD JUÁREZ AUTÓNOMA DE TABASCO Nombres: Isaac Sánchez García Teofilo Martinez Garcia Ricardo Del Carmen Paz López Vanesa Anahí Pérez Lizárraga.
 Valiéndose de transductores, utilizan circuitos electrónicos para convertir en números las pequeñas variaciones de tensión obtenidas, mostrando finalmente.
ARDUINO ARDUINO El proyecto Arduino: Recordando… - Pines de entrada - Pines de salida - Microcontrolador - Conexión USB - IDE de arduino.
Transcripción de la presentación:

PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz Juan González Andrés Prieto-Moreno Ricardo Gómez Escuela Politécnica Superior Universidad Autónoma de Madrid Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz Flir Networked Systems Flir Networked Systems Curso de microcontroladores PIC. Semana del 25-29 Mayo 2009.

PIC 16F87X MÓDULO 9: Introducción a la programación en lenguaje ENSAMBLADOR

Núcleo del PIC16F876

Introducción Registros INTERNOS del PIC W: Acumulador (Working register). Está conectado a una de las entradas de la ALU por lo que se usa como operando en todos los cálculos STATUS: Registro de estado. Selección de los bancos de registros y flags de la ALU. Acceso desde TODOS los bancos INDF: Registro de direccionamiento indirecto. Acceso desde todos los bancos Memoria RAM Capacidad de 512 Bytes Dividida en 4 bancos de 128 bytes: Banco 0, 1, 2 y 3 Antes de acceder a un registro hay que especificar el banco, mediante los bits RP0 y RP1 del registro de Status

Registro de status ¡¡¡Registro accesible desde todos los BANCOS!!!

Bancos de registros

Mapa de memoria (flash) El PIC siempre empieza a ejecutar instrucciones a partir de la dirección 0000h (Vector de Reset) Cuando se produce una interrupción (la que sea) SIEMPRE salta a la dirección 0004h (Vector de interrupción) Hay 4 palabras disponibles para ejecutar un código de inicialización (Por ejemplo saltar al bootloader)

Mapa de memoria (flash) (II) Memoria dividida en 4 bancos de 2K cada uno Para cambiar de un banco a otro hay que modificar el registro PCLATH Página 0 2K 07FFh 0800h Página 1 2K 0FFFh 1000h Página 2 2K 17FFh El bootloader (opcional) se graba en la parte alta de la memoria, en el banco 3 1800h Página 3 2K Bootloader 1FFFh

Juego de instrucciones

Plantilla de programa plantilla.asm Cabecera. Indicar PIC a emplear INCLUDE "p16f876a.inc" __CONFIG _RC_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF ORG 0 ... goto start ORG 0x04 retfie start fin goto fin END Cabecera. Indicar PIC a emplear Establecer los fusibles de configuración El programa comienza en la dirección 0 Poner código de arranque (opcional) Saltar al comienzo del programa Rutina de atención a las interrupciones Código de atención a las interrupciones Retorno de interrupción Comienzo del programa principal Nuestro código Terminamos. Bucle infinito

Programa “Hola mundo” Encender el LED!!! ledon.asm INCLUDE "p16f876a.inc" ORG 0 BSF STATUS,RP0 BCF TRISB,1 BCF STATUS,RP0 BSF PORTB,1 fin GOTO fin END No se usan interrupciones No se establece la palabra de configuración Comienzo del programa Primero configuramos el bit TRISB1 a 0, para que el pin RB1 sea de salida. Para ello hay que acceder al BANCO 1: RP0=1 Ahora ponemos el bit RB1 a 1. Pero el registro PORTB se encuentra en el BANCO 0: RP0=0 Bit Set Bit Clear Poner un bit de un registro a '1' Poner un bit de un registro a '0' BSF Registro,Bit Número de bit (0-7) BCF Registro,Bit Número de bit (0-7) Dirección del registro Dirección del registro

Hola mundo para Bootloader ¿Qué pasa si queremos usar un Bootloader para cargar los programas? Antes de que nuestro programa arranque tiene que llamarse al Bootloader ledon2.asm Hay que añadir este código de arranque Al cargarse el programa mediante el Bootloader, este lo modificará para que se llame primero al bootloader, y luego al programa del usuario INCLUDE "p16f876a.inc" ORG 0 CLRF STATUS MOVLW 0 MOVWF PCLATH GOTO start start BSF STATUS,RP0 BCF TRISB,1 BCF STATUS,RP0 BSF PORTB,1 fin GOTO fin END Si no hay bootloader, este código de arranque es “inofensivo”. Simplemente selecciona la página 0 y salta al comienzo de nuestro programa Nuestro programa hola mundo que enciende el led de la tarjeta Skypic

Compilando con las GPUTILS Las GPUTILS (GNU Pic Utilities) son las herramientas libres y multiplataformas para ensamblar y enlazar Son 100% compatibles con el MPLAB UTILIZACIóN: Ensamblador Fichero en ensamblador gpasm -pPIC fichero.asm PIC a emplear EJEMPLO: gpasm -pp16f876a ledon2.asm

Ejercicio: vamos a practicar Modificar el programa ledon2.asm para que además del bit RB1 se enciendan el bit RB7 y se vea por los leds Primero habrá que modificar el editor para que nos permita invocar al ensamblador

Sacando datos por el puerto B outputb.asm Sacar un byte por el puerto B INCLUDE "p16f876a.inc" #define VALOR 0xAA ORG 0 ... GOTO start start BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 MOVLW VALOR MOVWF PORTB fin goto fin END Definir una constante. Igual que en lenguaje C Comienzo del programa. Lo primero sería el código de inicialización del Bootloader, igual que en el ejemplo anterior Comienzo del programa Acceder al banco 1 Poner todos los bits de TRISB a 0. Ahora todos los pines son de salida Acceder al banco 0 Cargar la constante “VALOR” en el acumulador (W) Sacar el acumulador por el puerto B

Instrucciones de transferencia y borrado Clear Poner todos los bits de un registro a 0 CLRF Registro Dirección del registro Move literal Guardar un valor de 8 bits en el registro W MOVLW dato Dato a guardar Move Transferir el registro W a un registro MOVWF registro Dirección del registro

Comprobación de bits pulsador.asm Programa que enciende el led al pulsar el botón y lo apaga al soltarlo Inicialización (igual que ejemplos anteriores) INCLUDE "p16f876a.inc" ... start BSF STATUS,RP0 BCF TRISB,1 BCF STATUS,RP0 bucle BTFSC PORTB,0 goto no_pulsado BSF PORTB,1 goto bucle no_pulsado BCF PORTB,1 END Cambiar al banco 1 Configurar RB1 para salida Cambiar al banco 0 Comprobar el estado de RB0 y saltar si está a 0. Es decir, saltar si el pulsador está apretado Si se ejecuta esta instrucción, es que no se ha realizado el salto y por tanto RB0 estaba a 1 (no pulsado). Saltar a la etiqueta correspondiente Este es el código que se ejecuta cuando RB0 está a 0. Se enciende el led Repetir el proceso para volver a comprobar el estado del pulsador Este es el código que se ejecuta cuando RB0 está a 1 Apagar el led Repetir el proceso para volver a comprobar el estado del pulsador

Instrucciones de comprobación de bits Bit Test (0) Comprobar si un bit está a 0 BTFSC registro, bit Número de bit (0-7) Registro Bit Test (1) Comprobar si un bit está a 1 BTFSS registro, bit Número de bit (0-7) Registro

bucles Los bucles se implementan con la instrucción DECFSZ ... DECFSZ variable,F goto bucle La variable se decrementa. Cuando variable==0, finaliza el bucle SINTÁXIS: Decrementar y saltar si es igual a cero F: registro=registro -1 W: W=registro-1 DECFSZ registro, destino Registro a usar

Bucles: Rutina de pausa (I) ledp.asm (parte I) Hacer parpadear el led (RB1) INCLUDE "p16f876a.inc" cblock 0x20 CONTH CONTL endc ... start BSF STATUS,RP0 BCF TRISB,1 BCF STATUS,RP0 main MOVLW 0x02 XORWF PORTB,F CALL pausa GOTO main Declaración de variables. A partir de la dirección 0x20 Parte alta del contador para hacer la pausa Parte baja del contador para hacer la pausa Configurar RB1 para salida Bucle principal Cargar el valor 0x02 en W Hacer la operación PORTB=PORTB xor 0x02 para cambiar el pin RB1 de estado Llamar a la subrutina de espera Repetir. Bucle infinito

Bucles: Rutina de pausa (II) ledp.asm (parte II) Poner parte alta del contador a 0xFF pausa MOVLW 0xFF MOVWF CONTH bucle1 MOVWF CONTL bucle2 DECFSZ CONTL,F goto bucle2 DECFSZ CONTH,F goto bucle1 RETURN END Bucle exterior Poner parta baja del contador a 0xFF Bucle interior Decrementar CONTL y salir del bucle cuando llegue a 0 Decrementar CONTH y salir del bucle cuando llegue a 0 Se llega aquí cuando CONTH=0 y CONTL=0. En total se han realizado 0xFFFF iteraciones Retorno de la subrutina

Puerto serie (I) sci-eco.asm (I) Hacer eco por el puerto serie INCLUDE "p16f876a.inc" ... start BSF STATUS,RP0 MOVLW 0x81 MOVWF SPBRG MOVLW 0x24 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0x90 MOVWF RCSTA CLRF TRISB main CALL leer_car CALL enviar MOVWF PORTB GOTO main Primero configuramos el puerto serie Acceso al banco 1 Baudios: 9600 Configurar transmisor Acceso al banco 0 Configurar receptor Acceso al banco 1 Configurar puerto B para salida Acceso al banco 0 Bucle principal Esperar a que llegue un carácter Hacer el eco ...y sacarlo por los leds del puerto B

Puerto serie (II) sci-eco.asm (II) Subrutina de recepción de datos por el SCI leer_car BTFSS PIR1,RCIF GOTO leer_car MOVFW RCREG RETURN enviar wait BTFSS PIR1,TXIF goto wait MOVWF TXREG END Esperar hasta que RCIF=1 Equivalente a while(RCIF==0) en C Leer carácter recibido y guardarlo en W Retorno de la subrutina Subrutina de transmisión de datos por el SCI Se transmite el carácter que esté en W Esperar hasta que TXIF=1 Equivalente a while(TXIF==0) en C Transmitir el carácter Retorno de la subrutina

Interrupciones (I) sci-int1.asm INCLUDE "p16f876a.inc" ORG 0 ... GOTO start ORG 0x04 MOVLW 0x02 XORWF PORTB,F MOVFW RCREG RETFIE start BSF STATUS,RP0 BCF TRISB,1 BSF PIE1,RCIE BSF INTCON,PEIE BSF INTCON,GIE BCF STATUS,RP0 BSF PORTB,1 main GOTO main END Rutina de atención a las interrupciones. Se ejecuta cuando llegue un carácter por el sci Cambiar el led de estado Leer el carácter recibido para limpiar el flag de interrupción Retorno de interrupción Programa principal Inicializar puerto serie. Igual que ejemplo anterior Acceso al banco 1 Configurar RB1 para salida Activar la interrupción de dato recibido Acceso al banco 0 Encender el led El programa principal no hace nada

Interrupciones (II) El programa anterior funciona porque sólo se están utilizando las interrupciones para hacer una tarea Si en el bucle principal se hiciera otra tarea, no funcionaría correctamente Las interrupciones pueden llegar en cualquier momento y nos pueden cambiar los valores de los registros W y STATUS. Regla de oro: Al comienzo de la rutina de atención a la interrupción hay que guardar los registros W y STATUS Al finalizar la rutina hay que restablecer sus valores Vamos a hacer un ejemplo con dos TAREAS TAREA 1: Hacer eco de lo recibido por puerto serie mediante interrupciones TAREA 2: Que parpadee el led

Interrupciones (III) sci-int2.asm (I) INCLUDE "p16f876a.inc" cblock 0x20 CONTH CONTL save_w save_status endc ORG 0 ... GOTO start ORG 0x04 MOVWF save_w SWAPF STATUS,W MOVWF save_status CALL leer_car CALL enviar SWAPF save_status,W MOVWF STATUS SWAPF save_w, F SWAPF save_w, W RETFIE Declaración de variables Variables para usar en la rutina de pausa Variable para guardar el registro W Variable para guardar el registro STATUS TAREA 1: hacer eco Guardar el contexto (registros W y STATUS) Leer carácter recibido Hacer eco Recuperar el contexto

Interrupciones (IV) sci-int2.asm (II) start Configuración puerto serie ... BSF STATUS,RP0 BCF TRISB,1 BSF PIE1,RCIE BSF INTCON,PEIE BSF INTCON,GIE BCF STATUS,RP0 BSF PORTB,1 main MOVLW 0x02 XORWF PORTB,F CALL pausa GOTO main Configuración puerto serie Acceso al banco 1 Configurar RB1 para salida (led) Activar interrupción de dato recibido Acceso al banco 0 Encender led TAREA 2: Que parpadee el led Cambiar led de estado Pausa

Ejercicio: Hacer un programa en ensamblador para hacer parpadear el led de la Skypic usando el timer 0, mediante interrupciones. Los valores para configurar el timer0 los podéis sacar del ejemplo timer0- pausa10ms.c, Y para las interrupciones: timer0-onda10Khz-int.c

Ensamblador y C en el SDCC (I) sdcc-asm.c Hacer parpadear el led. Parte en C y parte en ASM #include <pic16f876a.h> ... void main(void) { TRISB1=0; T0CS=0; PSA=0; PS2=1; PS1=1; PS0=1; RB1=0; while(1) { _asm MOVLW 0x02 XORWF PORTB,F _endasm; pausa(10); } Funciones de pausa (ejemplos anteriores) Configurar RB1 para salida Configurar Timer 0 para hacer pausas Apagar led Comienzo del bloque en ensamblador Cambiar led de estado Fin del bloque en ensamblador Pausa de 100ms

Ensamblador y C en el SDCC (II) Mezclar código en C y ASM puede ser peligroso. EXPERIMENTO: En el ejemplo anterior eliminar la línea que pone RB1=0; void main(void) { TRISB1=0; T0CS=0; PSA=0; PS2=1; PS1=1; PS0=1; RB1=0; ... Eliminar esa “inocente” línea ¿Funciona el código? ¿Qué ocurre?

Ensamblador y C en el SDCC (III) Falla porque estamos accediendo a bancos de registros diferentes Esos registros están en un banco distinto al 0 void main(void) { TRISB1=0; T0CS=0; PSA=0; PS2=1; PS1=1; PS0=1; while(1) { _asm MOVLW 0x02 XORWF PORTB,F _endasm; pausa(10); } El puerto B está en el banco 0 El compilador “no lo sabe” y no nos cambia al banco 0 Sin embargo, cuando está la instrucción RB1=0, el compilador cambia al banco 0 y por eso al ejecutar nuestro código en ensamblador funciona Conclusión: Mucho cuidado cuando se mezclan ambos lenguajes

Ensamblador y C en el SDCC (IV) ¿Para qué se usa la mezcla entre C y ASM principalmente? Para tener control sobre los ciclos que la CPU ejecuta while(1) { ... _asm nop _endasm; } Meter una instrucción “nop” que sabemos que tarda 200ns en ejecutarse (con cristal de 20Mhz) Ejecutar instrucciones especiales while(1) { ... _asm sleep _endasm; } Poner el pic en bajo consumo while(1) { ... _asm clrwdt _endasm; } Reset del “Watch-Dog”