Está en la página 1de 54

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Microcontrolador Microchip PIC18F452


- Arquitectura RISC (Reduced Instruction Set Computer). - Juego de instrucciones reducido para ejecucin rpida. - Oscilador hasta 40 MHz 10 MIPs (Million Instructions Per second). - Optimizado para compilacin 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 - Perifricos integrados: - temporizadores, contadores, comparadores, unidades de captura - modulacin 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) - conversin A/D de 10 bits - perro guardin WDT (Watchdog Timer).

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Encapsulados PIC18F452:

QFN (Quad Flat No lead)

DIP PLCC

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Operaciones simultneas de lectura y ejecucin de instrucciones (pipeline)

Ciclos de reloj

MOVLW 55h MOVWF PORTB BRA SUB_1 BSF PORTA, BIT3

carga el valor 0x55 en el acumulador copia el acumulador en el puerto B salto a la rutina SUB_1 pone a 1 el bit 3 del puerto A

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Mapa de memoria de datos

Memoria de propsito general GPR (General Purpose Registers) Registros de configuracin y operacin SFR (Special Function Registers)

Bancos de memoria de 256 bytes

Registro de seleccin de banco BSR (Bank Select Register)

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

SFRs
- Direcciones 0xF80 a 0xFFF

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Microchip MPLAB C18


Entorno de programacin MPLAB IDE
- Gratuito, descargable desde http://www.microchip.com - IDE (Integrated Development Environment) para Windows. - Ensamblador, enlazador, gestin 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 matemticas en punto flotante. - Almacenamiento de variables multibyte de tipo little-endian. - Nmeros reales float y double de 32 bits.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Sistema de desarrollo Microchip MPLAB ICD 2


- Entorno de programacin y depuracin en tiempo real para microcontroladores Microchip PIC. - Conexin 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 lneas dedicadas.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Placa de desarrollo Microchip PICDEM 2 PLUS


1: Soporte para microcontroladores PIC de 18, 28 y 40 patillas. 2: Alimentacin de 9V (adaptador externo o pila) y regulador para 5V 100mA. 3: Conector RS 232 y driver MAX232. 4: Conexin al depurador MPLAB IDC 2. 5: Potencimetro para simulacin de entrada analgica. 6, 8: Tres pulsadores (entradas) y 4 LEDs (salidas). 14: Memoria EEPROM serie externa 24L256 de 256K x 8

15: Pantalla de cristal lquido LCD 16: Zumbador 17: rea de prototipos 18: Sensor de temperatura

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

Conexin al depurador y programador MPLAB IDC 2

USB al computador

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

10

Placa de desarrollo Microchip PICDEM 2 PLUS


Pulsador S1 Reset

Potencimetro

EEPROM Pulsador S2

PIC 18F452

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

11

Placa de desarrollo Microchip PICDEM 2 PLUS

Zumbador Pulsador S3

Sensor de temperatura

LEDs Pantalla de cristal lquido Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

12

Placa de desarrollo Microchip PICDEM 2 PLUS

RS 232

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

13

Compilador MPLAB C18 en entorno MPLAB IDE

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

14

Compilacin, enlazado con MPLAB C18

Universidade de Vigo EUITI

Informtica 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 ++; } }

Contador utilizado para repetir el bucle 15 veces Configura todas las lneas del puerto B como salidas digitales A cada paso del bucle, las 8 lneas del puerto B reflejan el estado del contador

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

16

Configuracin del sistema de desarrollo MPLAB IDE: seleccin del microcontrolador


Configure Select device

- Soporte para la familia de microcontroladores Microchip PIC18 - Configuracin del sistema de desarrollo, con diferentes SFR (Special Function Registers) y espacio de direccionamiento - Soporte de herramientas de programacin y depuracin.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

17

Creacin de un nuevo proyecto:


Project New

Eleccin del compilador:


Project Select Language Toolsuite

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

18

Aadir un fichero fuente al proyecto:

File New Editar y guardar en ejemplo.c

En la ventana de proyecto aadir: - Fichero fuente ejemplo.c - Script de enlazado: 18f452i.lkr para simulacin 18f452.lkr para MPLAB ICD2

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

19

Configuracin 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

Informtica Industrial 2004-2005

Sistemas embebidos

20

Compilacin, enlazado y generacin de cdigo mquina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

21

P1.lst: listado con cdigo mquina y cdigo 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.

Direccin programa

Cdigo mqina

Cdigo ensamblador

#include <p18f452.h> int contador; int main () { contador = 1;

0000e2 0000e4 0000e6 0000e8 0000ea 0000ec 0000ee 0000f0 0000f2 0000f4 0000f6 0000f8 0000fa 0000fc 0000fe 000100 000102 00010e 000104 000106 000108 00010a 00010c 000110

0e01 0100 6f8a 6b8b 6a93 518b 0a00 aee8 d002 358b d005 0e0f 80d8 558a 0e00 558b e306 d7ee c08a ff81 2b8a 0e00 238b 0012

MOVLW MOVLB MOVWF CLRF CLRF MOVF XORLW BTFSS BRA RLCF BRA MOVLW BSF SUBFWB MOVLW SUBFWB BNC BRA MOVFF INCF MOVLW ADDWFC RETURN

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 0x8a,0xf81 0x8a,0x1,0x1 0x0 0x8b,0x1,0x1 0x0

TRISB = 0; while (contador <= 15)

{ PORTB = contador; contador ++;

} }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

22

P1.hex: cdigo mquina 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.

:020000040000FA :0600000089EF00F0120080 :02002A000000D4 :0C0044002A0EF66E000EF76E000EF86E2D :1000500000010900F550856F0900F550866F03E136 :10006000856701D03DD00900F550806F0900F5503B :10007000816F0900F550826F09000900F550E96EA3 :100080000900F550EA6E090009000900F550836F78 :100090000900F550846F09000900F6CF87F0F7CF0B :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA :1000B000F8FF0001835302E1845307E00900F55083 :1000C000EE6E8307F8E28407F9D787C0F6FF88C091 :1000D000F7FF89C0F8FF00018507000E865BBFD7D8 :0200E00012000C :0E00E200010E00018A6F8B6B936A8B51000A2E :1000F000E8AE02D08B3505D00F0ED8808A55000EA1 :100100008B5506E38AC081FF8A2B000E8B23EED726 :020110001200DB :0E01120015EE00F025EE00F0F86A019CA68EB6 :0E012000A69C22EC00F071EC00F0FDD712005E :00000001FF

00E2 00E3 00E4 00E5

0E 01 01 00 6F

00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED

8A 6B 8B 6A 93 51 8B 00 0A

Se indican 14 bytes

Se guardan a partir de 00E2

Se indican datos a almacenar

Informacin a almacenar

Suma de comprobacin

0E 00E2 00 010E 0001 8A6F 8B6B 936A 8B51 000A 2E

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

23

Generacin de un mapa de memoria:


Project Build Options Project MPLINK Linker

Activar casilla

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

24

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 ejecucin: GOTO 0x112 Cdigo de inicializacin Bucle de ejecucin contnua:


LOOP: main () GOTO LOOP

Cdigo del programa

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

25

Eleccin del depurador: Debugger

Select Tool

MPLAB SIM

MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardware MPLAB SIM: simulador

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

26

Depuracin de programas: ejecucin de instrucciones


Reset: comenzar de nuevo Step Out: ejecutar el resto de la funcin Step Over: en una llamada a una funcin, ejecutarla completamente Step Into: en una llamada a una funcin, detenerse al comienzo de la misma Run: ejecucin contnua del programa

Punto de ruptura Siguiente instruccin a ejecutar

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

27

Particularidades de MPLAB C18: clase de almacenamiento overlay


- Almacenamiento esttico - Inicializacin en cada llamada - Se comparte memoria en el caso de que no haya uso simultneo - Ventaja: optimizacin 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.

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; return b; } int main () { f (); g (); }

int f () { overlay int a = 3; return a; } int g () { overlay int b = 7; b = f (); return b; } int main () { f (); g (); }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

28

Particularidades de MPLAB C18: parmetros static


- Almacenamiento esttico en lugar de pila - Ventajas: cdigo ms pequeo y rpido - No permite llamadas reentrantes

en funciones

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; }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

29

Memoria de datos
Memoria interna organizada en bancos de 256 bytes

Tambin existe direccionamiento indexado, que permite manejar toda la memoria RAM de forma lineal.

Universidade de Vigo EUITI - EUITI

Informtica Industrial 2004-2005 Informtica Industrial 2004-2005

Sistemas embebidos

30

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 cdigo mquina est a 0 Ventaja: mayor rapidez de acceso Ejemplo: copiar valor desde el acumulador a la direccin dddd dddd con la etiqueta D Ensamblador: MOVWF D, a Mquina: 0110 111a dddd dddd Caso particular:
MOVWF PORTB, 0 0110 1110 1000 0001

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

31

Soporte en MPLAB C18 para especificacin 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; }

Compilacin

1. 2. 3. 4. 5. 6. 7. 8.

MOVLB 0x0 MOVLW 0x3 MOVWF 0x8A,0x1 CLRF 0x8B,0x1

; ; ; ; ; ; ; ;

BSR=0 para seleccionar el banco 0 Carga 0x3 en acumulador Copia acumulador en 0x8A seleccionando banco con BSR Pone a cero la direccin 0x8B, seleccionando banco con BSR

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

32

Configuracin del modelo de memoria

Project Build Options Project MPLAB C18 Categories Memory Model

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

33

Mapa de memoria de programa

Pila Comienzo despus de una inicializacin (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 interrupcin Posible memoria de programa externa

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

34

Datos en memoria de programa


- Memoria FLASH no voltil de lectura/escritura - Mayor capacidad que la RAM. Almacenamiento de informacin 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)

Direccin de memoria de programa Dato a transferir

- Instrucciones TBLRD (TaBle ReaD) y TBLWT (TaBLe WriTe)

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

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. 2. 3. 4. 5. 6.

#include <p18f452.h> rom far char f; int main () { f = 3; }

Segn el fichero de mapa de memoria, la variable f se almacena en la direccin 0x000112


TBLPTRU:TBLPTRH:TBLPTRL = 0x000112

Compilacin
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

MOVLW 0x12 MOVWF TBLPTRL, 0 MOVLW 0x1 MOVWF TBLPTRH, 0 MOVLW 0x0 MOVWF TBLPTRU, 0 MOVLW 0x3 MOVWF TABLAT, 0 TBLWT

; Carga 0x12 en el acumulador ; Copia el acumulador en TBLPTRL ; Carga 0x1 en el acumulador ; Copia el acumulador en TBLPTRH ; Carga 0x0 en el acumulador ; Copia el acumulador en TBLPTRU ; Carga 0x3 en el acumulador ; Copia el acumulador en TABLAT ; Escribe en memoria FLASH

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

36

Punteros a memoria de datos y de programa


- Incompatibles debido a que a puntan a diferentes tipos de memoria. - Ejemplo:
1. 2. 3. 4. 5. 6. 7. 8. 9.

#include <p18f452.h> int x, * px; rom int y, * py; int main () { px = & x; py = & y; px = py; }

Error

Tamao de los punteros:


Puntero a memoria de datos Puntero near a memoria de programa Puntero far a memoria de programa
int * p; rom near int * p; rom far int * p;

16 bits 16 bits 24 bits

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

37

Informacin en memoria de programa


- Caso tpico: cadenas de caracteres constantes. - Hay funciones para realizar trasvases RAM ROM

ram rom ram rom

ram ram rom rom

char * strcpy (auto char * destino, auto const char * origen); char * strcpypgm2ram (auto char * destino, auto const rom char * origen); rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen); rom char * strcpypgm2pgm (auto rom char * destino, auto const rom char * origen);

const: la cadena de caracteres origen no se modifica auto: los parmetros de estas funciones se manejan en la pila

Ejemplo
1. 2. 3. 4.

rom far const char cadenaROM [] = "Hola"; char cadenaRAM [20]; strcpypgm2ram (cadenaRAM, cadenaROM);

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

38

Configuracin del microcontrolador


- Los compiladores de lenguaje C utilizan la directiva #pragma para poder indicar informacin no estandarizada al compilador. - Ejemplos para la configuracin 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 guardin (WatchDog Timer) #pragma config LVP = OFF // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming)

- Tambin se pueden establecer en el MPLAB IDE, bajo Configure

Configuration bits ...

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

39

Ejemplo de unin: lneas 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 ;

Manejo como 8 seales digitales

Utilizacin 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 analgicas

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

40

Incluir cdigo en ensamblador

- Ejemplo: insertar un pequeo retardo mediante la ejecucin de la instruccin NOP

1. 2. 3. 4. 5.

#include <p18f452.h>

int main () {

6.
7. 8. 9.

Instrucciones
_asm NOP _endasm

10.
11.

Instrucciones
}

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

41

Rutinas de atencin 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 } #pragma code #pragma interruptlow rutinaBajaPrioridad void rutinaBajaPrioridad (void) {

Creacin de una nueva seccin de cdigo a partir de la direccin 0x18 denominada bajaPrioridad

Instruccin insertada en la direccin 0x18 Cerrar seccin bajaPrioridad y abrir seccin normal de cdigo Rutina que atiende a la interrupcin

Cdigo que atiende a la interrupcin


} #pragma code seccin=direccin #pragma interruptlow

Abre una seccin de cdigo Permite indicar cul es la rutina que atiende a las interrupciones de baja prioridad Permite indicar cul es la rutina que atiende a las interrupciones de alta prioridad

#pragma interrupt

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

42

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> // Definicin de la funcin rutinaInterrupcin que va a atender interrupciones #pragma interrupt rutinaInterrupcion void rutinaInterrupcion () { if (INTCONbits.TMR0IF) // Si la interrupcin 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 seccin de cdigo 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 seccin de cdigo normal

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

43

25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.

void main () { INTCON = 0x20;

// Habilita interrupcin del temporizador 0, pero // deshabilitndolas globalmente // La configura como interrupcin de alta prioridad // Habilita interrupciones de diferentes prioridades // Pone temporizador a cero

INTCON2 = 0x84;

RCONbits.IPEN = 1; TMR0H = 0;

TMR0L = 0;

T0CON = 0x82;

// Configura a TMR0 como temporizador con contaje ascendente // de 16 bits, frecuencia de incremento = reloj/8 y lo activa, // genera una interrupcin a cada transicin 0xFFFF->0x0000 // Habilita interrupciones globalmente

INTCONbits.GIEH = 1; TRISB = 0; while (1); }

// Seales del puerto B configuradas como salidas // Bucle infinito vaco

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

44

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

45

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

46

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

47

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

48

Situar datos en direcciones especficas


- Secciones de dos tipos: udata: variables estticas sin valor inicial idata: variables estticas 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 seccin en la memoria de datos que comienza // en la direccin 0x100. A esta nueva seccin se le asigna // el identificador zona1 int x, y, z; // Dentro de esta seccin se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma idata zona2 = 0x200; // Seccin 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

Informtica Industrial 2004-2005

Sistemas embebidos

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 seccin en la memoria de datos que comienza // en la direccin 0x100. La memoria utilizada en esta seccin se // puede compartir para otra seccin. int x, y, z; // Dentro de esta seccin se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma udata overlay seccionCompartida2 = 0x100; // Seccin 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

Informtica Industrial 2004-2005

Sistemas embebidos

50

Visualizadores de 7 segmentos
abcdefg 1111110 0110000 1101101 1111001 0110011 1011011 1011111 1110000 1111111 1111011 1110111 0011111 1001110 0111101 1001111 1000111 Ver 0 1 2 3 4 5 6 7 8 9 A b C d E F

Ctodo comn

nodo comn

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

51

Pantallas de cristal lquido (LCD, Lyquid Crystal Display) alfanumricas


- Configuraciones tpicas: 1, 2 o 4 filas y 16, 20 o 40 columnas. - Bus de datos y de control: Nmero de lnea 1 2 3 4 5 6 7-14 Seal Vss Vdd Vc RS R/W E DB0-DB7 Masa Alimentacin +5Vdc para circuitos lgicos Alimentacin para la pantalla Transmisin de texto (RS=1) o transmisitn de instruccin (RS=0) Operacin de lectura (R/W=1) o escritura (R/W=0) Pulso a nivel alto para realizar la transferencia Bus de datos Significado

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

52

Configuracin del bus de datos


8 bits

LCD DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 E R/W RS

4 bits

LCD DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 E R/W RS

RD0 RD1 RD2 RD3 RA1 RA2 RA3

DB0-DB7 R/W E

dato

DB4-DB7 R/W E

bits 4-7

bits 0-3

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

53

Envo 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 lneas del puerto PORTB utilizadas PORTAbits.RA1 PORTAbits.RA2 PORTAbits.RA3

void instruccionLCD (unsigned char instruccion) // Enva al LCD la instruccin codificada en el parmetro { RS_LCD = 0; // Se va a enviar una instruccin RW_LCD = 0; // En una operacin 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 ms significativos E_LCD = 1; E_LCD = 0; // Pulso de activacin 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

Informtica Industrial 2004-2005

Sistemas embebidos

54

Juego de instrucciones de una pantalla LCD

Bus de datos en dos transferencias de 4 bits DB4-DB7 Instruccin Borrar pantalla Cursor a origen Modo introduccin Activacin pantalla Desplazamiento Funcin Direccin CGRAM Direccin DDRAM Lee estado Escritura en RAM Lectura en RAM RS 0 0 0 0 0 0 0 0 0 1 1 R/W DB7 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 BF DB6 0 0 0 0 0 0 1 DB5 0 0 0 0 0 1 DB4 0 0 0 0 1 DL DB3 0 0 0 1 S/C N DB2 0 0 1 D R/L F DB1 0 1 I/D C * * DB0 1 * S B * *

Direccin CGRAM Direccin DDRAM Direccin DDRAM Dato Dato

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

55

Bit I/D S D C B S/C R/L DL N F BF

Significado Decrementa (0) o incrementa (1) la posicin del cursor con cada escritura Sin desplazamiento (0) o con desplazamiento (1) Pantalla apagada (0) o en funcionamiento (1) Cursor invisible (0) o visible (1) Cursor fijo (0) o con parpadeo (1) Se desplaza el cursor (0) o toda la informacin (1) con cada escritura Desplazamiento a la izquierda (0) o a la derecha (1) Bus de 4 bits (0) o de 8 bits (1) LCD de una fila (0) o de ms filas (1) Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1) La pantalla est ocupada (1) o puede aceptar otra instruccin (0)

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

56

Inicializacin

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

57

Conversin analgico/digital
- Ocho entradas analgicas de 10 bits de resolucin. - Referencia de tensin interna o externa. - Manejo por consulta o interrupcin.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

58

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

59

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

60

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

61

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

62

Conversin analgico/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 lnea de entrada ADCON0 = 0x41; // Activa el mdulo de conversin analgica, selecciona el canal 0 y // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador ADCON1 = 0x8E; // El resultado de la conversin se sita en los 10 bits menos significativos // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0 while (1) // Ejecutar contnuamente ... { ADCON0bits.GO_DONE = 1; // Solicita una conversin while (ADCON0bits.GO_DONE); // Espera mientras no finalice resultado = (float) ADRES * 5 / 1024; // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolucin

Utilizar el resultado de la conversin


} }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

63

Conversin analgico/digital mediante interrupcin


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 conversin

#pragma interrupt interrupcionConversionAD void interrupcionConversionAD (void) // Rutina que atiende a la interrupcin producida cuando finaliza una // conversin A/D { resultado = (float) ADRES * 5 / 1024; // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolucin finConversion = 1; // Indica que ya se dispone de la medida PIR1bits. ADIF = 0; // Hay que poner a cero el aviso de interrupcin }

#pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionConversionAD _endasm }

// Atiende a interrupciones prioritarias

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

64

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

// Vuelve a la seccin de cdigo normal

void main (void) { TRISAbits.TRISA0 = 1; // El bit menos significativo del puerto RA es una lnea de entrada ADCON0 = 0x41; // Activa el mdulo de conversin analgica, selecciona el canal 0 y // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador ADCON1 = 0x8E; // El resultado de la conversin se sita en los 10 bits menos significativos // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0 IPR1bits.ADIP = PIE1bits.ADIE = INTCONbits.GIEH RCONbits.IPEN = 1; // Interrupciones de fin de conversin son de alta prioridad 1; // Permite interrupciones por conversin A/D = 1; // Permite interrupciones de alta prioridad 1; // Distingue entre interrupciones de alta y baja prioridad

while (1) // Ejecutar contnuamente ... { finConversion = 0; // Prepara a este booleano ADCON0bits. GO_DONE = 1; // Solicita una conversin while (! finConversion); // Espera mientras no finalice

Utilizar resultado de conversin


} }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

65

Unidad de captura

Temporizador 3 Interrupcin

Entrada Captura

Seleccin de temporizador Seleccin de flanco

Temporizador 1

Universidade de Vigo EUITI

Informtica 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 lnea 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 lnea RC2/CCP1

#pragma interrupt interrupcionComparacion void interrupcionComparacion (void) // Rutina que atiende a la interrupcin 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 interrupcin 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 interrupcin }

Contina

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.

Informtica Industrial 2004-2005

Sistemas embebidos

67

#pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionComparacion _endasm } #pragma code

// Atiende a interrupciones prioritarias

// Vuelta a la seccin de cdigo normal

void main (void) { TRSCbits. TRISC2 = 1;

// Configura la lnea RC2/CCP1 como entrada

// Configuracin de TIMER1: T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operacin de 1/8 T1CONbits. T1CKPS0 = 1; T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno T1CONbits. T1SYNC = 1; // Sin sincronizacin con seal externa T1CONbits. TMR1ON = 1; // Activa TIMER1 T3CONbits. T3CCP2 = 0; CCP1CON = 0x05; // La unidad de captura de la lnea 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; // Habilitacin global de interrupciones while (1); } // Bucle indefinido de espera

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

68

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

69

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

70

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

71

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

72

Tarjetas magnticas
- Codificacin estandarizada: - Pista 2: nmero de tarjeta y fecha de caducidad, segn ISO 7811/2-1985. - Lectores de tarjetas: salida de informacin en serie. Ejemplo: - Seal CLD: activa a nivel bajo mientras se efecta una lectura. - Seal RCL: cuando est a nivel bajo, en RDT hay una seal vlida. - Seal RDT: salida de informacin con lgica inversa. CLD RCL RDT 1 1 0 1 0 Paridad impar: 0

Dgitos de 4 bits: 10112

Banda magntica

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

73

SS

PAN

FS

CC

ED

Ms dgitos ...

ES

LRC

SS (Start Sentinel): delimitador de comienzo, valor 10112. PAN (Primary Account Number): nmero de tarjeta, hasta 19 dgitos. FS (Field Separator): separador de campos, valor 11012. CC (Country Code): cdigo de pas, 3 dgitos ED (Expiration Date): fecha de caducidad, 4 dgitos ES (End Sentinel): delimitador de final de lectura, valor 11112. LRC (Longitudinal Redundancy Check): para comprobacin de errores, o-exclusiva de todo lo ledo, desde SS hasta ES.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

74

Lectores fotoelctricos
Superficie clara

Fotodiodo

Fototransistor

CNY70

4K7 Vcc 220 Salida

GND

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

75

Codificadores incrementales rotativos (rotary encoders)

Fotodiodo

Disco LEDs

Eje

Rodamientos

Disco codificado Insercin sellada

Cable

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

76

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

77

Clulas fotoelctricas

Emisor/receptor: - Grandes distancias (20 m). - Sensible a fallos de alineacin.

Reflexin mediante catadiptrico: - Hasta 3 m. - Fcil instalacin.

Reflexin difusa: - Hasta 30 cm. - Sensible al color y tipo de superficie.

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

78

Canal A

PIC18F452 Canal B B

Cambio de sentido A

B RA4/T0CKI RC0/T1CKI

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

79

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.

void main (void) { 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 posicin del encder como la diferencia entre el nmero de // pulsos en uno y otro sentidos }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

80

Alternativa: puerto en el que se produce una interrupcin cuando cambia cualquier seal
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; // Posicin del encder #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 interrupcin ... { xor = A ^ B; // Calcula a o-exclusiva if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++; else posicion --; // actualiza la posicin } else primera = 0; // La siguiente ya no es la primera interrupcin Aanterior = A; // Recuerda el estado anterior en el canal A Banterior = B; // Lo mismo para el canal B }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

81

Cdigos de barras
- Ejemplo: formato Code 39 o "Cdigo 3 de 9". - Cada carcter se codifica con 9 barras (5 negras y 4 blancas), 3 de las cuales son ms anchas que las dems. - Entre caracteres consecutivos se inserta un pequeo 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:

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

82

Carcter
1 2 3 4 5 6 7 8 9 0 A B C D E F G H I J K L

Patrn de barras

Codificacin
1101 0010 1011 1011 0010 1011 1101 1001 0101 1010 0110 1011 1101 0011 0101 1011 0011 0101 1010 0101 1011 1101 0010 1101 1011 0010 1101 1010 0110 1101 1101 0100 1011 1011 0100 1011 1101 1010 0101 1010 1100 1011 1101 0110 0101 1011 0110 0101 1010 1001 1011 1101 0100 1101 1011 0100 1101 1010 1100 1101 1101 0101 0011 1011 0101 0011

Carcter
M N O P Q R S T U V W X Y Z . Espacio * $ / + %

Patrn de barras

Codificacin
1101 1010 1001 1010 1101 0011 1101 0110 1001 1011 0110 1001 1010 1011 0011 1101 0101 1001 1011 0101 1001 1010 1101 1001 1100 1010 1011 1001 1010 1011 1100 1101 0101 1001 0110 1011 1100 1011 0101 1001 1011 0101 1001 0101 1011 1100 1010 1101 1001 1010 1101 1001 0110 1101 1001 0010 1001 1001 0010 1001 1001 0100 1001 1010 0100 1001

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

83

Carcter Checksum final - Suma de todos los dgitos mdulo 43 - Ejemplo: para PO-2537:
P O 2 5 3 7 = = = = = = = 25 24 36 2 5 3 7 + 102 1 2 3 4 5 6 7 8 9 0 A B C D E F G H I J K L

Valor
1 2 3 4 5 6 7 8 9 0 10 11 12 13 14 15 16 17 18 19 20 21

Carcter
M N O P Q R S T U V W X Y Z . Espacio * $ / + %

Valor
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

Resto de la divisin 102/43 = 16 Checksum = carcter G

39 40 41 42

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

84

Transmisin serie sncrona


- Todos los bytes que componen un mensaje se transmiten juntos. - Los bits que componen cada byte se representan elctricamente en el mismo hilo conductor sucesivamente, durante un pequeo intervalo de tiempo que depende de la velocidad de transmisin. - Sincronizacin entre transmisor y receptor mediante una seal de reloj independiente (ejemplo, SPI) o modulada en la informacin enviada (ejemplo, Ethernet) a cada bit. byte 1 byte 2 byte 3

Transmisin serie asncrona


- 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 elctricamente en el mismo hilo conductor sucesivamente, durante un pequeo intervalo de tiempo que depende de la velocidad de transmisin. - Bit de comienzo (start bit, nivel 0) inicial y perodo de reposo final (nivel 1) para sincronizacin entre transmisor y receptor a cada byte. byte 1 byte 2 byte 3

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

85

Transmisin serie asncrona


Bit de comienzo Perodo de reposo T 0 T 1 bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7

Instantes de escritura T 1 T 0 T 1 T 0 T 0

T 1

T+ T 2

Instantes de lectura Instante de sincronizacin

Instante de sincronizacin

- Bits transmitidos por byte: normalmente 7 u 8. - Bit de paridad: par, impar, ninguna. - Perodo de reposo (stop bits): 1, 1.5, 2 - Velocidad de transmisin: 1/T en bits/s. (baud)

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

86

RS 485
Half-duplex

RS 422
Full-duplex

Maestro

Esclavos

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

87

Protocolos maestro/esclavo

Maestro 0

Orden dirigida al esclavo 2 Respuesta Esclavo 1 Esclavo 2 Esclavo 3

Sincronizacin del dilogo


Orden 2 0 0 2 Respuesta 3 Tiempo mnimo entre ciclos orden/respuesta 0 Otra orden

Direccin origen Direccin destino

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

88

Controlador Omron E5CK


- Control PID autoajustable (auto-tuning, self-tuning) mediante algoritmo borroso (fuzzy). - Entrada: sensor de temperatura (termopar o resistencia de platino), tensin (0-10V) o bucle de corriente (4-20 mA). - Salida analgica o modulada en ancho de pulso (PWM Pulse Width Modulation) - Canal RS 485 para supervisin y control externos. Calentamiento

Temperatura

Consigna

Sensor

Tiempo Perodo de autoajuste

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

89

Ejemplo de aplicacin: control de humedad de un recinto

Sensor de humedad Humidificador

Alimentacin 220 VAC

Salida Alarma

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

90

Control on/off
Histresis Actuacin Zona muerta Dead band ON Zona de calentamiento OFF Punto de consigna Set point Temperatura Zona de enfriamiento

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

91

Configuracin de parmetros de comunicacin

Nmero de nodo: 0 a 99

Bits parada: 1, 2

Bits por byte: 7, 8

Paridad: par, impar, ninguna

Velocidad: 1.2, 2.4, 4.8, 9.6, 19.2 Kbaud

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

92

Protocolo de comunicacin: operacin de escritura


- Formato texto - Ejemplo: modificar el valor de consigna (parmetro nmero 1) a 300.0 grados en el nodo 9. Direccin destino Parmetro a modificar

XOR

Orden Maestro esclavo

@ 0

* Cr
Fin orden

Comienzo

Operacin de escritura Parmetro modificado

Valor

Direccin origen

Valor

Fin respuesta

Respuesta Esclavo maestro

@ 0

* Cr

Comienzo

Operacin de escritura

Operacin correcta

XOR

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

93

Clculo de la XOR

Carcter @ 0 9 2 0 1 3 0 0 0 XOR =

ASCII Decimal 64 48 57 50 48 49 51 48 48 48 121

ASCII Hexadecimal 40 30 39 32 30 31 33 30 30 30 79

ASCII Binario 0001 0000 0011 0000 0011 1001 0011 0010 0011 0000 0011 0001 0011 0011 0011 0000 0011 0000 0011 0000 0111 1001

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

94

Protocolo de comunicacin: operacin de lectura


- Ejemplo: obtener el valor actual de la variable controlada en el nodo 9. Nodo destino Parmetro a leer

XOR

Orden Maestro esclavo

@ 0

* Cr
Fin orden

Comienzo

Operacin de lectura Parmetro ledo

Valor No se utiliza Valor

Nodo origen

Fin respuesta

Respuesta Esclavo maestro

@ 0

7 A
XOR

* Cr

Comienzo

Operacin de lectura

Operacin correcta

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

95

Protocolo XON/XOFF
- Quien recibe informacin solicita a quien le la enva que detenga temporalmente la transmisin, envindole el carcter XOFF (cdigo ASCII 17). - Quien recibe informacin le indica al transmisor que puede continuar mediante el carcter XON (cdigo ASCII 19). - En comunicaciones manejadas mediante interrupcin 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 // posicin de carga, de descarga y contabilizando el nmero 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 direccin apuntada por // este puntero int XOFFRecibido, XOFFEnviado; // Booleanos que indican si se ha transmitido el carcter XOFF y si a su vez // se ha recibido

Contina

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.

Informtica Industrial 2004-2005

Sistemas embebidos

96

int Transmitiendo = 0; // Booleano que indica si hay alguna transmisin en curso #define XON 17 #define XOFF 19 // Macroinstrucciones para representar a los cdigos ASCII de los caracteres // XON y XOFF

void interrupt IRecibe () // Rutina que atiende a la interrupcin que se produce cuando se recibe un // nuevo carcter { char recibido; recibido = * pCanal; // Recoge el carcter 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 adems hay an caracteres en la // cola de envo, extraer un carcter de esa cola y enviarlo XOFFRecibido = 0; // Indica que ya podemos transmitir caracteres }

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

97

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

// Si no es XON ni XOFF ... { if (ColaRecepcion. cargados > 900) // Si en la cola de entrada ya hay 900 caracteres ... { Envia (XOFF); // Enva un XOFF XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF } carga (recibido, & ColaRecepcion); // En cualquier caso carga en la cola de recepcin el carcter recibido }

void interrupt IEnvia () // Rutina que atiende a la interrupcin que se produce cuando ha finalizado // el envo de un carcter enviado anteriormente { if (ColaTransmision. cargados == 0) Transmitiendo = 0; // Si la cola de transmisin est vaca, no hay que enviar nada ms if (! XOFFRecibido && ColaTransmision. cargados > 0) * pCanal = descarga (& ColaTransmision); // Si no se ha recibido XOFF y en la cola de transmisin hay algo, entonces // recoger un carcter de la misma y provocar su envo }

Contina

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.

Informtica Industrial 2004-2005

Sistemas embebidos

98

char RecibeCola () // Recoge de la cola de recepcin un carcter y lo devuelve. Si esta cola est // vaca, 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 recepcin ... { * pCanal = XON; XOFFEnviado = 0; }

// Enva un XON // Indica que se ha anulado el anterior envo de XOFF

if (ColaRecepcion. cuantos > 0) // Si la cola de recepcin no est vaca ... return descarga (& ColaRecepcion); // Devuelve un carcter de la misma else return 0; // Si no, devuelve un 0 }

void EnviaCola (char dato) // Enva el carcter pasado por parmetro. Si hay una transmisin en curso, // lo guarda en la cola de transmisin { if (! Transmitiendo) // Si en este momento no hay transmisin en curso ... { * pCanal = dato; // Enva el carcter Transmitiendo = 1; // Indica que hay una transmisin en curso } else carga (& ColaTransmision, dato); // Si no, crgalo en la cola }

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

99

116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134.

main () { pCanal = (unsigned char *) 0x100; // Supongamos que el registro para recepcin/transmisin est mapeado en la // direccin 0x100; ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0; ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0; // Inicializa las colas de recepcin y transmisin 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

Informtica Industrial 2004-2005

Sistemas embebidos

100

Cdigos de redundancia cclica


- CRC (Cyclic Redundancy Check) - Algoritmos ms 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

X1 X2 X3 D Q D Q D Q G G G

X4 D Q G

X5 X6 X7 X8 Q D Q D Q D G G G

- Ejemplo: CRC-8

Disparo para desplazamientos Entrada de bits

Universidade de Vigo EUITI

Informtica 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}; // Informacin a procesar n = 4; // Nmero 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 tambin la XOR con los puntos de realimentacin CRC8 >>= 1; // Desplaza todos los biestables CRC8 |= 0x80; // Aade un 1 en el biestable ms significativo } else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC auxiliar >>= 1; // Contina con el siguiente bit } }

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

102

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

103

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

104

Velocidad de transmisin
- 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

Informtica Industrial 2004-2005

Sistemas embebidos

105

Configuracin de la recepcin
Habilita interrupciones alta prioridad Habilita interrupciones baja prioridad Flag interrupcin por recepcin Habilita interrupcin por recepcin Prioridad de interrupcin por recepcin Permite interrupciones de diferentes prioridades Habilita comunicacin Registro INTCON RCON PIR1 PIE1 IPR1 RCSTA RCREG Habilita bit 9 TXTA SPBRG Habilita receptor SPEN RX9 bit 7 GIEH IPEN RCIF RCIE RCIP CREN ADDEN FERR OERR RX9D Dato recibido SYNC BRGH Bit 9 recibido bit 6 GIEL bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

Velocidad de comunicacin Overrun error Error de saturacin del receptor Framing error Error de trama de bits

0 para modo asncrono

Habilita deteccin de direccin

Seleccin de velocidad

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

106

Configuracin de la transmisin
Habilita interrupciones alta prioridad Habilita interrupciones baja prioridad Flag interrupcin por transmisin Habilita interrupcin por transmisin Prioridad de interrupcin por transmisin Permite interrupciones de diferentes prioridades Habilita comunicacin Registro INTCON RCON PIR1 PIE1 IPR1 RCSTA TXREG TXTA Habilita bit 9 SPBRG Habilita transmisor TX9 SPEN Dato a transmitir TXEN SYNC BRGH TRMT TX9D Bit 9 a transmitir bit 7 GIEH IPEN TXIF TXIE TXIP bit 6 GIEL bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

Velocidad de comunicacin

0 para modo asncrono

Seleccin de velocidad

1 cuando finaliz la serializacin

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

107

Recepcin y envo 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 informacin recibida\n"; // Cadena de caracteres guardada en memoria de programa void enviaCaracter (char caracter) // Envio de un carcter por consulta { while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carcter TXREG = caracter; // Suministra el carcter para serializarlo } char recibeCaracter (void) // Recepcin de un carcter 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 carcter recibido } void inicializaCanalConsulta () // Inicializa el canal serie para recepcin/transmisin por consulta { TRISCbits. TRISC6 = 0; // Lnea de transmisin en RC6 como salida TRISCbits. TRISC7 = 1; // Lnea de recepcin 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 }

Contina

Universidade de Vigo EUITI

Informtica Industrial 2004-2005

Sistemas embebidos

108

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.

void enviaCadenaROM (rom char * cadena) // Enva por el canal serie una cadena de caracteres almacenada en ROM { rom char * p; p = cadena; // Apunta al primer carcter while (* p) // Mientras no se haya llegado al final de la cadena ... { enviaCaracter (* p); // Enva un carcter p ++; // Para enviar luego el siguiente } }

void main (void) { char caracter; inicializaCanalConsulta (); // Inicializa los parmetros del canal enviaCadenaROM (mensaje); // Enva ese mensaje while (1) // Repite contnuamente ... { caracter = recibeCaracter (); // Espera a recibir un carcter y recgelo enviaCaracter (caracter); // Lo enva por el mismo canal } }

También podría gustarte