Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 1 Microcontrolador Microchip PIC18F452 - Arquitectura RISC (Reduced Instruction Set Computer). - Juego de instrucciones reducido para ejecución rápida. - Oscilador hasta 40 MHz ĺ 10 MIPs (Million Instructions Per second). - Optimizado para compilación desde lenguaje C. - Micro de 8 bits. - Arquitectura de memoria Hardvard: - memoria interna de programa FLASH de 32 Kb - memoria interna RAM de 1536 bytes - memoria interna EEPROM de 256 bytes - contador de programa de 21 bits ĺ hasta 2 Mb de memoria de programa - direccionamiento de 12 bits en memoria de datos ĺ 4Kb - Periféricos integrados: - temporizadores, contadores, comparadores, unidades de captura - modulación en ancho de pulso PWM (Pulse Width Modulation) - interrupciones internas y externas - canal serie USART (Universal Synchronous/Asnynchronous Serial Receiver/Transmiter) - canal serie SPI (Serial Peripheral Interface) - canal serie I2C (Inter-Integrated Circuit) - puerto paralelo esclavo PSP (Parallel Slave Port) - conversión A/D de 10 bits - perro guardián WDT (Watchdog Timer). Universidade de Vigo – EUITI Encapsulados PIC18F452: Sistemas embebidos Informática Industrial 2004-2005 QFN (Quad Flat No lead) DIP PLCC 2 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 3 Operaciones simultáneas de lectura y ejecución de instrucciones (pipeline) Ciclos de reloj MOVLW 55h carga el valor 0x55 en el acumulador MOVWF PORTB copia el acumulador en el puerto B BRA SUB_1 salto a la rutina SUB_1 BSF PORTA, BIT3 pone a 1 el bit 3 del puerto A Universidade de Vigo – EUITI Informática Industrial 2004-2005 Mapa de memoria de datos Memoria de propósito general GPR (General Purpose Registers) Registros de configuración y operación SFR (Special Function Registers) Bancos de memoria de 256 bytes Registro de selección de banco BSR (Bank Select Register) Sistemas embebidos 4 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 5 Informática Industrial 2004-2005 Sistemas embebidos 6 SFRs - Direcciones 0xF80 a 0xFFF Universidade de Vigo – EUITI Microchip MPLAB C18 Entorno de programación MPLAB IDE - Gratuito, descargable desde http://www.microchip.com - IDE (Integrated Development Environment) para Windows. - Ensamblador, enlazador, gestión de proyectos, depurador, simulador. Compilador MPLAB C18 - Compilador cruzado de lenguaje C para la serie de microcontroladores Microchip PIC 18. - Sigue la norma ANSI C X3.159-1989, salvo en particularizaciones para este microcontrolador. - Se integra en el entorno MPLAB IDE. - Bibliotecas de rutinas para PWM, canales SPI, I2C, UART, USART, cadenas de caracteres y funciones matemáticas en punto flotante. - Almacenamiento de variables multibyte de tipo little-endian. - Números reales float y double de 32 bits. Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 7 Sistema de desarrollo Microchip MPLAB ICD 2 - Entorno de programación y depuración en tiempo real para microcontroladores Microchip PIC. - Conexión USB o RS 232 con el computador de desarrollo, en el que se utiliza MPLAB IDE (gratuito http://www.microchip.com). - Manejo del microcontrolador real mediante líneas dedicadas. Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 8 Placa de desarrollo Microchip PICDEM 2 PLUS 1: Soporte para microcontroladores PIC de 18, 28 y 40 patillas. 2: Alimentación de 9V (adaptador externo o pila) y regulador para 5V 100mA. 3: Conector RS 232 y driver MAX232. 4: Conexión al depurador MPLAB IDC 2. 5: Potenciómetro para simulación de entrada analógica. 6, 8: Tres pulsadores (entradas) y 4 LEDs (salidas). 14: Memoria EEPROM serie externa 24L256 de 256K x 8 15: Pantalla de cristal líquido LCD 16: Zumbador 17: Área de prototipos 18: Sensor de temperatura Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 9 Conexión al depurador y programador MPLAB IDC 2 USB al computador Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos Placa de desarrollo Microchip PICDEM 2 PLUS Pulsador S1 Reset Potenciómetro EEPROM Pulsador S2 PIC 18F452 Continúa 10 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 11 Placa de desarrollo Microchip PICDEM 2 PLUS Zumbador Sensor de temperatura Pulsador S3 LEDs Continúa Pantalla de cristal líquido Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos Placa de desarrollo Microchip PICDEM 2 PLUS RS 232 12 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 13 Sistemas embebidos 14 Compilador MPLAB C18 en entorno MPLAB IDE Universidade de Vigo – EUITI Informática Industrial 2004-2005 Compilación, enlazado con MPLAB C18 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 15 Primer ejemplo con MPLAB C18 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. #include <p18f452.h> int contador; void main () { contador = 1; TRISB = 0; while (contador <= 15) { PORTB = contador; contador ++; } } Universidade de Vigo – EUITI Informática Industrial 2004-2005 Contador utilizado para repetir el bucle 15 veces Configura todas las líneas del puerto B como salidas digitales A cada paso del bucle, las 8 líneas del puerto B reflejan el estado del contador Sistemas embebidos Configuración del sistema de desarrollo MPLAB IDE: selección del microcontrolador Configure ĺ Select device - Soporte para la familia de microcontroladores Microchip PIC18 - Configuración del sistema de desarrollo, con diferentes SFR (Special Function Registers) y espacio de direccionamiento - Soporte de herramientas de programación y depuración. 16 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 17 Sistemas embebidos 18 Creación de un nuevo proyecto: Project ĺ New Elección del compilador: Project ĺ Select Language Toolsuite Universidade de Vigo – EUITI Informática Industrial 2004-2005 Añadir un fichero fuente al proyecto: File ĺ New Editar y guardar en ejemplo.c En la ventana de proyecto añadir: - Fichero fuente ejemplo.c - Script de enlazado: 18f452i.lkr para simulación 18f452.lkr para MPLAB ICD2 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 19 Sistemas embebidos 20 Configuración de subdirectorios de trabajo Project ĺ Build options ĺ Project Ficheros creados en el mismo subdirectorio del proyecto Ficheros de declaraciones en c:\mcc18\h Bibliotecas en c:\mcc18\lib Script de enlazado en c:\mcc18\lkr Universidade de Vigo – EUITI Informática Industrial 2004-2005 Compilación, enlazado y generación de código máquina Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 21 P1.lst: listado con código máquina y código ensamblador. Vista parcial: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Dirección programa Código máqina #include <p18f452.h> int contador; Código ensamblador 0000e2 0000e4 0000e6 0000e8 0000ea 0000ec 0000ee 0000f0 0000f2 0000f4 0000f6 0000f8 0000fa 0000fc 0000fe 000100 000102 00010e 0e01 0100 6f8a 6b8b 6a93 518b 0a00 aee8 d002 358b d005 0e0f 80d8 558a 0e00 558b e306 d7ee MOVLW MOVLB MOVWF CLRF CLRF MOVF XORLW BTFSS BRA RLCF BRA MOVLW BSF SUBFWB MOVLW SUBFWB BNC BRA 0x1 0x0 0x8a,0x1 0x8b,0x1 0x93,0x0 0x8b,0x0,0x1 0x0 0xe8,0x7,0x0 0xf8 0x8b,0x0,0x1 0x102 0xf 0xd8,0x0,0x0 0x8a,0x0,0x1 0x0 0x8b,0x0,0x1 0x110 0xec 000104 000106 000108 00010a 00010c c08a ff81 2b8a 0e00 238b MOVFF 0x8a,0xf81 INCF MOVLW ADDWFC 0x8a,0x1,0x1 0x0 0x8b,0x1,0x1 000110 0012 RETURN 0x0 int main () { contador = 1; TRISB = 0; while (contador <= 15) { PORTB = contador; contador ++; } Universidade de Vigo – EUITI } Sistemas embebidos Informática Industrial 2004-2005 P1.hex: código máquina en formato Intel INHX32 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Se indican 14 bytes :020000040000FA :0600000089EF00F0120080 :02002A000000D4 :0C0044002A0EF66E000EF76E000EF86E2D :1000500000010900F550856F0900F550866F03E136 :10006000856701D03DD00900F550806F0900F5503B :10007000816F0900F550826F09000900F550E96EA3 :100080000900F550EA6E090009000900F550836F78 :100090000900F550846F09000900F6CF87F0F7CF0B :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA :1000B000F8FF0001835302E1845307E00900F55083 :1000C000EE6E8307F8E28407F9D787C0F6FF88C091 :1000D000F7FF89C0F8FF00018507000E865BBFD7D8 :0200E00012000C :0E00E200010E00018A6F8B6B936A8B51000A2E :1000F000E8AE02D08B3505D00F0ED8808A55000EA1 :100100008B5506E38AC081FF8A2B000E8B23EED726 :020110001200DB :0E01120015EE00F025EE00F0F86A019CA68EB6 :0E012000A69C22EC00F071EC00F0FDD712005E :00000001FF Se guardan a partir de 00E2 Se indican datos a almacenar Información a almacenar 00E2 0E 00E3 01 00E4 01 00 00E5 6F 00E6 8A 00E7 6B 00E8 8B 00E9 6A 00EA 93 51 00EB 00 00ED 0A Suma de comprobación 0E 00E2 00 010E 0001 8A6F 8B6B 936A 8B51 000A 2E 8B 00EC 22 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 23 Generación de un mapa de memoria: Project ĺ Build Options ĺ Project ĺ MPLINK Linker Activar casilla Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Mapa de memoria: generado en el fichero P1.map Direccionamiento de algunos identificadores: 1. 2. 3. 4. 5. PORTD TRISD contador _entry main 0x000f83 0x000f95 0x00008a 0x000000 0x0000e2 data data data program program extern extern extern extern extern C:\MCC18\SRC\PROC\p18f452.asm C:\MCC18\SRC\PROC\p18f452.asm C:\Ejemplos\P1\ejemplo.c C:\mcc18\src\startup\c018i.c C:\Ejemplos\P1\ejemplo.c Memoria de programa utilizada: 1. 2. 3. 4. 5. 6. Program Memory Usage Start End ----------------0x000000 0x000005 0x000044 0x00012d 242 out of 33048 program addresses used Comienzo ejecución: GOTO 0x112 Código de inicialización Bucle de ejecución contínua: LOOP: main () GOTO LOOP Código del programa 24 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 25 Elección del depurador: Debugger ĺ Select Tool ĺ MPLAB SIM MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardware MPLAB SIM: simulador Universidade de Vigo – EUITI Informática Industrial 2004-2005 Depuración de programas: ejecución de instrucciones Reset: comenzar de nuevo Step Out: ejecutar el resto de la función Step Over: en una llamada a una función, ejecutarla completamente Step Into: en una llamada a una función, detenerse al comienzo de la misma Run: ejecución contínua del programa Punto de ruptura Siguiente instrucción a ejecutar Sistemas embebidos 26 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 27 Particularidades de MPLAB C18: clase de almacenamiento overlay - Almacenamiento estático - Inicialización en cada llamada - Se comparte memoria en el caso de que no haya uso simultáneo - Ventaja: optimización de memoria, necesario en arquitecturas reducidas Ejemplos: a y b se guardan en a y b comparten memoria 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. int f () { overlay int a = 3; return a; } int g () { overlay int b = 7; return b; } int main () { f (); g (); } Universidade de Vigo – EUITI posiciones diferentes: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. int f () { overlay int a = 3; return a; } int g () { overlay int b = 7; b = f (); return b; } int main () { f (); g (); } Informática Industrial 2004-2005 Particularidades de MPLAB C18: parámetros static - Almacenamiento estático en lugar de pila - Ventajas: código más pequeño y rápido - No permite llamadas reentrantes Ejemplo: 1. 2. 3. 4. 5. 6. 7. 8. 9. int doblePila (int x) { return 2 * x; } int dobleEstatico (static int x) { return 2 * x; } Sistemas embebidos en funciones 28 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 29 Memoria de datos Memoria interna organizada en bancos de 256 bytes También existe direccionamiento indexado, que permite manejar toda la memoria RAM de forma lineal. Universidade de Vigo –- EUITI EUITI Informática Informática Industrial Industrial 2004-2005 2004-2005 Banco de memoria especial: Formado con los 128 primeros bytes del banco 0 y los SFR La memoria interna se reduce a este banco cuando el bit a del código máquina está a 0 Ventaja: mayor rapidez de acceso Ejemplo: copiar valor desde el acumulador a la dirección dddd dddd con la etiqueta D Ensamblador: MOVWF D, a Máquina: 0110 111a dddd dddd Caso particular: MOVWF PORTB, 0 0110 1110 1000 0001 Sistemas embebidos 30 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 31 Soporte en MPLAB C18 para especificación de banco en memoria de datos: - Clase de almacenamiento far para variables que pueden residir en cualquier banco. - Clase de almacenamiento near para variables que tienen que residir en el banco especial. - Ejemplo: 1. 2. 3. 4. 5. 6. 7. 8. far int f; int main () { near int n; f = 3; n = 5; } Universidade de Vigo – EUITI Compilación 1. 2. 3. 4. 5. 6. 7. 8. MOVLB 0x0 MOVLW 0x3 MOVWF 0x8A,0x1 CLRF 0x8B,0x1 Informática Industrial 2004-2005 Configuración del modelo de memoria Project Ļ Build Options Ļ Project Ļ MPLAB C18 Ļ Categories Ļ Memory Model ; ; ; ; ; ; ; ; BSR=0 para seleccionar el banco 0 Carga 0x3 en acumulador Copia acumulador en 0x8A seleccionando banco con BSR Pone a cero la dirección 0x8B, seleccionando banco con BSR Sistemas embebidos 32 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Mapa de memoria de programa Sistemas embebidos 33 Sistemas embebidos 34 Pila Comienzo después de una inicialización (reset) Dos tipos de interrupciones: de alta y baja prioridad Memoria de programa interna Capacidad de direccionamiento de hasta 2 Mb Pila independiente: - Hasta 31 direcciones de retorno desde rutina o interrupción Posible memoria de programa externa Universidade de Vigo – EUITI Informática Industrial 2004-2005 Datos en memoria de programa - Memoria FLASH no volátil de lectura/escritura - Mayor capacidad que la RAM. Almacenamiento de información constante o que no se va a modificar frecuentemente. - Se manejan mediante los SFR: TBLPTRU (TaBLe PoinTeR Upper byte) TBLPTRH (TaBLe PoinTeR High byte) TBLPTRL (TaBLe PoinTeR Low byte) TABLAT (program memory TABLe LAtch) Dirección de memoria de programa Dato a transferir - Instrucciones TBLRD (TaBle ReaD) y TBLWT (TaBLe WriTe) Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 35 Soporte en MPLAB C18 para datos en memoria de programa: - Clase de almacenamiento rom para variables que residen en memoria de programa. - Ejemplo: 1. #include <p18f452.h> 2. rom far char f; Según el fichero de mapa de memoria, la variable f se almacena en la dirección 0x000112 3. 4. 5. 6. int main () { f = 3; } TBLPTRU:TBLPTRH:TBLPTRL = 0x000112 Compilación 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. MOVLW 0x12 MOVWF TBLPTRL, 0 ; Carga 0x12 en el acumulador ; Copia el acumulador en TBLPTRL MOVLW 0x1 MOVWF TBLPTRH, 0 ; Carga 0x1 en el acumulador ; Copia el acumulador en TBLPTRH MOVLW 0x0 MOVWF TBLPTRU, 0 ; Carga 0x0 en el acumulador ; Copia el acumulador en TBLPTRU MOVLW 0x3 MOVWF TABLAT, 0 ; Carga 0x3 en el acumulador ; Copia el acumulador en TABLAT TBLWT ; Escribe en memoria FLASH Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Punteros a memoria de datos y de programa - Incompatibles debido a que a puntan a diferentes tipos de memoria. - Ejemplo: 1. #include <p18f452.h> 2. 3. int x, * px; rom int y, * py; 4. 5. 6. 7. 8. 9. int main () { px = & x; py = & y; px = py; } Error Tamaño de los punteros: Puntero a memoria de datos int * p; 16 bits Puntero near a memoria de programa rom near int * p; 16 bits Puntero far a memoria de programa rom far int * p; 24 bits 36 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 37 Información en memoria de programa - Caso típico: cadenas de caracteres constantes. - Hay funciones para realizar trasvases RAM ļ ROM ram ĺ ram char * strcpy (auto char * destino, auto const char * origen); rom ĺ ram char * strcpypgm2ram (auto char * destino, auto const rom char * origen); ram ĺ rom rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen); rom ĺ rom rom char * strcpypgm2pgm (auto rom char * destino, auto const rom char * origen); const: la cadena de caracteres origen no se modifica auto: los parámetros de estas funciones se manejan en la pila Ejemplo 1. 2. 3. 4. Universidade de Vigo – EUITI rom far const char cadenaROM [] = "Hola"; char cadenaRAM [20]; strcpypgm2ram (cadenaRAM, cadenaROM); Informática Industrial 2004-2005 Sistemas embebidos 38 Configuración del microcontrolador - Los compiladores de lenguaje C utilizan la directiva #pragma para poder indicar información no estandarizada al compilador. - Ejemplos para la configuración de un PIC en un programa compilado con MPLAB C18: 1. 2. 3. 4. 5. 6. 7. 8. #pragma config OSC = HS // Se utiliza un cristal de cuarzo de frecuencia alta #pragma config WDT = OFF // Se desactiva el perro guardián (WatchDog Timer) #pragma config LVP = OFF // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming) - También se pueden establecer en el MPLAB IDE, bajo Configure ĺ Configuration bits ... Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 39 Ejemplo de unión: líneas del microcontrolador con varias funciones Parte del fichero p18f452.h 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. union { struct { unsigned RD0:1; unsigned RD1:1; unsigned RD2:1; unsigned RD3:1; unsigned RD4:1; unsigned RD5:1; unsigned RD6:1; unsigned RD7:1; }; struct { unsigned AD0:1; unsigned AD1:1; unsigned AD2:1; unsigned AD3:1; unsigned AD4:1; unsigned AD5:1; unsigned AD6:1; unsigned AD7:1; }; } PORTDbits ; Universidade de Vigo – EUITI Manejo como 8 señales digitales Utilización en un programa 1. 2. 3. 4. 5. 6. 7. 8. #include <p18f452.h> int main () { int x; PORTDbits.RD0 = 1; x = PORTDbits.RD2; } Manejo como 8 entradas analógicas Informática Industrial 2004-2005 Incluir código en ensamblador - Ejemplo: insertar un pequeño retardo mediante la ejecución de la instrucción NOP 1. 2. 3. 4. 5. #include <p18f452.h> 6. Instrucciones 7. 8. 9. _asm NOP _endasm 10. Instrucciones 11. } int main () { Sistemas embebidos 40 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 41 Rutinas de atención a interrupciones 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. #include <p18f452.h> #pragma code bajaPrioridad = 0x18 void saltoBajaPrioridad (void) { _asm GOTO rutinaBajaPrioridad _endasm } Creación de una nueva sección de código a partir de la dirección 0x18 denominada bajaPrioridad Instrucción insertada en la dirección 0x18 Cerrar sección bajaPrioridad y abrir sección normal de código #pragma code #pragma interruptlow rutinaBajaPrioridad void rutinaBajaPrioridad (void) { Rutina que atiende a la interrupción Código que atiende a la interrupción } #pragma code sección=dirección Abre una sección de código #pragma interruptlow Permite indicar cuál es la rutina que atiende a las interrupciones de baja prioridad #pragma interrupt Permite indicar cuál es la rutina que atiende a las interrupciones de alta prioridad Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos Ejemplo: interrupciones mediante temporizador TMR0 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. #include <p18f452.h> // Definición de la función rutinaInterrupción que va a atender interrupciones #pragma interrupt rutinaInterrupcion void rutinaInterrupcion () { if (INTCONbits.TMR0IF) // Si la interrupción la produjo TMR0 { INTCONbits.TMR0IF = 0; // Poner a 0 ese indicador PORTBbits.PORTB0 = ! PORTBbits.PORTB0; // Cambia la salida 0 del puerto B } } #pragma code seccionAltaPrioridad = 0x08 // Abre una sección de código en 0x08 void rutinaAltaPrioridad (void) { _asm GOTO rutinaInterrupcion // Salto a la rutina que atiende a las // interrupciones de alta prioridad _endasm } #pragma code // Vuelve a la sección de código normal Continúa 42 Universidade de Vigo – EUITI 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. Informática Industrial 2004-2005 Sistemas embebidos 43 void main () { INTCON = 0x20; INTCON2 = 0x84; // Habilita interrupción del temporizador 0, pero // deshabilitándolas globalmente // La configura como interrupción de alta prioridad RCONbits.IPEN = 1; TMR0H = 0; // Habilita interrupciones de diferentes prioridades TMR0L = 0; T0CON = 0x82; // Pone temporizador a cero // Configura a TMR0 como temporizador con contaje ascendente // de 16 bits, frecuencia de incremento = reloj/8 y lo activa, // genera una interrupción a cada transición 0xFFFF->0x0000 INTCONbits.GIEH = 1; // Habilita interrupciones globalmente TRISB = 0; // Señales del puerto B configuradas como salidas while (1); } // Bucle infinito vacío Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 44 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 45 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 46 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 47 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 48 Situar datos en direcciones específicas - Secciones de dos tipos: udata: variables estáticas sin valor inicial idata: variables estáticas con valor inicial 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. #include <p18f452.h> #pragma udata zona1 = 0x100; // Define una nueva sección en la memoria de datos que comienza // en la dirección 0x100. A esta nueva sección se le asigna // el identificador zona1 int x, y, z; // Dentro de esta sección se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma idata zona2 = 0x200; // Sección zona2 de datos inicializados a partir de 0x200 int a, b; // Variables a y b que se guardan a partir de 0x200 y 0x202 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 49 Secciones que comparten memoria - Se pueden declarar varias secciones de datos en las mismas posiciones de memoria, siempre y cuando no se utilicen simultaneamente. - Se utiliza la palabra reservada overlay 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. #include <p18f452.h> #pragma udata overlay seccionCompartida1 = 0x100; // Define una nueva sección en la memoria de datos que comienza // en la dirección 0x100. La memoria utilizada en esta sección se // puede compartir para otra sección. int x, y, z; // Dentro de esta sección se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma udata overlay seccionCompartida2 = 0x100; // Sección de datos almacenados a partir de 0x100 long a, b; // Variables a y b que se guardan a partir de 0x100 y 0x104 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos Visualizadores de 7 segmentos abcdefg Ver 1111110 0 0110000 1 1101101 2 1111001 3 0110011 4 1011011 5 1011111 6 1110000 7 1111111 8 1111011 9 1110111 A 0011111 b 1001110 C 0111101 d 1001111 E 1000111 F Cátodo común Ánodo común 50 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 51 Pantallas de cristal líquido (LCD, Lyquid Crystal Display) alfanuméricas - Configuraciones típicas: 1, 2 o 4 filas y 16, 20 o 40 columnas. - Bus de datos y de control: Número de línea Señal 1 Vss Masa 2 Vdd Alimentación +5Vdc para circuitos lógicos 3 Vc Alimentación para la pantalla 4 RS Transmisión de texto (RS=1) o transmisitón de instrucción (RS=0) 5 R/W Operación de lectura (R/W=1) o escritura (R/W=0) 6 E 7-14 DB0-DB7 Universidade de Vigo – EUITI Significado Pulso a nivel alto para realizar la transferencia Bus de datos Sistemas embebidos Informática Industrial 2004-2005 Configuración del bus de datos µC DB0-DB7 8 bits LCD µC 4 bits LCD DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RD0 RD1 RD2 RD3 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 E R/W RS RA1 RA2 RA3 E R/W RS dato DB4-DB7 R/W R/W E E bits 4-7 bits 0-3 52 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 53 Envío de instrucciones con bus de 4 bits 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. #include <p18f452.h> // Macros para #define E_LCD #define RW_LCD #define RS_LCD dar nombre a las líneas del puerto PORTB utilizadas PORTAbits.RA1 PORTAbits.RA2 PORTAbits.RA3 void instruccionLCD (unsigned char instruccion) // Envía al LCD la instrucción codificada en el parámetro { RS_LCD = 0; // Se va a enviar una instrucción RW_LCD = 0; // En una operación de escritura PORTD &= 0xF0; // Pone a cero los 4 bits menos significativos de PORTD PORTD |= instruccion >> 4; // Pone en PORTD(0-3) los 4 bits más significativos E_LCD = 1; E_LCD = 0; // Pulso de activación de transferencia PORTD &= 0xF0; PORTD |= instruccion & 0x0F; // Pone en PORTD(0-3) los 4 bits menos significativos E_LCD = 1; E_LCD = 0; // Otro pulso de transferencia } Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Juego de instrucciones de una pantalla LCD Bus de datos en dos transferencias de 4 bits DB4-DB7 Instrucción RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Borrar pantalla 0 0 0 0 0 0 0 0 0 1 Cursor a origen 0 0 0 0 0 0 0 0 1 * Modo introducción 0 0 0 0 0 0 0 1 I/D S Activación pantalla 0 0 0 0 0 0 1 D C B Desplazamiento 0 0 0 0 0 1 S/C R/L * * Función 0 0 0 0 1 DL N F * * Dirección CGRAM 0 0 0 1 Dirección DDRAM 0 0 1 Dirección DDRAM Lee estado 0 1 BF Dirección DDRAM Escritura en RAM 1 0 Dato Lectura en RAM 1 1 Dato Dirección CGRAM 54 Universidade de Vigo – EUITI Bit I/D Sistemas embebidos Informática Industrial 2004-2005 Significado Decrementa (0) o incrementa (1) la posición del cursor con cada escritura S Sin desplazamiento (0) o con desplazamiento (1) D Pantalla apagada (0) o en funcionamiento (1) C Cursor invisible (0) o visible (1) B Cursor fijo (0) o con parpadeo (1) S/C Se desplaza el cursor (0) o toda la información (1) con cada escritura R/L Desplazamiento a la izquierda (0) o a la derecha (1) DL Bus de 4 bits (0) o de 8 bits (1) N LCD de una fila (0) o de más filas (1) F Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1) BF Universidade de Vigo – EUITI Inicialización 55 La pantalla está ocupada (1) o puede aceptar otra instrucción (0) Informática Industrial 2004-2005 Sistemas embebidos 56 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 57 Sistemas embebidos 58 Conversión analógico/digital - Ocho entradas analógicas de 10 bits de resolución. - Referencia de tensión interna o externa. - Manejo por consulta o interrupción. Universidade de Vigo – EUITI Informática Industrial 2004-2005 Continúa Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 59 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 60 Continúa Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 61 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 62 Conversión analógico/digital mediante consulta 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. #include <p18f452.h> void main (void) { float resultado; // Para recoger la medida expresada en voltios TRISAbits.TRISA0 = 1; // El bit menos significativo del puerto RA es una línea de entrada ADCON0 = 0x41; // Activa el módulo de conversión analógica, selecciona el canal 0 y // utiliza un tiempo de conversión igual 8 veces el período del oscilador ADCON1 = 0x8E; // El resultado de la conversión se sitúa en los 10 bits menos significativos // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN0 while (1) // Ejecutar contínuamente ... { ADCON0bits.GO_DONE = 1; // Solicita una conversión while (ADCON0bits.GO_DONE); // Espera mientras no finalice resultado = (float) ADRES * 5 / 1024; // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolución Utilizar el resultado de la conversión } } Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 63 Conversión analógico/digital mediante interrupción 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. #include <p18f452.h> float resultado; // Para recoger la medida expresada en voltios int finConversion; // Booleano cierto si terminó la conversión #pragma interrupt interrupcionConversionAD void interrupcionConversionAD (void) // Rutina que atiende a la interrupción producida cuando finaliza una // conversión A/D { resultado = (float) ADRES * 5 / 1024; // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolución finConversion = 1; // Indica que ya se dispone de la medida PIR1bits. ADIF = 0; // Hay que poner a cero el aviso de interrupción } #pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionConversionAD _endasm } // Atiende a interrupciones prioritarias Continúa Universidade de Vigo – EUITI 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. #pragma code Informática Industrial 2004-2005 Sistemas embebidos // Vuelve a la sección de código normal void main (void) { TRISAbits.TRISA0 = 1; // El bit menos significativo del puerto RA es una línea de entrada ADCON0 = 0x41; // Activa el módulo de conversión analógica, selecciona el canal 0 y // utiliza un tiempo de conversión igual 8 veces el período del oscilador ADCON1 = 0x8E; // El resultado de la conversión se sitúa en los 10 bits menos significativos // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN0 IPR1bits.ADIP = PIE1bits.ADIE = INTCONbits.GIEH RCONbits.IPEN = 1; // Interrupciones de fin de conversión son de alta prioridad 1; // Permite interrupciones por conversión A/D = 1; // Permite interrupciones de alta prioridad 1; // Distingue entre interrupciones de alta y baja prioridad while (1) // Ejecutar contínuamente ... { finConversion = 0; // Prepara a este booleano ADCON0bits. GO_DONE = 1; // Solicita una conversión while (! finConversion); // Espera mientras no finalice Utilizar resultado de conversión } } 64 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 65 Unidad de captura Temporizador 3 Interrupción Entrada Captura Selección de temporizador Temporizador 1 Selección de flanco Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 66 Ejemplo Programa que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de tiempo entre dos flancos ascendentes en la línea RC2/CCP1 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. #include <p18f452.h> unsigned int duracion; // Tiempo transcurrido entre dos flancos ascendentes de la línea RC2/CCP1 #pragma interrupt interrupcionComparacion void interrupcionComparacion (void) // Rutina que atiende a la interrupción producida cuando se detecta un flanco // ascendente en RC2/CCP1 { unsigned static int anterior; // Recuerda el instante en el que se detectó el último flanco ascendente if (PIR1bits. CCP1IF) // Si la interrupción se produjo debido a una captura ... { duracion = CCPR1 - anterior; // Intervalo entre este flanco y el anterior anterior = CCPR1; // Recuerda este instante para la siguiente vez } PIR1bits. CCP1IF = 0; // Hay que poner a cero el aviso de interrupción } Continúa Universidade de Vigo – EUITI 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. #pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionComparacion _endasm } #pragma code Sistemas embebidos Informática Industrial 2004-2005 67 // Atiende a interrupciones prioritarias // Vuelta a la sección de código normal void main (void) { TRSCbits. TRISC2 = 1; // Configura la línea RC2/CCP1 como entrada // Configuración de TIMER1: T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operación de 1/8 T1CONbits. T1CKPS0 = 1; T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno T1CONbits. T1SYNC = 1; // Sin sincronización con señal externa T1CONbits. TMR1ON = 1; // Activa TIMER1 T3CONbits. T3CCP2 = 0; CCP1CON = 0x05; // La unidad de captura de la línea CCP1 utiliza TIMER1 // La captura se realiza en los flancos ascendentes PIE1bits. CCP1IE = 1; // Habilita interrupciones de captura en CCP1 RCONbits. IPEN = 1; // Habilita interrupciones prioritarias INTCONbits. GIE = 1; // Habilitación global de interrupciones while (1); } Universidade de Vigo – EUITI // Bucle indefinido de espera Informática Industrial 2004-2005 Sistemas embebidos 68 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 69 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 70 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 71 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 72 Tarjetas magnéticas - Codificación estandarizada: - Pista 2: número de tarjeta y fecha de caducidad, según ISO 7811/2-1985. - Lectores de tarjetas: salida de información en serie. Ejemplo: - Señal CLD: activa a nivel bajo mientras se efectúa una lectura. - Señal RCL: cuando está a nivel bajo, en RDT hay una señal válida. - Señal RDT: salida de información con lógica inversa. CLD RCL RDT 1 1 0 Dígitos de 4 bits: 10112 1 0 Paridad impar: 0 Banda magnética Universidade de Vigo – EUITI SS Sistemas embebidos Informática Industrial 2004-2005 PAN FS CC ED Más dígitos ... ES 73 LRC SS (Start Sentinel): delimitador de comienzo, valor 10112. PAN (Primary Account Number): número de tarjeta, hasta 19 dígitos. FS (Field Separator): separador de campos, valor 11012. CC (Country Code): código de país, 3 dígitos ED (Expiration Date): fecha de caducidad, 4 dígitos ES (End Sentinel): delimitador de final de lectura, valor 11112. LRC (Longitudinal Redundancy Check): para comprobación de errores, o-exclusiva de todo lo leído, desde SS hasta ES. Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 74 Lectores fotoeléctricos Superficie clara Fotodiodo Fototransistor CNY70 4K7 Vcc Salida 220 GND Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 75 Codificadores incrementales rotativos (rotary encoders) Fotodiodo Disco LEDs Eje Rodamientos Disco codificado Inserción sellada Cable Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 76 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 77 Sistemas embebidos 78 Células fotoeléctricas Emisor/receptor: - Grandes distancias (20 m). - Sensible a fallos de alineación. Reflexión mediante catadióptrico: - Hasta 3 m. - Fácil instalación. Reflexión difusa: - Hasta 30 cm. - Sensible al color y tipo de superficie. Universidade de Vigo – EUITI Canal A Informática Industrial 2004-2005 A PIC18F452 Canal B B Cambio de sentido A B RA4/T0CKI RC0/T1CKI Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 79 void main (void) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. { int posicion = 0; unsigned timer0, timer1; T0CON = 0xA8; // Configura TIMER0: lo activa, contador de 16 bits de flancos ascendentes en // entrada T0CKI T1CON = 0x83; // Configura TIMER1: lo activa como contador de 16 bits de flancos ascendentes en // entrada T1CKI ... timer0 = TMRL0; // Primero hay que leer la parte baja timer0 |= TMRH0 << 8; // y luego hay que combinarla con la parte alta timer1 = TMRL1; timer1 |= TMRH1 << 8; posicion = timer0 - timer1; // Calcula la posición del encóder como la diferencia entre el número de // pulsos en uno y otro sentidos } Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 80 Alternativa: puerto en el que se produce una interrupción cuando cambia cualquier señal A B A xor B 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. unsigned long posicion = 0; // Posición del encóder #define A PORTBbits.RB0 // El canal A conectado a RB0 #define B PORTBbits.RB1 // El canal B conectado a RB1 void interrupcionCambioPuerto () { int xor; static int primera = 0, Aanterior, Banterior; if (! primera) // Si no es la primera interrupción ... { xor = A ^ B; // Calcula a o-exclusiva if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++; else posicion --; // actualiza la posición } else primera = 0; // La siguiente ya no es la primera interrupción Aanterior = A; // Recuerda el estado anterior en el canal A Banterior = B; // Lo mismo para el canal B } Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 81 Códigos de barras - Ejemplo: formato Code 39 o "Código 3 de 9". - Cada carácter se codifica con 9 barras (5 negras y 4 blancas), 3 de las cuales son más anchas que las demás. - Entre caracteres consecutivos se inserta un pequeño espacio equivalente a una barra blanca. - Se pueden codificar cadenas compuestas por caracteres 0123456789ABCDEFGHIJKLMNOPQRS TUVWXYZ-.$/+% y espacio en blanco. - El asterisco * se utiliza como delimitador de inicio y final de cadena. - Ejemplo, para codificar la cadena PO-2537: * P Universidade de Vigo – EUITI Carácter O - 2 5 3 7 G * Sistemas embebidos Informática Industrial 2004-2005 Patrón de barras Codificación Carácter Patrón de barras M ŰŰ ŰŰ Ű Ű 1 ŰŰ Ű Ű Ű ŰŰ 1101 0010 1011 2 Ű ŰŰ Ű Ű ŰŰ 1011 0010 1011 N Ű Ű ŰŰ Ű 3 ŰŰ ŰŰ Ű Ű Ű 1101 1001 0101 O ŰŰ Ű ŰŰ Ű 4 Ű Ű ŰŰ Ű ŰŰ 1010 0110 1011 P Ű ŰŰ ŰŰ Ű 5 ŰŰ Ű ŰŰ Ű Ű 1101 0011 0101 Q Ű Ű Ű ŰŰ 6 Ű ŰŰ 7 Ű Ű 8 ŰŰ Ű Codificación Ű 1101 1010 1001 ŰŰ 1010 1101 0011 Ű 1101 0110 1001 Ű 1011 0110 1001 ŰŰ 1010 1011 0011 ŰŰ Ű Ű 1011 0011 0101 R ŰŰ Ű Ű ŰŰ Ű 1101 0101 1001 Ű ŰŰ ŰŰ 1010 0101 1011 S Ű ŰŰ Ű ŰŰ Ű 1011 0101 1001 Ű ŰŰ Ű 1101 0010 1101 T Ű Ű ŰŰ ŰŰ Ű 1010 1101 1001 Ű ŰŰ Ű 1011 0010 1101 U ŰŰ Ű Ű Ű ŰŰ 1100 1010 1011 ŰŰ ŰŰ Ű 1010 0110 1101 9 Ű ŰŰ 0 Ű Ű V Ű A ŰŰ Ű Ű Ű ŰŰ 1101 0100 1011 W ŰŰ Ű ŰŰ 1011 0100 1011 X Ű Ű Ű 1101 1010 0101 Y ŰŰ Ű ŰŰ 1010 1100 1011 Z Ű Ű Ű 1101 0110 0101 - Ű Ű Ű ŰŰ ŰŰ 1001 0101 1011 ŰŰ Ű Ű ŰŰ Ű 1100 1010 1101 B Ű ŰŰ Ű C ŰŰ ŰŰ Ű D Ű Ű ŰŰ E ŰŰ Ű ŰŰ ŰŰ Ű Ű ŰŰ 1001 1010 1011 ŰŰ Ű Ű Ű 1100 1101 0101 Ű ŰŰ Ű ŰŰ 1001 0110 1011 Ű ŰŰ Ű Ű 1100 1011 0101 ŰŰ ŰŰ Ű Ű 1001 1011 0101 Ű Ű 1011 0110 0101 . ŰŰ ŰŰ 1010 1001 1011 Espacio Ű ŰŰ Ű ŰŰ Ű 1001 1010 1101 ŰŰ Ű Ű ŰŰ Ű 1101 0100 1101 * Ű Ű ŰŰ ŰŰ Ű 1001 0110 1101 $ Ű Ű Ű 1001 0010 1001 F Ű ŰŰ ŰŰ G Ű Ű Ű H I Ű ŰŰ Ű ŰŰ Ű 1011 0100 1101 J Ű Ű ŰŰ ŰŰ Ű 1010 1100 1101 / Ű Ű Ű Ű Ű 1001 0010 1001 K ŰŰ Ű Ű Ű ŰŰ 1101 0101 0011 + Ű Ű Ű Ű Ű 1001 0100 1001 L Ű ŰŰ Ű Ű ŰŰ 1011 0101 0011 % Ű Ű Ű Ű Ű 1010 0100 1001 Ű Ű 82 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Checksum final - Suma de todos los dígitos módulo 43 - Ejemplo: para PO-2537: P O 2 5 3 7 = = = = = = = 25 24 36 2 5 3 7 + 102 Resto de la división 102/43 = 16 Checksum = carácter G Universidade de Vigo – EUITI Carácter Valor Carácter Valor 1 1 M 22 2 2 N 23 3 3 O 24 4 4 P 25 5 5 Q 26 6 6 R 27 7 7 S 28 8 8 T 29 9 9 U 30 0 0 V 31 A 10 W 32 B 11 X 33 C 12 Y 34 D 13 Z 35 E 14 - 36 F 15 . 37 G 16 Espacio 38 H 17 * I 18 $ 39 J 19 / 40 K 20 + 41 L 21 % 42 Sistemas embebidos Informática Industrial 2004-2005 Transmisión serie síncrona - Todos los bytes que componen un mensaje se transmiten juntos. - Los bits que componen cada byte se representan eléctricamente en el mismo hilo conductor sucesivamente, durante un pequeño intervalo de tiempo que depende de la velocidad de transmisión. - Sincronización entre transmisor y receptor mediante una señal de reloj independiente (ejemplo, SPI) o modulada en la información enviada (ejemplo, Ethernet) a cada bit. byte 1 byte 2 byte 3 Transmisión serie asíncrona - Canales frecuentes en aplicaciones industriales: RS-232, RS-485, RS-422. - Cada byte se transmite de forma independiente. - Los bits que componen cada byte se representan eléctricamente en el mismo hilo conductor sucesivamente, durante un pequeño intervalo de tiempo que depende de la velocidad de transmisión. - Bit de comienzo (start bit, nivel 0) inicial y período de reposo final (nivel 1) para sincronización entre transmisor y receptor a cada byte. byte 1 byte 2 83 byte 3 84 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 85 Transmisión serie asíncrona Bit de comienzo T Período de reposo Instantes de escritura T T T T T T T T 1 1 0 1 0 0 0 1 T+ T 2 T T T T T T bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 T Instantes de lectura Instante de sincronización Instante de sincronización - Bits transmitidos por byte: normalmente 7 u 8. - Bit de paridad: par, impar, ninguna. - Período de reposo (stop bits): 1, 1.5, 2 - Velocidad de transmisión: 1/T en bits/s. (baud) Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos RS 485 Half-duplex RS 422 Maestro Full-duplex Esclavos 86 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 87 Protocolos maestro/esclavo Maestro 0 Orden dirigida al esclavo 2 Respuesta Esclavo 1 Esclavo 2 Esclavo 3 Sincronización del diálogo Orden 2 0 2 3 0 Tiempo mínimo entre ciclos orden/respuesta Dirección origen Dirección destino Universidade de Vigo – EUITI Otra orden Respuesta 0 Sistemas embebidos Informática Industrial 2004-2005 Controlador Omron E5CK - Control PID autoajustable (auto-tuning, self-tuning) mediante algoritmo borroso (fuzzy). - Entrada: sensor de temperatura (termopar o resistencia de platino), tensión (0-10V) o bucle de corriente (4-20 mA). - Salida analógica o modulada en ancho de pulso (PWM Pulse Width Modulation) - Canal RS 485 para supervisión y control externos. Calentamiento Temperatura Consigna Sensor Tiempo Período de autoajuste 88 Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 89 Ejemplo de aplicación: control de humedad de un recinto Sensor de humedad Humidificador Salida Alarma Alimentación 220 VAC Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Control on/off Histéresis Actuación Zona muerta Dead band ON Zona de calentamiento OFF Zona de enfriamiento Punto de consigna Set point Temperatura 90 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 91 Sistemas embebidos 92 Configuración de parámetros de comunicación Número de nodo: 0 a 99 Paridad: par, impar, ninguna Universidade de Vigo – EUITI Bits por byte: 7, 8 Bits parada: 1, 2 Velocidad: 1.2, 2.4, 4.8, 9.6, 19.2 Kbaud Informática Industrial 2004-2005 Protocolo de comunicación: operación de escritura - Formato texto - Ejemplo: modificar el valor de consigna (parámetro número 1) a 300.0 grados en el nodo 9. Dirección destino Orden Maestro esclavo @ 0 Comienzo 9 Parámetro a modificar 2 @ 0 Comienzo 1 3 Operación de escritura Dirección origen Respuesta Esclavo maestro 0 XOR 9 0 0 0 Operación de escritura 7 9 1 * Cr Fin orden Valor Parámetro modificado 2 0 Valor 0 0 Operación correcta 3 0 0 Fin respuesta 0 7 9 XOR * Cr Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 93 Sistemas embebidos 94 Cálculo de la XOR Carácter ASCII Decimal ASCII Hexadecimal ASCII Binario @ 64 40 0001 0000 0 48 30 0011 0000 9 57 39 0011 1001 2 50 32 0011 0010 0 48 30 0011 0000 1 49 31 0011 0001 3 51 33 0011 0011 0 48 30 0011 0000 0 48 30 0011 0000 0 48 30 0011 0000 121 79 0111 1001 XOR = Universidade de Vigo – EUITI Informática Industrial 2004-2005 Protocolo de comunicación: operación de lectura - Ejemplo: obtener el valor actual de la variable controlada en el nodo 9. Nodo destino Orden Maestro esclavo @ 0 Comienzo 9 Parámetro a leer 1 @ 0 Comienzo 1 0 Operación de lectura Nodo origen Respuesta Esclavo maestro 0 XOR 9 0 0 0 Operación de lectura 7 9 1 * Cr Fin orden Valor No se utiliza Parámetro leído 1 0 Valor 0 0 Operación correcta 2 0 0 Fin respuesta 0 7 A XOR * Cr Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 95 Protocolo XON/XOFF - Quien recibe información solicita a quien le la envía que detenga temporalmente la transmisión, enviándole el carácter XOFF (código ASCII 17). - Quien recibe información le indica al transmisor que puede continuar mediante el carácter XON (código ASCII 19). - En comunicaciones manejadas mediante interrupción suelen utilizarse colas circulares: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. typedef struct { char datos [1000]; unsigned carga, descarga, cargados; } COLA; // Cola circular donde almacenar hasta 1000 caracteres, disponiendo de una // posición de carga, de descarga y contabilizando el número de caracteres // cargados COLA ColaRecepcion, ColaTransmision; // Colas circulares independientes para los datos recibidos y a transmitir unsigned char * pCanal; // Se supone que los caracteres que se reciben o se transmiten se guardan // o se leen de un registro mapeado en memoria en la dirección apuntada por // este puntero int XOFFRecibido, XOFFEnviado; // Booleanos que indican si se ha transmitido el carácter XOFF y si a su vez // se ha recibido Continúa Universidade de Vigo – EUITI 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. Informática Industrial 2004-2005 Sistemas embebidos 96 int Transmitiendo = 0; // Booleano que indica si hay alguna transmisión en curso #define XON 17 #define XOFF 19 // Macroinstrucciones para representar a los códigos ASCII de los caracteres // XON y XOFF void interrupt IRecibe () // Rutina que atiende a la interrupción que se produce cuando se recibe un // nuevo carácter { char recibido; recibido = * pCanal; // Recoge el carácter recibido if (recibido == XOFF) XOFFRecibido = 1; // Si se ha recibido un XOFF, indicarlo en este booleano else if (recibido == XON) // Si se ha recibido un XON ... { if (XOFFRecibido && ColaTransmision. cargados > 0) Envia (descarga (& ColaTransmision)); // Si previamente se ha recibido un XOFF y además hay aún caracteres en la // cola de envío, extraer un carácter de esa cola y enviarlo XOFFRecibido = 0; // Indica que ya podemos transmitir caracteres } Continúa Universidade de Vigo – EUITI 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. else Informática Industrial 2004-2005 Sistemas embebidos 97 // Si no es XON ni XOFF ... { if (ColaRecepcion. cargados > 900) // Si en la cola de entrada ya hay 900 caracteres ... { Envia (XOFF); // Envía un XOFF XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF } carga (recibido, & ColaRecepcion); // En cualquier caso carga en la cola de recepción el carácter recibido } } void interrupt IEnvia () // Rutina que atiende a la interrupción que se produce cuando ha finalizado // el envío de un carácter enviado anteriormente { if (ColaTransmision. cargados == 0) Transmitiendo = 0; // Si la cola de transmisión está vacía, no hay que enviar nada más if (! XOFFRecibido && ColaTransmision. cargados > 0) * pCanal = descarga (& ColaTransmision); // Si no se ha recibido XOFF y en la cola de transmisión hay algo, entonces // recoger un carácter de la misma y provocar su envío } Continúa Universidade de Vigo – EUITI 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. Informática Industrial 2004-2005 Sistemas embebidos 98 char RecibeCola () // Recoge de la cola de recepción un carácter y lo devuelve. Si esta cola está // vacía, devuelve un 0. { if (XOFFEnviado && ColaRecepcion. cuantos == 100) // Si se ha enviado previamente un XOFF y ya hay suficiente espacio libre en // la cola de recepción ... { * pCanal = XON; XOFFEnviado = 0; } // Envía un XON // Indica que se ha anulado el anterior envío de XOFF if (ColaRecepcion. cuantos > 0) // Si la cola de recepción no está vacía ... return descarga (& ColaRecepcion); // Devuelve un carácter de la misma else return 0; // Si no, devuelve un 0 } void EnviaCola (char dato) // Envía el carácter pasado por parámetro. Si hay una transmisión en curso, // lo guarda en la cola de transmisión { if (! Transmitiendo) // Si en este momento no hay transmisión en curso ... { * pCanal = dato; // Envía el carácter Transmitiendo = 1; // Indica que hay una transmisión en curso } else carga (& ColaTransmision, dato); // Si no, cárgalo en la cola } Continúa Universidade de Vigo – EUITI 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. Sistemas embebidos Informática Industrial 2004-2005 99 main () { pCanal = (unsigned char *) 0x100; // Supongamos que el registro para recepción/transmisión está mapeado en la // dirección 0x100; ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0; ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0; // Inicializa las colas de recepción y transmisión Instala (IRecibe, 3); Instala (IEnvia, 4); // Instala las rutinas para atender a las interrupciones Utiliza las funciones EnviaCola y RecibeCola para manejar el canal } Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 Códigos de redundancia cíclica - CRC (Cyclic Redundancy Check) - Algoritmos más utilizados: CRC-8 = X8 + X5 + X4 + 1 CRC-12 = X12 + X11 + X3 + X2 + X + 1 CRC-16 = X16 + X15 + X2 + 1 CRC-CCITT = X16 + X12 + X5 + 1 CRC-32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1 X0 D Q - Ejemplo: CRC-8 G X1 X2 X3 D Q D Q D Q G G G X4 D Q G X5 X6 X7 X8 Q D Q D D Q G Disparo para desplazamientos Entrada de bits G G 100 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 101 CRC-8 en lenguaje C 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. unsigned unsigned unsigned unsigned unsigned char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Información a procesar n = 4; // Número de bytes en la matriz m i, j; // Contadores para bucles char CRC8 = 0; // Variable donde se va a calcular el CRC-8 auxiliar; for (i = 0; i < n; i ++) // Procesando todos los bytes guardados en m ... { auxiliar = m [i]; // Copia el siguiente byte a procesar for (unsigned j = 0; j < 8; j ++) // Recorriendo los 8 bits de ese byte ... { if ((auxiliar & 0x01) ^ (CRC8 & 0x01)) // Si la XOR de entrada genera un 1 ... { CRC8 ^= 0x18; // Realiza también la XOR con los puntos de realimentación CRC8 >>= 1; // Desplaza todos los biestables CRC8 |= 0x80; // Añade un 1 en el biestable más significativo } else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC auxiliar >>= 1; // Continúa con el siguiente bit } } Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 102 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 103 Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 104 Velocidad de transmisión - Registro SPBRG - Si bit BRGH = 1, entonces velocidad = Foscilador / (16 * (SPBRG + 1)) - Si bit BRGH = 0, entonces velocidad = Foscilador / (64 * (SPBRG + 1)) Universidade de Vigo – EUITI Sistemas embebidos Informática Industrial 2004-2005 105 Configuración de la recepción Habilita interrupciones baja prioridad Habilita interrupciones alta prioridad Flag interrupción por recepción Habilita interrupción por recepción Prioridad de interrupción por recepción Permite interrupciones de diferentes prioridades Habilita comunicación Registro bit 7 bit 6 INTCON GIEH GIEL RCON IPEN bit 5 PIR1 RCIF PIE1 RCIE IPR1 RCIP RCSTA SPEN bit 3 bit 2 bit 1 bit 0 Bit 9 recibido CREN ADDEN FERR OERR RX9D RX9 RCREG Habilita bit 9 bit 4 Dato recibido TXTA SYNC SPBRG BRGH Velocidad de comunicación Habilita receptor 0 para modo asíncrono Universidade de Vigo – EUITI Habilita detección de dirección Selección de velocidad Overrun error Error de saturación del receptor Framing error Error de trama de bits Sistemas embebidos Informática Industrial 2004-2005 106 Configuración de la transmisión Habilita interrupciones baja prioridad Habilita interrupciones alta prioridad Flag interrupción por transmisión Habilita interrupción por transmisión Prioridad de interrupción por transmisión Permite interrupciones de diferentes prioridades Habilita comunicación Registro bit 7 bit 6 INTCON GIEH GIEL RCON IPEN bit 4 PIR1 TXIF PIE1 TXIE IPR1 TXIP RCSTA TXTA bit 2 bit 1 bit 0 Dato a transmitir TX9 SPBRG Habilita transmisor bit 3 SPEN TXREG Habilita bit 9 bit 5 TXEN SYNC BRGH TRMT TX9D Velocidad de comunicación 0 para modo asíncrono Selección de velocidad 1 cuando finalizó la serialización Bit 9 a transmitir Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 107 Recepción y envío por consulta 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. #include <p18f452.h> rom char mensaje[] = "\nHola\nEste programa hace eco de " "toda la información recibida\n"; // Cadena de caracteres guardada en memoria de programa void enviaCaracter (char caracter) // Envio de un carácter por consulta { while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carácter TXREG = caracter; // Suministra el carácter para serializarlo } char recibeCaracter (void) // Recepción de un carácter por consulta { while (! PIR1bits. RCIF); // Espera mientras no se na recibido nada PIR1bits. RCIF = 0; // Este flag hay que ponerlo a cero en el programa return RCREG; // Devuelve el carácter recibido } void inicializaCanalConsulta () // Inicializa el canal serie para recepción/transmisión por consulta { TRISCbits. TRISC6 = 0; // Línea de transmisión en RC6 como salida TRISCbits. TRISC7 = 1; // Línea de recepción en RC7 como entrada SPBRG = 25; // Con un reloj de 4 MHz fija una velocidad de 9600 baud TXSTA = 0x24; // 8 bits y sin paridad, habilita transmisor RCSTA = 0x90; // Habilita receptor } Continúa Universidade de Vigo – EUITI 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. Informática Industrial 2004-2005 Sistemas embebidos void enviaCadenaROM (rom char * cadena) // Envía por el canal serie una cadena de caracteres almacenada en ROM { rom char * p; p = cadena; // Apunta al primer carácter while (* p) // Mientras no se haya llegado al final de la cadena ... { enviaCaracter (* p); // Envía un carácter p ++; // Para enviar luego el siguiente } } void main (void) { char caracter; inicializaCanalConsulta (); // Inicializa los parámetros del canal enviaCadenaROM (mensaje); // Envía ese mensaje while (1) // Repite contínuamente ... { caracter = recibeCaracter (); // Espera a recibir un carácter y recógelo enviaCaracter (caracter); // Lo envía por el mismo canal } } 108