54

Click here to load reader

Tutorial C18

Embed Size (px)

Citation preview

Page 1: Tutorial C18

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 Informática Industrial 2004-2005 Sistemas embebidos 1

Encapsulados

PIC18F452:

DIP

PLCC

QFN (Quad Flat No lead)

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 2

Page 2: Tutorial C18

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 Sistemas embebidos 3

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)

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 4

Page 3: Tutorial C18

SFRs

- Direcciones 0xF80 a 0xFFF

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 5

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 Informática Industrial 2004-2005 Sistemas embebidos 6

Page 4: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 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 Informática Industrial 2004-2005 Sistemas embebidos 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 LCD16: Zumbador17: Área de prototipos18: Sensor de temperatura

Page 5: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 9

Conexión al depurador y programador MPLAB IDC 2

USB al computador

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 10

PIC 18F452

Poten-ciómetro

EEPROM

Pulsador S2

Pulsador S1Reset

Placa de desarrollo Microchip PICDEM 2 PLUS

Continúa

Page 6: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 11

Pantalla de cristal líquidoLEDs

Pulsador S3

Zumbador Sensor de temperatura

Placa de desarrollo Microchip PICDEM 2 PLUS

Continúa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 12

RS 232

Placa de desarrollo Microchip PICDEM 2 PLUS

Page 7: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 13

Compilador MPLAB C18 en entorno MPLAB IDE

Compilación, enlazado

con MPLAB C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 14

Page 8: Tutorial C18

1. #include <p18f452.h>2.

3. int contador;4.

5. void main ()6. {7. contador = 1;8. TRISB = 0;9. while (contador <= 15) 10. {11. PORTB = contador;12. contador ++; 13. }14. }

Primer ejemplo con MPLAB C18

Contador utilizado para repetir el bucle 15 veces

Configura todas las líneas del puerto Bcomo salidas digitales

A cada paso del bucle, las 8 líneas delpuerto B reflejan el estado del contador

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 15

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.

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 16

Page 9: Tutorial C18

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 Sistemas embebidos 17

Añadir un fichero fuente al proyecto:

File NewEditar y guardar en ejemplo.c

En la ventana de proyecto añadir: - Fichero fuente ejemplo.c- Script de enlazado:

18f452i.lkr para simulación18f452.lkr para MPLAB ICD2

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 18

Page 10: Tutorial C18

Configuración de subdirectorios de trabajo

Ficheros creados en el mismosubdirectorio del proyecto

Ficheros de declaraciones en c:\mcc18\h

Bibliotecas en c:\mcc18\lib

Script de enlazado en c:\mcc18\lkr

Project Build options Project

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 19

Compilación, enlazado y generación de código máquina

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 20

Page 11: Tutorial C18

1. #include <p18f452.h> 2. int contador;3.

4. int main ()5. {6. 0000e2 0e01 MOVLW 0x1 contador = 1;7. 0000e4 0100 MOVLB 0x08. 0000e6 6f8a MOVWF 0x8a,0x19. 0000e8 6b8b CLRF 0x8b,0x110. 0000ea 6a93 CLRF 0x93,0x0 TRISB = 0;11. 0000ec 518b MOVF 0x8b,0x0,0x1 while (contador <= 15)12. 0000ee 0a00 XORLW 0x013. 0000f0 aee8 BTFSS 0xe8,0x7,0x014. 0000f2 d002 BRA 0xf815. 0000f4 358b RLCF 0x8b,0x0,0x116. 0000f6 d005 BRA 0x10217. 0000f8 0e0f MOVLW 0xf18. 0000fa 80d8 BSF 0xd8,0x0,0x019. 0000fc 558a SUBFWB 0x8a,0x0,0x120. 0000fe 0e00 MOVLW 0x021. 000100 558b SUBFWB 0x8b,0x0,0x122. 000102 e306 BNC 0x11023. 00010e d7ee BRA 0xec24. {25. 000104 c08a MOVFF 0x8a,0xf81 PORTB = contador;26. 000106 ff8127. 000108 2b8a INCF 0x8a,0x1,0x1 contador ++;28. 00010a 0e00 MOVLW 0x029. 00010c 238b ADDWFC 0x8b,0x1,0x130. }31. 000110 0012 RETURN 0x0 }

P1.lst: listado con código máquina y código ensamblador. Vista parcial:

Código

máqina

Código

ensamblador

Dirección

programa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 21

1. :020000040000FA2. :0600000089EF00F01200803. :02002A000000D44. :0C0044002A0EF66E000EF76E000EF86E2D5. :1000500000010900F550856F0900F550866F03E1366. :10006000856701D03DD00900F550806F0900F5503B7. :10007000816F0900F550826F09000900F550E96EA38. :100080000900F550EA6E090009000900F550836F789. :100090000900F550846F09000900F6CF87F0F7CF0B10. :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA11. :1000B000F8FF0001835302E1845307E00900F5508312. :1000C000EE6E8307F8E28407F9D787C0F6FF88C09113. :1000D000F7FF89C0F8FF00018507000E865BBFD7D814. :0200E00012000C15. :0E00E200010E00018A6F8B6B936A8B51000A2E16. :1000F000E8AE02D08B3505D00F0ED8808A55000EA117. :100100008B5506E38AC081FF8A2B000E8B23EED72618. :020110001200DB19. :0E01120015EE00F025EE00F0F86A019CA68EB620. :0E012000A69C22EC00F071EC00F0FDD712005E21. :00000001FF

P1.hex: código máquina en formato Intel INHX32

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

Seindican

14 bytes

Seguardan

a partir de 00E2

Información a almacenar

Suma decomprobación

0A

00

8B

51

93

6A

8B

6B

8A

6F

00

01

01

0E

00ED

00EC

00EB

00EA

00E9

00E8

00E7

00E6

00E5

00E4

00E3

00E2

Se indican datos a

almacenar

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 22

Page 12: Tutorial C18

Generación de un mapa de memoria:

Project Build Options Project MPLINK Linker

Activar casilla

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 23

Mapa de memoria: generado en el fichero P1.map

1. PORTD 0x000f83 data extern C:\MCC18\SRC\PROC\p18f452.asm2. TRISD 0x000f95 data extern C:\MCC18\SRC\PROC\p18f452.asm3. contador 0x00008a data extern C:\Ejemplos\P1\ejemplo.c 4. _entry 0x000000 program extern C:\mcc18\src\startup\c018i.c5. main 0x0000e2 program extern C:\Ejemplos\P1\ejemplo.c

1. Program Memory Usage 2. Start End3. --------- ---------4. 0x000000 0x0000055. 0x000044 0x00012d6. 242 out of 33048 program addresses used

Memoria de programa utilizada:

Direccionamiento de algunos identificadores:

Comienzo ejecución: GOTO 0x112

Código de inicialización

Bucle de ejecución contínua:LOOP:

main ()GOTO LOOP

Código del programa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 24

Page 13: Tutorial C18

Elección del depurador: Debugger Select Tool MPLAB SIM

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

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 25

Depuración de programas: ejecución de instrucciones

Punto de ruptura

Siguiente instruccióna ejecutar

Run: ejecución contínua del programa

Step Into: en una llamada a una función, detenerse al comienzo de la misma

Step Over: en una llamada a una función, ejecutarla completamente

Reset: comenzar de nuevo

Step Out: ejecutar el resto de la función

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 26

Page 14: Tutorial C18

Particularidades de MPLAB C18: clase de almacenamiento overlay

1. int f ()2. {3. overlay int a = 3;4. return a;5. }6.

7. int g ()8. {9. overlay int b = 7;10. return b;11. }12.

13. int main ()14. {15. f ();16. g ();17. }

- 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 comparten memoria

1. int f ()2. {3. overlay int a = 3;4. return a;5. }6.

7. int g ()8. {9. overlay int b = 7;10. b = f ();11. return b;12. }13.

14. int main ()15. {16. f ();17. g ();18. }

a y b se guardan en

posiciones diferentes:

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 27

Particularidades de MPLAB C18: parámetros static en funciones

- Almacenamiento estático en lugar de pila- Ventajas: código más pequeño y rápido- No permite llamadas reentrantes

1. int doblePila (int x)2. {3. return 2 * x;4. }5.

6. int dobleEstatico (static int x)7. {8. return 2 * x;9. }

Ejemplo:

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 28

Page 15: Tutorial C18

Memoria de datosMemoria interna organizada en bancos de 256 bytes

También existe direccionamiento indexado, que permite manejar toda la memoriaRAM de forma lineal.

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 29

Banco de memoria especial:

Formado con los 128 primerosbytes 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 acumuladora 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

Universidade de Vigo - EUITI Informática Industrial 2004-2005 Sistemas embebidos 30Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 30

Page 16: Tutorial C18

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. far int f;2.

3. int main ()4. {5. near int n;6. f = 3;7. n = 5;8. }

1. MOVLB 0x0 ; BSR=0 para seleccionar2. ; el banco 03. MOVLW 0x3 ; Carga 0x3 en acumulador4. MOVWF 0x8A,0x1 ; Copia acumulador en 0x8A5. ; seleccionando banco con BSR6. CLRF 0x8B,0x1 ; Pone a cero la dirección 7. ; 0x8B, seleccionando banco8. ; con BSR

Compilación

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 31

Configuración del modelo de memoria

Project

Build Options

Project

MPLAB C18

Categories

Memory Model

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 32

Page 17: Tutorial C18

Mapa de memoria

de programa Pila

Comienzo después deuna inicialización (reset)

Dos tipos de interrupciones:

de alta y baja prioridad

Memoria de programa interna

Posible memoria de programa externa

Capacidad de direccionamiento de hasta 2 Mb

Pila independiente:- Hasta 31 direcciones de retornodesde rutina o interrupción

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 33

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 modificarfrecuentemente.

- 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)

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

Dirección de memoria de programa

Dato a transferir

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 34

Page 18: Tutorial C18

1. #include <p18f452.h>

2. rom far char f;

3. int main ()4. {5. f = 3;6. }

1. MOVLW 0x12 ; Carga 0x12 en el acumulador2. MOVWF TBLPTRL, 0 ; Copia el acumulador en TBLPTRL3.

4. MOVLW 0x1 ; Carga 0x1 en el acumulador5. MOVWF TBLPTRH, 0 ; Copia el acumulador en TBLPTRH6.

7. MOVLW 0x0 ; Carga 0x0 en el acumulador8. MOVWF TBLPTRU, 0 ; Copia el acumulador en TBLPTRU9.

10. MOVLW 0x3 ; Carga 0x3 en el acumulador11. MOVWF TABLAT, 0 ; Copia el acumulador en TABLAT12.

13. TBLWT ; Escribe en memoria FLASH

Soporte en MPLAB C18 para datos en memoria de programa:

- Clase de almacenamiento rom para variables que residen en memoria de programa.

- Ejemplo:

Según el fichero de mapa de memoria, la variable f se almacena en la dirección 0x000112

TBLPTRU:TBLPTRH:TBLPTRL = 0x000112

Compilación

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 35

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. int x, * px;3. rom int y, * py;

4. int main ()5. {6. px = & x;7. py = & y;8. px = py;9. }

Error

Tamaño de los punteros:

24 bitsrom far int * p;Puntero far a memoria de programa

16 bitsrom near int * p;Puntero near a memoria de programa

16 bitsint * p;Puntero a memoria de datos

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 36

Page 19: Tutorial C18

Información en memoria de programa

- Caso típico: cadenas de caracteres constantes.

- Hay funciones para realizar trasvases RAM ROM

rom char * strcpypgm2pgm (auto rom char * destino,

auto const rom char * origen);rom rom

rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen);ram rom

char * strcpypgm2ram (auto char * destino, auto const rom char * origen);rom ram

char * strcpy (auto char * destino, auto const char * origen);ram ram

const: la cadena de caracteres origen no se modifica

auto: los parámetros de estas funciones se manejan en la pila

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 37

1. rom far const char cadenaROM [] = "Hola";2. char cadenaRAM [20];3.

4. strcpypgm2ram (cadenaRAM, cadenaROM);

Ejemplo

Universidade de Vigo – EUITI 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. #pragma config OSC = HS2. // Se utiliza un cristal de cuarzo de frecuencia alta3.

4. #pragma config WDT = OFF5. // Se desactiva el perro guardián (WatchDog Timer)6.

7. #pragma config LVP = OFF8. // 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 ...

Page 20: Tutorial C18

Ejemplo de unión: líneas del microcontrolador con varias funciones

1. union2. {3. struct4. {5. unsigned RD0:1;6. unsigned RD1:1;7. unsigned RD2:1;8. unsigned RD3:1;9. unsigned RD4:1;10. unsigned RD5:1;11. unsigned RD6:1;12. unsigned RD7:1;13. };14. struct15. {16. unsigned AD0:1;17. unsigned AD1:1;18. unsigned AD2:1;19. unsigned AD3:1;20. unsigned AD4:1;21. unsigned AD5:1;22. unsigned AD6:1;23. unsigned AD7:1;24. };25. } PORTDbits ;

Parte del fichero p18f452.h

Manejo como 8 señales digitales

Manejo como 8 entradas analógicas

1. #include <p18f452.h>2.

3. int main ()4. {5. int x;6. PORTDbits.RD0 = 1;7. x = PORTDbits.RD2;8. }

Utilización en un programa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 39

Incluir código en ensamblador

1. #include <p18f452.h>2.

3.

4. int main ()5. {

6. Instrucciones7. _asm8. NOP9. _endasm

10. Instrucciones11. }

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 40

- Ejemplo: insertar un pequeño retardo mediante la ejecución de la instrucción NOP

Page 21: Tutorial C18

Rutinas de atención a interrupciones

1. #include <p18f452.h>2.

3. #pragma code bajaPrioridad = 0x184.

5. void saltoBajaPrioridad (void)6. {7. _asm8. GOTO rutinaBajaPrioridad 9. _endasm10. }11.

12. #pragma code13.

14. #pragma interruptlow rutinaBajaPrioridad15. void rutinaBajaPrioridad (void)16. {

17. Código que atiende a la interrupción18. }

Creación de una nueva sección de código a partir de la dirección0x18 denominada bajaPrioridad

Instrucción insertada en la dirección 0x18

Cerrar sección bajaPrioridady abrir sección normal de código

Rutina 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 41

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 42

1. #include <p18f452.h>2.

3. // Definición de la función rutinaInterrupción que va a atender interrupciones4. #pragma interrupt rutinaInterrupcion5. void rutinaInterrupcion ()6. {7. if (INTCONbits.TMR0IF) // Si la interrupción la produjo TMR08. {9. INTCONbits.TMR0IF = 0; // Poner a 0 ese indicador10. PORTBbits.PORTB0 = ! PORTBbits.PORTB0; // Cambia la salida 0 del puerto B11. }12. }13.

14. #pragma code seccionAltaPrioridad = 0x08 // Abre una sección de código en 0x0815. void rutinaAltaPrioridad (void)16. {17. _asm18. GOTO rutinaInterrupcion // Salto a la rutina que atiende a las 19. // interrupciones de alta prioridad20. _endasm21. }22.

23. #pragma code // Vuelve a la sección de código normal24.

Ejemplo: interrupciones mediante temporizador TMR0

Continúa

Page 22: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 43

25. void main ()26.

27. {28. INTCON = 0x20; // Habilita interrupción del temporizador 0, pero29. // deshabilitándolas globalmente30.

31. INTCON2 = 0x84; // La configura como interrupción de alta prioridad32.

33. RCONbits.IPEN = 1; // Habilita interrupciones de diferentes prioridades34.

35. TMR0H = 0; TMR0L = 0; // Pone temporizador a cero36.

37. T0CON = 0x82; // Configura a TMR0 como temporizador con contaje ascendente38. // de 16 bits, frecuencia de incremento = reloj/8 y lo activa,39. // genera una interrupción a cada transición 0xFFFF->0x000040.

41. INTCONbits.GIEH = 1; // Habilita interrupciones globalmente42.

43. TRISB = 0; // Señales del puerto B configuradas como salidas44.

45. while (1); // Bucle infinito vacío46. }

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 44

Page 23: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 45

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 46

Page 24: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 47

Situar datos en direcciones específicas

1. #include <p18f452.h>2.

3. #pragma udata zona1 = 0x100;4. // Define una nueva sección en la memoria de datos que comienza5. // en la dirección 0x100. A esta nueva sección se le asigna6. // el identificador zona17.

8. int x, y, z;9. // Dentro de esta sección se declaran las variables x, y, z que se10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente11.

12. #pragma idata zona2 = 0x200;13. // Sección zona2 de datos inicializados a partir de 0x20014.

15. int a, b;16. // Variables a y b que se guardan a partir de 0x200 y 0x202

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 48

- Secciones de dos tipos:udata: variables estáticas sin valor inicialidata: variables estáticas con valor inicial

Page 25: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 49

Secciones que comparten memoria

1. #include <p18f452.h>2.

3. #pragma udata overlay seccionCompartida1 = 0x100;4. // Define una nueva sección en la memoria de datos que comienza5. // en la dirección 0x100. La memoria utilizada en esta sección se 6. // puede compartir para otra sección.7.

8. int x, y, z;9. // Dentro de esta sección se declaran las variables x, y, z que se10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente11.

12. #pragma udata overlay seccionCompartida2 = 0x100;13. // Sección de datos almacenados a partir de 0x100 14.

15. long a, b;16. // Variables a y b que se guardan a partir de 0x100 y 0x104

- 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

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 50

Cátodo común

Ánodo común

Visualizadores de 7 segmentos

F1000111

E1001111

d0111101

C1001110

b0011111

A1110111

91111011

81111111

71110000

61011111

51011011

40110011

31111001

21101101

10110000

01111110

Verabcdefg

Page 26: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 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:

DB0-DB7

E

R/W

RS

Vc

Vdd

Vss

Señal

Bus de datos7-14

Pulso a nivel alto para realizar la transferencia6

Operación de lectura (R/W=1) o escritura (R/W=0)5

Transmisión de texto (RS=1) o transmisitón de instrucción (RS=0)4

Alimentación para la pantalla3

Alimentación +5Vdc para circuitos lógicos2

Masa1

SignificadoNúmero de línea

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 52

Configuración del bus de datos

DB0DB1DB2DB3DB4DB5DB6DB7

ER/WRS

µC LCD

DB0-DB7

R/W

E

dato

µC LCD

DB4-DB7

R/W

E

bits 4-7 bits 0-3

8 bits 4 bits

RD0RD1RD2RD3

RA1RA2RA3

DB0DB1DB2DB3DB4DB5DB6DB7

ER/WRS

Page 27: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 53

1. #include <p18f452.h>2.

3. // Macros para dar nombre a las líneas del puerto PORTB utilizadas4. #define E_LCD PORTAbits.RA15. #define RW_LCD PORTAbits.RA26. #define RS_LCD PORTAbits.RA37.

8.

9. void instruccionLCD (unsigned char instruccion)10. // Envía al LCD la instrucción codificada en el parámetro11.

12. {13. RS_LCD = 0; // Se va a enviar una instrucción14. RW_LCD = 0; // En una operación de escritura15. PORTD &= 0xF0; // Pone a cero los 4 bits menos significativos de PORTD16. PORTD |= instruccion >> 4; // Pone en PORTD(0-3) los 4 bits más significativos17. E_LCD = 1;18. E_LCD = 0; // Pulso de activación de transferencia19. PORTD &= 0xF0;20. PORTD |= instruccion & 0x0F; // Pone en PORTD(0-3) los 4 bits menos significativos21. E_LCD = 1;22. E_LCD = 0; // Otro pulso de transferencia23. }

Envío de instrucciones con bus de 4 bits

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 54

DB0DB1DB2DB3DB4DB5DB6DB7

*

*

C

I/D

1

0

*

*

B

S

*

1

Dato11Lectura en RAM

Dato01Escritura en RAM

Dirección DDRAMBF10Lee estado

Dirección DDRAM100Dirección DDRAM

Dirección CGRAM1000Dirección CGRAM

FNDL10000Función

R/LS/C100000Desplazamiento

D1000000Activación pantalla

10000000Modo introducción

00000000Cursor a origen

00000000Borrar pantalla

Bus de datos en dos transferencias de 4 bits DB4-DB7R/WRSInstrucción

Juego de instrucciones de una pantalla LCD

Page 28: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 55

Se desplaza el cursor (0) o toda la información (1) con cada escrituraS/C

Bus de 4 bits (0) o de 8 bits (1)DL

LCD de una fila (0) o de más filas (1)N

Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1)F

La pantalla está ocupada (1) o puede aceptar otra instrucción (0)BF

Desplazamiento a la izquierda (0) o a la derecha (1)R/L

Cursor fijo (0) o con parpadeo (1)B

Cursor invisible (0) o visible (1)C

Pantalla apagada (0) o en funcionamiento (1)D

Sin desplazamiento (0) o con desplazamiento (1)S

Decrementa (0) o incrementa (1) la posición del cursor con cada escrituraI/D

SignificadoBit

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 56

Inicialización

Page 29: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 57

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 Sistemas embebidos 58

Continúa

Page 30: Tutorial C18

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

Page 31: Tutorial C18

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. #include <p18f452.h>2.

3. void main (void)4.

5. {6. float resultado; // Para recoger la medida expresada en voltios7.

8. TRISAbits.TRISA0 = 1;9. // El bit menos significativo del puerto RA es una línea de entrada10.

11. ADCON0 = 0x41;12. // Activa el módulo de conversión analógica, selecciona el canal 0 y 13. // utiliza un tiempo de conversión igual 8 veces el período del oscilador14.

15. ADCON1 = 0x8E;16. // El resultado de la conversión se sitúa en los 10 bits menos significativos17. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN018.

19. while (1) // Ejecutar contínuamente ...20. {21. ADCON0bits.GO_DONE = 1; // Solicita una conversión22. while (ADCON0bits.GO_DONE); // Espera mientras no finalice23.

24. resultado = (float) ADRES * 5 / 1024;25. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor26. // de 10 bits de resolución27.

28. Utilizar el resultado de la conversión29. }30. }

Page 32: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 63

Conversión analógico/digital mediante interrupción

1. #include <p18f452.h>2.

3. float resultado; // Para recoger la medida expresada en voltios4. int finConversion; // Booleano cierto si terminó la conversión5.

6.

7. #pragma interrupt interrupcionConversionAD8. void interrupcionConversionAD (void)9. // Rutina que atiende a la interrupción producida cuando finaliza una10. // conversión A/D11.

12. {13. resultado = (float) ADRES * 5 / 1024;14. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor15. // de 10 bits de resolución16.

17. finConversion = 1;18. // Indica que ya se dispone de la medida19.

20. PIR1bits. ADIF = 0; 21. // Hay que poner a cero el aviso de interrupción22. }23.

24.

25. #pragma code interruption = 0x826. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias27. {28. _asm29. GOTO interrupcionConversionAD 30. _endasm31. }

Continúa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 64

32. #pragma code // Vuelve a la sección de código normal33.

34.

35. void main (void)36.

37. {38. TRISAbits.TRISA0 = 1;39. // El bit menos significativo del puerto RA es una línea de entrada40.

41. ADCON0 = 0x41;42. // Activa el módulo de conversión analógica, selecciona el canal 0 y 43. // utiliza un tiempo de conversión igual 8 veces el período del oscilador44.

45. ADCON1 = 0x8E;46. // El resultado de la conversión se sitúa en los 10 bits menos significativos47. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN048.

49. IPR1bits.ADIP = 1; // Interrupciones de fin de conversión son de alta prioridad50. PIE1bits.ADIE = 1; // Permite interrupciones por conversión A/D51. INTCONbits.GIEH = 1; // Permite interrupciones de alta prioridad52. RCONbits.IPEN = 1; // Distingue entre interrupciones de alta y baja prioridad53.

54. while (1) // Ejecutar contínuamente ...55. {56. finConversion = 0; // Prepara a este booleano57. ADCON0bits. GO_DONE = 1; // Solicita una conversión58. while (! finConversion); // Espera mientras no finalice59.

60. Utilizar resultado de conversión61. }62. }

Page 33: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 65

Unidad de captura

Interrupción

Selección deflanco

Entrada

Selección detemporizador Temporizador 1

Temporizador 3

Captura

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 66

1. #include <p18f452.h>2.

3. unsigned int duracion; 4. // Tiempo transcurrido entre dos flancos ascendentes de la línea RC2/CCP15.

6.

7. #pragma interrupt interrupcionComparacion8. void interrupcionComparacion (void)9. // Rutina que atiende a la interrupción producida cuando se detecta un flanco10. // ascendente en RC2/CCP111.

12. {13. unsigned static int anterior;14. // Recuerda el instante en el que se detectó el último flanco ascendente15.

16. if (PIR1bits. CCP1IF) // Si la interrupción se produjo debido a una captura ...17. {18. duracion = CCPR1 - anterior; // Intervalo entre este flanco y el anterior19. anterior = CCPR1; // Recuerda este instante para la siguiente vez20. }21.

22. PIR1bits. CCP1IF = 0; 23. // Hay que poner a cero el aviso de interrupción24. }

EjemploPrograma 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

Continúa

Page 34: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 67

25. #pragma code interruption = 0x826. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias27. {28. _asm29. GOTO interrupcionComparacion 30. _endasm31. }32.

33. #pragma code // Vuelta a la sección de código normal34.

35. void main (void)36.

37. {38. TRSCbits. TRISC2 = 1; // Configura la línea RC2/CCP1 como entrada39.

40. // Configuración de TIMER1:41. T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits42. T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operación de 1/843. T1CONbits. T1CKPS0 = 1;44. T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno45. T1CONbits. T1SYNC = 1; // Sin sincronización con señal externa46. T1CONbits. TMR1ON = 1; // Activa TIMER147.

48. T3CONbits. T3CCP2 = 0; // La unidad de captura de la línea CCP1 utiliza TIMER149.

50. CCP1CON = 0x05; // La captura se realiza en los flancos ascendentes51.

52. PIE1bits. CCP1IE = 1; // Habilita interrupciones de captura en CCP153. RCONbits. IPEN = 1; // Habilita interrupciones prioritarias54. INTCONbits. GIE = 1; // Habilitación global de interrupciones55.

56. while (1); // Bucle indefinido de espera57. }

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 68

Page 35: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 69

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 70

Page 36: Tutorial C18

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 10 0

Dígitos de 4 bits: 10112

Paridad impar: 0

Bandamagnética

Page 37: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 73

SS PAN

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.

FS CC ED ES LRCMás dígitos ...

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 74

Fotodiodo Fototransistor

Superficieclara

220

4K7Vcc

GND

Salida

CNY70

Lectores fotoeléctricos

Page 38: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 75

Codificadores incrementales rotativos (rotary encoders)

Disco codificado

Inserción sellada

LEDs

DiscoFotodiodo

Rodamientos

Eje

Cable

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 76

Page 39: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 77

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.

Células fotoeléctricas

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 78

Cambio de sentido

A

B

RA4/T0CKI

RC0/T1CKI

PIC18F452

Canal A

Canal B

A

B

Page 40: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 79

1. void main (void)2.

3. {4. int posicion = 0;5. unsigned timer0, timer1;6.

7. T0CON = 0xA8;8. // Configura TIMER0: lo activa, contador de 16 bits de flancos ascendentes en 9. // entrada T0CKI 10.

11. T1CON = 0x83;12. // Configura TIMER1: lo activa como contador de 16 bits de flancos ascendentes en13. // entrada T1CKI14.

15. ...16.

17. timer0 = TMRL0; // Primero hay que leer la parte baja18. timer0 |= TMRH0 << 8; // y luego hay que combinarla con la parte alta19. timer1 = TMRL1;20. timer1 |= TMRH1 << 8;21. posicion = timer0 - timer1;22. // Calcula la posición del encóder como la diferencia entre el número de 23. // pulsos en uno y otro sentidos24. }

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. unsigned long posicion = 0; // Posición del encóder2. #define A PORTBbits.RB0 // El canal A conectado a RB03. #define B PORTBbits.RB1 // El canal B conectado a RB14.

5. void interrupcionCambioPuerto ()6. {7. int xor;8. static int primera = 0, Aanterior, Banterior;9.

10. if (! primera) // Si no es la primera interrupción ...11. {12. xor = A ^ B; // Calcula a o-exclusiva13. if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++;14. else posicion --; // actualiza la posición15. }16. else primera = 0; // La siguiente ya no es la primera interrupción17. Aanterior = A; // Recuerda el estado anterior en el canal A18. Banterior = B; // Lo mismo para el canal B19. }

Page 41: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 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 anchasque las demás.

- Entre caracteres consecutivos se inserta un pequeño espacio equivalente a una barra blanca.

- Se pueden codificar cadenas compuestas por caracteres 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.$/+% y espacio en blanco.

- El asterisco * se utiliza como delimitador de inicio y final de cadena.

- Ejemplo, para codificar la cadena PO-2537:

* P O - 2 5 3 7 G *

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 82

CodificaciónPatrón de barrasCarácter

1101 0101 0011K

1101 0100 1101H

1011 0100 1101I

1010 1100 1101J

1011 0010 11019

1010 0110 11010

1101 0100 1011A

1011 0100 1011B

1101 1010 0101C

1010 1100 1011D

1101 0110 0101E

1011 0110 0101F

1010 1001 1011G

1101 0010 11018

1011 0101 0011L

1010 0101 10117

1011 0011 01016

1101 0011 01015

1010 0110 10114

1101 1001 01013

1011 0010 10112

1101 0010 10111

CodificaciónPatrón de barrasCarácter

1001 0100 1001+

1001 0110 1101*

1001 0010 1001$

1001 0010 1001/

1100 1010 1011U

1001 1010 1011V

1100 1101 0101W

1001 0110 1011X

1100 1011 0101Y

1001 1011 0101Z

1001 0101 1011-

1100 1010 1101.

1001 1010 1101Espacio

1010 1101 1001T

1010 0100 1001%

1011 0101 1001S

1101 0101 1001R

1010 1011 0011Q

1011 0110 1001P

1101 0110 1001O

1010 1101 0011N

1101 1010 1001M

Page 42: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 83

Checksum final

- Suma de todos los dígitos módulo 43

- Ejemplo: para PO-2537:

P = 25O = 24- = 362 = 25 = 53 = 37 = 7 +

102

Resto de la división 102/43 = 16

Checksum = carácter G

L

K

J

I

H

G

F

E

D

C

B

A

0

9

8

7

6

5

4

3

2

1

Carácter

21

20

19

18

17

16

15

14

13

12

11

10

0

9

8

7

6

5

4

3

2

1

Valor

%

+

/

$

*

Espacio

.

-

Z

Y

X

W

V

U

T

S

R

Q

P

O

N

M

Carácter

42

41

40

39

38

37

36

35

34

33

32

31

30

29

28

27

26

25

24

23

22

Valor

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 84

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 byte 3

Page 43: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 85

Transmisión serie asíncrona

bit 0bit 1 bit 2 bit 3 bit 4bit 5bit 6 bit 7

Período dereposo

T+ T2

T T T T T T T T T

Instantes de lectura

Instantes de escritura

T T T T TTT

Bit decomienzo

Instante desincronización

Instante desincronización

1 1 0 1 0 0 0 1

- 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 86

RS 485

Esclavos

RS 422

Maestro

Half-duplex

Full-duplex

Page 44: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 87

Protocolos maestro/esclavo

Esclavo 1 Esclavo 2 Esclavo 3

Orden dirigida al esclavo 2

Respuesta

2 0 0 2 3 0Orden Respuesta

Tiempo mínimoentre ciclos

orden/respuesta

Otra orden

Maestro 0

Sincronización del diálogo

Dirección destinoDirección origen

Universidade de Vigo – EUITI Informática 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), 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

Consigna

Sensor

Temperatura

Tiempo

Período de autoajuste

Page 45: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 89

Ejemplo de aplicación: control de humedad de un recinto

Alimentación220 VAC

Humidificador

Sensor dehumedad

SalidaAlarma

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 90

Control on/off

ON

OFF

Zona muertaDead band

Histéresis

Punto de consignaSet point

Temperatura

Actuación

Zona decalentamiento

Zona deenfriamiento

Page 46: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 91

Configuración de parámetros de comunicación

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

Número de nodo: 0 a 99

Paridad: par, impar, ninguna

Bits por byte: 7, 8Bits parada: 1, 2

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 92

Protocolo de comunicación: operación de escritura

- Formato texto

@ 0 9 2 0 1 3 0 0 0

Comienzo

Direccióndestino

Operaciónde escritura

Parámetroa modificar

Valor

7 9 * Cr

- Ejemplo: modificar el valor de consigna (parámetro número 1) a 300.0 grados en el nodo 9.

Orden

Maestro esclavo

@ 0 9 2 0 1 3 0 0 0

Comienzo

Direcciónorigen

Operaciónde escritura

Valor

7 9 * CrRespuesta

Esclavo maestro0 0

XOR

Fin orden

Operacióncorrecta

Parámetromodificado

XOR

Fin respuesta

Page 47: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 93

Cálculo de la XOR

30

30

30

33

31

30

32

39

30

40

ASCII

Hexadecimal

0011 0000480

0011 0000480

0011 0000480

0011 0011513

0011 0001491

0011 0000480

0011 0010502

0011 1001579

0011 0000480

0001 000064@

ASCII

Binario

ASCII

Decimal

Carácter

XOR = 121 79 0111 1001

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 94

@ 0 9 1 0 1 0 0 0 0

Comienzo

Nododestino

Operaciónde lectura

Parámetroa leer

ValorNo se utiliza

7 9 * Cr

- Ejemplo: obtener el valor actual de la variable controlada en el nodo 9.

Orden

Maestro esclavo

@ 0 9 1 0 1 2 0 0 0

Comienzo

Nodoorigen

Operaciónde lectura

Valor

7 A * CrRespuesta

Esclavo maestro0 0

XOR

Fin orden

Operacióncorrecta

Parámetroleído

XOR

Fin respuesta

Protocolo de comunicación: operación de lectura

Page 48: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 95

Protocolo XON/XOFF

1. typedef struct2. {3. char datos [1000];4. unsigned carga, descarga, cargados;5. } COLA;6. // Cola circular donde almacenar hasta 1000 caracteres, disponiendo de una7. // posición de carga, de descarga y contabilizando el número de caracteres8. // cargados9.

10. COLA ColaRecepcion, ColaTransmision;11. // Colas circulares independientes para los datos recibidos y a transmitir12.

13. unsigned char * pCanal;14. // Se supone que los caracteres que se reciben o se transmiten se guardan15. // o se leen de un registro mapeado en memoria en la dirección apuntada por 16. // este puntero17.

18. int XOFFRecibido, XOFFEnviado;19. // Booleanos que indican si se ha transmitido el carácter XOFF y si a su vez20. // se ha recibido

- 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:

Continúa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 96

21. int Transmitiendo = 0;22. // Booleano que indica si hay alguna transmisión en curso23.

24. #define XON 1725. #define XOFF 1926. // Macroinstrucciones para representar a los códigos ASCII de los caracteres27. // XON y XOFF28.

29.

30. void interrupt IRecibe ()31. // Rutina que atiende a la interrupción que se produce cuando se recibe un 32. // nuevo carácter33.

34. {35. char recibido;36.

37. recibido = * pCanal;38. // Recoge el carácter recibido39.

40. if (recibido == XOFF) XOFFRecibido = 1;41. // Si se ha recibido un XOFF, indicarlo en este booleano42.

43. else if (recibido == XON) // Si se ha recibido un XON ...44. {45. if (XOFFRecibido && ColaTransmision. cargados > 0)46. Envia (descarga (& ColaTransmision));47. // Si previamente se ha recibido un XOFF y además hay aún caracteres en la48. // cola de envío, extraer un carácter de esa cola y enviarlo49.

50. XOFFRecibido = 0;51. // Indica que ya podemos transmitir caracteres52. }53.

Continúa

Page 49: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 97

54. else // Si no es XON ni XOFF ...55. {56. if (ColaRecepcion. cargados > 900)57. // Si en la cola de entrada ya hay 900 caracteres ...58. {59. Envia (XOFF); // Envía un XOFF60. XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF61. }62.

63. carga (recibido, & ColaRecepcion);64. // En cualquier caso carga en la cola de recepción el carácter recibido65. }66. }67.

68.

69. void interrupt IEnvia ()70. // Rutina que atiende a la interrupción que se produce cuando ha finalizado 71. // el envío de un carácter enviado anteriormente72.

73. {74. if (ColaTransmision. cargados == 0) Transmitiendo = 0;75. // Si la cola de transmisión está vacía, no hay que enviar nada más76.

77. if (! XOFFRecibido && ColaTransmision. cargados > 0)78. * pCanal = descarga (& ColaTransmision);79. // Si no se ha recibido XOFF y en la cola de transmisión hay algo, entonces80. // recoger un carácter de la misma y provocar su envío81. }82.

Continúa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 98

83. char RecibeCola ()84. // Recoge de la cola de recepción un carácter y lo devuelve. Si esta cola está85. // vacía, devuelve un 0.86.

87. {88. if (XOFFEnviado && ColaRecepcion. cuantos == 100) 89. // Si se ha enviado previamente un XOFF y ya hay suficiente espacio libre en 90. // la cola de recepción ...91.

92. {93. * pCanal = XON; // Envía un XON94. XOFFEnviado = 0; // Indica que se ha anulado el anterior envío de XOFF95. }96.

97. if (ColaRecepcion. cuantos > 0) // Si la cola de recepción no está vacía ...98. return descarga (& ColaRecepcion); // Devuelve un carácter de la misma99. else return 0; // Si no, devuelve un 0100. }101.

102.

103. void EnviaCola (char dato)104. // Envía el carácter pasado por parámetro. Si hay una transmisión en curso, 105. // lo guarda en la cola de transmisión106.

107. {108. if (! Transmitiendo) // Si en este momento no hay transmisión en curso ...109. {110. * pCanal = dato; // Envía el carácter111. Transmitiendo = 1; // Indica que hay una transmisión en curso112. }113. else carga (& ColaTransmision, dato); // Si no, cárgalo en la cola114. }115.

Continúa

Page 50: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 99

116.

117. main ()118.

119. {120. pCanal = (unsigned char *) 0x100;121. // Supongamos que el registro para recepción/transmisión está mapeado en la122. // dirección 0x100;123.

124. ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0;125. ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0;126. // Inicializa las colas de recepción y transmisión127.

128. Instala (IRecibe, 3);129. Instala (IEnvia, 4);130. // Instala las rutinas para atender a las interrupciones131.

132. Utiliza las funciones EnviaCola y RecibeCola para manejar el canal133.

134. }

X8X5 X6 X7X4X3X2X1

X0

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 100

Códigos de redundancia cíclica

- CRC (Cyclic Redundancy Check)

- Algoritmos más utilizados:

CRC-8 = X8 + X5 + X4 + 1CRC-12 = X12 + X11 + X3 + X2 + X + 1CRC-16 = X16 + X15 + X2 + 1CRC-CCITT = X16 + X12 + X5 + 1CRC-32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1

D

G

Q

Entradade bits

D

G

Q D

G

Q D

G

Q D

G

Q D

G

D

G

Q D

G

Disparo para desplazamientos

QQ- Ejemplo: CRC-8

Page 51: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 101

1. unsigned char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Información a procesar2. unsigned n = 4; // Número de bytes en la matriz m3. unsigned i, j; // Contadores para bucles4. unsigned char CRC8 = 0; // Variable donde se va a calcular el CRC-85. unsigned auxiliar;6.

7.

8. for (i = 0; i < n; i ++) // Procesando todos los bytes guardados en m ...9. {10. auxiliar = m [i]; // Copia el siguiente byte a procesar11. for (unsigned j = 0; j < 8; j ++) // Recorriendo los 8 bits de ese byte ...12. {13. if ((auxiliar & 0x01) ^ (CRC8 & 0x01)) // Si la XOR de entrada genera un 1 ...14. {15. CRC8 ^= 0x18; // Realiza también la XOR con los puntos de realimentación16. CRC8 >>= 1; // Desplaza todos los biestables17. CRC8 |= 0x80; // Añade un 1 en el biestable más significativo18. }19. else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC20. auxiliar >>= 1; // Continúa con el siguiente bit21. }22. }

CRC-8 en lenguaje C

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 102

Page 52: Tutorial C18

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))

Page 53: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 105

IPENRCON

bit 0bit 1bit 2bit 3bit 4bit 5bit 6bit 7Registro

Velocidad de comunicaciónSPBRG

BRGHSYNCTXTA

Dato recibidoRCREG

RX9DOERRFERRADDENCRENRX9SPENRCSTA

RCIPIPR1

RCIEPIE1

RCIFPIR1

GIELGIEHINTCON

Habilitainterrupcionesalta prioridad

Habilitainterrupcionesbaja prioridad

Flag interrupciónpor recepción

Habilita interrupciónpor recepción

Prioridad de interrupciónpor recepción

Habilitacomunicación

Habilitabit 9

Habilitareceptor Habilita

detecciónde dirección

Bit 9recibido

Framing error

Error de trama de bits

Overrun error

Error de saturacióndel receptor

Configuración de la recepción

0 para modo

asíncrono

Selección develocidad

Permiteinterrupcionesde diferentesprioridades

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 106

IPENRCON

bit 0bit 1bit 2bit 3bit 4bit 5bit 6bit 7Registro

Velocidad de comunicaciónSPBRG

TX9DTRMTBRGHSYNCTXENTX9TXTA

Dato a transmitirTXREG

SPENRCSTA

TXIPIPR1

TXIEPIE1

TXIFPIR1

GIELGIEHINTCON

Habilitainterrupcionesalta prioridad

Habilitainterrupcionesbaja prioridad

Flag interrupciónpor transmisión

Habilita interrupciónpor transmisión

Prioridad de interrupciónpor transmisión

Habilitacomunicación

Habilitabit 9

Habilitatransmisor

Bit 9 atransmitir

1 cuando finalizó la serialización

Configuración de la transmisión

0 para modo

asíncrono

Selección develocidad

Permiteinterrupcionesde diferentesprioridades

Page 54: Tutorial C18

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 107

1. #include <p18f452.h>2.

3. rom char mensaje[] = "\nHola\nEste programa hace eco de "4. "toda la información recibida\n";5. // Cadena de caracteres guardada en memoria de programa6.

7. void enviaCaracter (char caracter)8. // Envio de un carácter por consulta9. {10. while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carácter11. TXREG = caracter; // Suministra el carácter para serializarlo12. }13.

14. char recibeCaracter (void)15. // Recepción de un carácter por consulta16. {17. while (! PIR1bits. RCIF); // Espera mientras no se na recibido nada18. PIR1bits. RCIF = 0; // Este flag hay que ponerlo a cero en el programa19. return RCREG; // Devuelve el carácter recibido20. }21.

22. void inicializaCanalConsulta ()23. // Inicializa el canal serie para recepción/transmisión por consulta24. {25. TRISCbits. TRISC6 = 0; // Línea de transmisión en RC6 como salida26. TRISCbits. TRISC7 = 1; // Línea de recepción en RC7 como entrada27. SPBRG = 25; // Con un reloj de 4 MHz fija una velocidad de 9600 baud28. TXSTA = 0x24; // 8 bits y sin paridad, habilita transmisor29. RCSTA = 0x90; // Habilita receptor30. }31.

Recepción y envío por consulta

Continúa

Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 108

32. void enviaCadenaROM (rom char * cadena)33. // Envía por el canal serie una cadena de caracteres almacenada en ROM34. {35. rom char * p; 36. p = cadena; // Apunta al primer carácter37. while (* p) // Mientras no se haya llegado al final de la cadena ...38. {39. enviaCaracter (* p); // Envía un carácter40. p ++; // Para enviar luego el siguiente41. }42. }43.

44.

45. void main (void)46.

47. {48. char caracter;49.

50. inicializaCanalConsulta (); // Inicializa los parámetros del canal51. enviaCadenaROM (mensaje); // Envía ese mensaje52. while (1) // Repite contínuamente ...53. {54. caracter = recibeCaracter (); // Espera a recibir un carácter y recógelo55. enviaCaracter (caracter); // Lo envía por el mismo canal56. }57. }