You are on page 1of 54

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

Microcontrolador Microchip PIC18F452

- Arquitectura RISC (Reduced Instruction Set Computer).


- Juego de instrucciones reducido para ejecución rápida.
- Oscilador hasta 40 MHz ĺ 10 MIPs (Million Instructions Per second).
- Optimizado para compilación desde lenguaje C.
- Micro de 8 bits.

- Arquitectura de memoria Hardvard:


- memoria interna de programa FLASH de 32 Kb
- memoria interna RAM de 1536 bytes
- memoria interna EEPROM de 256 bytes
- contador de programa de 21 bits ĺ hasta 2 Mb de memoria de programa
- direccionamiento de 12 bits en memoria de datos ĺ 4Kb

- Periféricos integrados:
- temporizadores, contadores, comparadores, unidades de captura
- modulación en ancho de pulso PWM (Pulse Width Modulation)
- interrupciones internas y externas
- canal serie USART (Universal Synchronous/Asnynchronous Serial Receiver/Transmiter)
- canal serie SPI (Serial Peripheral Interface)
- canal serie I2C (Inter-Integrated Circuit)
- puerto paralelo esclavo PSP (Parallel Slave Port)
- conversión A/D de 10 bits
- perro guardián WDT (Watchdog Timer).

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

Encapsulados
PIC18F452: QFN (Quad Flat No lead)

DIP

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

Operaciones simultáneas de lectura y ejecución de instrucciones (pipeline)

Ciclos de reloj

MOVLW 55h carga el valor 0x55 en el acumulador

MOVWF PORTB copia el acumulador en el puerto B

BRA SUB_1 salto a la rutina SUB_1

BSF PORTA, BIT3 pone a 1 el bit 3 del puerto A

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

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 5

SFRs
- Direcciones
0xF80 a 0xFFF

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

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


16: Zumbador
17: Área de prototipos
18: Sensor de temperatura
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

Placa de desarrollo Microchip PICDEM 2 PLUS


Pulsador S1
Reset

Poten-
ciómetro

EEPROM

Pulsador S2

PIC 18F452

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

Placa de desarrollo Microchip PICDEM 2 PLUS

Zumbador Sensor de temperatura


Pulsador S3

LEDs
Pantalla de cristal líquido Continúa

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

Placa de desarrollo Microchip PICDEM 2 PLUS

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

Compilador MPLAB C18 en entorno MPLAB IDE

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

Compilación, enlazado
con MPLAB C18
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 15

Primer ejemplo con MPLAB C18

1. #include <p18f452.h> Contador utilizado para repetir el


2. bucle 15 veces
3. int contador;
4.
5. void main () Configura todas las líneas del puerto B
6. { como salidas digitales
7. contador = 1;
8. TRISB = 0; A cada paso del bucle, las 8 líneas del
9. while (contador <= 15) puerto B reflejan el estado del contador
10. {
11. PORTB = contador;
12. contador ++;
13. }
14. }

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

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 17

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 18

Añadir un fichero fuente al proyecto:

File ĺ New
Editar y guardar en ejemplo.c

En la ventana de proyecto añadir:


- Fichero fuente ejemplo.c
- Script de enlazado:
18f452i.lkr para simulación
18f452.lkr para MPLAB ICD2
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 19

Configuración de subdirectorios de trabajo


Project ĺ Build options ĺ Project

Ficheros creados en el mismo


subdirectorio del proyecto

Ficheros de declaraciones en c:\mcc18\h

Bibliotecas en c:\mcc18\lib

Script de enlazado en c:\mcc18\lkr

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

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


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

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

1. #include <p18f452.h>
2. Dirección Código Código int contador;
3. programa máqina ensamblador
4. int main ()
5. {
6. 0000e2 0e01 MOVLW 0x1 contador = 1;
7. 0000e4 0100 MOVLB 0x0
8. 0000e6 6f8a MOVWF 0x8a,0x1
9. 0000e8 6b8b CLRF 0x8b,0x1
10. 0000ea 6a93 CLRF 0x93,0x0 TRISB = 0;
11. 0000ec 518b MOVF 0x8b,0x0,0x1 while (contador <= 15)
12. 0000ee 0a00 XORLW 0x0
13. 0000f0 aee8 BTFSS 0xe8,0x7,0x0
14. 0000f2 d002 BRA 0xf8
15. 0000f4 358b RLCF 0x8b,0x0,0x1
16. 0000f6 d005 BRA 0x102
17. 0000f8 0e0f MOVLW 0xf
18. 0000fa 80d8 BSF 0xd8,0x0,0x0
19. 0000fc 558a SUBFWB 0x8a,0x0,0x1
20. 0000fe 0e00 MOVLW 0x0
21. 000100 558b SUBFWB 0x8b,0x0,0x1
22. 000102 e306 BNC 0x110
23. 00010e d7ee BRA 0xec
24. {
25. 000104 c08a MOVFF 0x8a,0xf81 PORTB = contador;
26. 000106 ff81
27. 000108 2b8a INCF 0x8a,0x1,0x1 contador ++;
28. 00010a 0e00 MOVLW 0x0
29. 00010c 238b ADDWFC 0x8b,0x1,0x1
30. }
31. 000110 0012 RETURN 0x0 }

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

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


00E2 0E
1. :020000040000FA
2. :0600000089EF00F0120080 01
00E3
3. :02002A000000D4
4. :0C0044002A0EF66E000EF76E000EF86E2D 01
00E4
5. :1000500000010900F550856F0900F550866F03E136 00
6. :10006000856701D03DD00900F550806F0900F5503B 00E5
7. :10007000816F0900F550826F09000900F550E96EA3 6F
8. :100080000900F550EA6E090009000900F550836F78 00E6
8A
9. :100090000900F550846F09000900F6CF87F0F7CF0B
10. :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA 00E7 6B
11. :1000B000F8FF0001835302E1845307E00900F55083
12. :1000C000EE6E8307F8E28407F9D787C0F6FF88C091 00E8 8B
13. :1000D000F7FF89C0F8FF00018507000E865BBFD7D8 6A
14. :0200E00012000C 00E9
15. :0E00E200010E00018A6F8B6B936A8B51000A2E 93
00EA
16. :1000F000E8AE02D08B3505D00F0ED8808A55000EA1
51
17. :100100008B5506E38AC081FF8A2B000E8B23EED726
00EB
18. :020110001200DB 8B
19. :0E01120015EE00F025EE00F0F86A019CA68EB6 00EC
20. :0E012000A69C22EC00F071EC00F0FDD712005E 00
21. :00000001FF 00ED 0A

Se
Se indican
guardan Información a Suma de
Se datos a
a partir de almacenar comprobación
indican almacenar
00E2
14 bytes

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


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

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 24

Mapa de memoria: generado en el fichero P1.map

Direccionamiento de algunos identificadores:


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

Memoria de programa utilizada:


1. Program Memory Usage Comienzo ejecución: GOTO 0x112
2. Start End
3. --------- ---------
4. 0x000000 0x000005 Código de inicialización
5. 0x000044 0x00012d
6. 242 out of 33048 program addresses used 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 25

Elección del depurador: Debugger ĺ Select Tool ĺ MPLAB SIM

MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardware


MPLAB SIM: simulador

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

Depuración de programas: ejecución de instrucciones


Reset: comenzar de nuevo
Step Out: ejecutar el resto de la función
Step Over: en una llamada a una función, ejecutarla completamente
Step Into: en una llamada a una función, detenerse al comienzo de la misma
Run: ejecución contínua del programa

Punto de ruptura

Siguiente instrucción
a ejecutar
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 27

Particularidades de MPLAB C18: clase de almacenamiento overlay


- Almacenamiento estático
- Inicialización en cada llamada
- Se comparte memoria en el caso de que no haya uso simultáneo
- Ventaja: optimización de memoria, necesario en arquitecturas reducidas

Ejemplos:
a y b se guardan en
a y b comparten memoria posiciones diferentes:
1. int f () 1. int f ()
2. { 2. {
3. overlay int a = 3; 3. overlay int a = 3;
4. return a; 4. return a;
5. } 5. }
6. 6.
7. int g () 7. int g ()
8. { 8. {
9. overlay int b = 7; 9. overlay int b = 7;
10. return b; 10. b = f ();
11. } 11. return b;
12. 12. }
13. int main () 13.
14. { 14. int main ()
15. f (); 15. {
16. g (); 16. f ();
17. } 17. g ();
18. }

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

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

Ejemplo:
1. int doblePila (int x)
2. {
3. return 2 * x;
4. }
5.
6. int dobleEstatico (static int x)
7. {
8. return 2 * x;
9. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 29

Memoria de datos
Memoria interna organizada en bancos de 256 bytes

También existe direccionamiento indexado, que permite manejar toda la memoria


RAM de forma lineal.

Universidade de Vigo –- EUITI


EUITI Informática
Informática Industrial
Industrial 2004-2005
2004-2005 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 código
máquina está a 0

Ventaja: mayor rapidez de acceso

Ejemplo: copiar valor desde el acumulador


a la dirección dddd dddd con la etiqueta D

Ensamblador: MOVWF D, a
Máquina: 0110 111a dddd dddd

Caso particular:
MOVWF PORTB, 0
0110 1110 1000 0001
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 31

Soporte en MPLAB C18 para especificación de banco en memoria de datos:

- Clase de almacenamiento far para variables que pueden residir en cualquier banco.

- Clase de almacenamiento near para variables que tienen que residir en el banco especial.

- Ejemplo:

1. far int f;
2.
3. int main ()
4. { 1. MOVLB 0x0 ; BSR=0 para seleccionar
5. near int n; Compilación 2. ; el banco 0
6. f = 3; 3. MOVLW 0x3 ; Carga 0x3 en acumulador
7. n = 5; 4. MOVWF 0x8A,0x1 ; Copia acumulador en 0x8A
8. } 5. ; seleccionando banco con BSR
6. CLRF 0x8B,0x1 ; Pone a cero la dirección
7. ; 0x8B, seleccionando banco
8. ; con BSR

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

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 33

Mapa de memoria
de programa Pila

Comienzo después de
una inicialización (reset)

Dos tipos de
interrupciones:
de alta y baja prioridad

Memoria de
programa interna
Capacidad de direccionamiento
de hasta 2 Mb

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

Posible memoria de
programa externa

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

Datos en memoria de programa


- Memoria FLASH no volátil de lectura/escritura

- Mayor capacidad que la RAM. Almacenamiento de información constante o que no se va a modificar


frecuentemente.

- Se manejan mediante los SFR:


TBLPTRU (TaBLe PoinTeR Upper byte)
TBLPTRH (TaBLe PoinTeR High byte) Dirección de memoria de programa
TBLPTRL (TaBLe PoinTeR Low byte)
TABLAT (program memory TABLe LAtch) Dato a transferir

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


Universidade de Vigo – EUITI Informática 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. #include <p18f452.h>
Según el fichero de mapa de memoria,
2. rom far char f;
la variable f se almacena en la dirección 0x000112
3. int main ()
4. {
TBLPTRU:TBLPTRH:TBLPTRL = 0x000112
5. f = 3;
6. }

Compilación

1. MOVLW 0x12 ; Carga 0x12 en el acumulador


2. MOVWF TBLPTRL, 0 ; Copia el acumulador en TBLPTRL
3.
4. MOVLW 0x1 ; Carga 0x1 en el acumulador
5. MOVWF TBLPTRH, 0 ; Copia el acumulador en TBLPTRH
6.
7. MOVLW 0x0 ; Carga 0x0 en el acumulador
8. MOVWF TBLPTRU, 0 ; Copia el acumulador en TBLPTRU
9.
10. MOVLW 0x3 ; Carga 0x3 en el acumulador
11. MOVWF TABLAT, 0 ; Copia el acumulador en TABLAT
12.
13. TBLWT ; Escribe en memoria FLASH

Universidade de Vigo – EUITI Informática 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. #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; Error
9. }

Tamaño de los punteros:

Puntero a memoria de datos int * p; 16 bits


Puntero near a memoria de programa rom near int * p; 16 bits
Puntero far a memoria de programa rom far int * p; 24 bits
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 37

Información en memoria de programa

- Caso típico: cadenas de caracteres constantes.

- Hay funciones para realizar trasvases RAM ļ ROM

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

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

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

rom ĺ rom rom char * strcpypgm2pgm (auto rom char * destino,


auto const rom char * origen);

const: la cadena de caracteres origen no se modifica

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

Ejemplo
1. rom far const char cadenaROM [] = "Hola";
2. char cadenaRAM [20];
3.
4. strcpypgm2ram (cadenaRAM, cadenaROM);

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 = HS


2. // Se utiliza un cristal de cuarzo de frecuencia alta
3.
4. #pragma config WDT = OFF
5. // Se desactiva el perro guardián (WatchDog Timer)
6.
7. #pragma config LVP = OFF
8. // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming)

- También se pueden establecer en el MPLAB IDE, bajo Configure ĺ Configuration bits ...
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 39

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

Parte del fichero p18f452.h

1. union
2. {
3. struct
4. {
5. unsigned RD0:1;
6. unsigned RD1:1; Utilización en
7. unsigned RD2:1; un programa
8. unsigned RD3:1; Manejo como 8
9. unsigned RD4:1; 1. #include <p18f452.h>
señales digitales 2.
10. unsigned RD5:1;
11. unsigned RD6:1; 3. int main ()
12. unsigned RD7:1; 4. {
13. }; 5. int x;
14. struct 6. PORTDbits.RD0 = 1;
15. { 7. x = PORTDbits.RD2;
16. unsigned AD0:1; 8. }
17. unsigned AD1:1;
18. unsigned AD2:1;
19. unsigned AD3:1; Manejo como 8
20. unsigned AD4:1;
entradas analógicas
21. unsigned AD5:1;
22. unsigned AD6:1;
23. unsigned AD7:1;
24. };
25. } PORTDbits ;

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

Incluir código en ensamblador

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

1. #include <p18f452.h>
2.
3.
4. int main ()
5. {
6. Instrucciones
7. _asm
8. NOP
9. _endasm
10. Instrucciones
11. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 41

Rutinas de atención a interrupciones

Creación de una nueva sección


1. #include <p18f452.h> de código a partir de la dirección
2. 0x18 denominada bajaPrioridad
3. #pragma code bajaPrioridad = 0x18
4.
5. void saltoBajaPrioridad (void)
6. {
7. _asm
8. GOTO rutinaBajaPrioridad Instrucción insertada en la
9. _endasm dirección 0x18
10. }
11.
12. #pragma code Cerrar sección bajaPrioridad
13. y abrir sección normal de código
14. #pragma interruptlow rutinaBajaPrioridad
15. void rutinaBajaPrioridad (void) Rutina que atiende a la
16. { interrupción
17. Código que atiende a la interrupción
18. }

#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 42

Ejemplo: interrupciones mediante temporizador TMR0

1. #include <p18f452.h>
2.
3. // Definición de la función rutinaInterrupción que va a atender interrupciones
4. #pragma interrupt rutinaInterrupcion
5. void rutinaInterrupcion ()
6. {
7. if (INTCONbits.TMR0IF) // Si la interrupción la produjo TMR0
8. {
9. INTCONbits.TMR0IF = 0; // Poner a 0 ese indicador
10. PORTBbits.PORTB0 = ! PORTBbits.PORTB0; // Cambia la salida 0 del puerto B
11. }
12. }
13.
14. #pragma code seccionAltaPrioridad = 0x08 // Abre una sección de código en 0x08
15. void rutinaAltaPrioridad (void)
16. {
17. _asm
18. GOTO rutinaInterrupcion // Salto a la rutina que atiende a las
19. // interrupciones de alta prioridad
20. _endasm
21. }
22.
23. #pragma code // Vuelve a la sección de código normal
24.

Continúa
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, pero
29. // deshabilitándolas globalmente
30.
31. INTCON2 = 0x84; // La configura como interrupción de alta prioridad
32.
33. RCONbits.IPEN = 1; // Habilita interrupciones de diferentes prioridades
34.
35. TMR0H = 0; TMR0L = 0; // Pone temporizador a cero
36.
37. T0CON = 0x82; // Configura a TMR0 como temporizador con contaje ascendente
38. // de 16 bits, frecuencia de incremento = reloj/8 y lo activa,
39. // genera una interrupción a cada transición 0xFFFF->0x0000
40.
41. INTCONbits.GIEH = 1; // Habilita interrupciones globalmente
42.
43. TRISB = 0; // Señales del puerto B configuradas como salidas
44.
45. while (1); // Bucle infinito vacío
46. }

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


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

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


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

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

Situar datos en direcciones específicas


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

1. #include <p18f452.h>
2.
3. #pragma udata zona1 = 0x100;
4. // Define una nueva sección en la memoria de datos que comienza
5. // en la dirección 0x100. A esta nueva sección se le asigna
6. // el identificador zona1
7.
8. int x, y, z;
9. // Dentro de esta sección se declaran las variables x, y, z que se
10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente
11.
12. #pragma idata zona2 = 0x200;
13. // Sección zona2 de datos inicializados a partir de 0x200
14.
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 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. #include <p18f452.h>
2.
3. #pragma udata overlay seccionCompartida1 = 0x100;
4. // Define una nueva sección en la memoria de datos que comienza
5. // 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 se
10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente
11.
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

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

Visualizadores de 7 segmentos

abcdefg Ver
1111110 0
0110000 1
1101101 2
1111001 3
0110011 4
1011011 5
1011111 6
1110000 7
1111111 8 Cátodo común
1111011 9
1110111 A
0011111 b
Ánodo común
1001110 C
0111101 d
1001111 E
1000111 F
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:

Número de línea Señal Significado


1 Vss Masa
2 Vdd Alimentación +5Vdc para circuitos lógicos
3 Vc Alimentación para la pantalla
4 RS Transmisión de texto (RS=1) o transmisitón de instrucción (RS=0)
5 R/W Operación de lectura (R/W=1) o escritura (R/W=0)
6 E Pulso a nivel alto para realizar la transferencia
7-14 DB0-DB7 Bus de datos

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

Configuración del bus de datos

8 bits 4 bits
µC LCD µC LCD
DB0 DB0
DB1 DB1
DB2 DB2
DB3 DB3
DB4 RD0 DB4
DB5 RD1 DB5
DB6 RD2 DB6
DB7 RD3 DB7

E RA1 E
R/W RA2 R/W
RS RA3 RS

DB0-DB7 dato DB4-DB7 bits 4-7 bits 0-3

R/W R/W

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

Envío de instrucciones con bus de 4 bits

1. #include <p18f452.h>
2.
3. // Macros para dar nombre a las líneas del puerto PORTB utilizadas
4. #define E_LCD PORTAbits.RA1
5. #define RW_LCD PORTAbits.RA2
6. #define RS_LCD PORTAbits.RA3
7.
8.
9. void instruccionLCD (unsigned char instruccion)
10. // Envía al LCD la instrucción codificada en el parámetro
11.
12. {
13. RS_LCD = 0; // Se va a enviar una instrucción
14. RW_LCD = 0; // En una operación de escritura
15. PORTD &= 0xF0; // Pone a cero los 4 bits menos significativos de PORTD
16. PORTD |= instruccion >> 4; // Pone en PORTD(0-3) los 4 bits más significativos
17. E_LCD = 1;
18. E_LCD = 0; // Pulso de activación de transferencia
19. PORTD &= 0xF0;
20. PORTD |= instruccion & 0x0F; // Pone en PORTD(0-3) los 4 bits menos significativos
21. E_LCD = 1;
22. E_LCD = 0; // Otro pulso de transferencia
23. }

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

Juego de instrucciones de una pantalla LCD

Bus de datos en dos transferencias de 4 bits DB4-DB7


Instrucción RS R/W
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Borrar pantalla 0 0 0 0 0 0 0 0 0 1
Cursor a origen 0 0 0 0 0 0 0 0 1 *
Modo introducción 0 0 0 0 0 0 0 1 I/D S
Activación pantalla 0 0 0 0 0 0 1 D C B
Desplazamiento 0 0 0 0 0 1 S/C R/L * *
Función 0 0 0 0 1 DL N F * *
Dirección CGRAM 0 0 0 1 Dirección CGRAM
Dirección DDRAM 0 0 1 Dirección DDRAM
Lee estado 0 1 BF Dirección DDRAM
Escritura en RAM 1 0 Dato
Lectura en RAM 1 1 Dato
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 55

Bit Significado
I/D Decrementa (0) o incrementa (1) la posición del cursor con cada escritura
S Sin desplazamiento (0) o con desplazamiento (1)
D Pantalla apagada (0) o en funcionamiento (1)
C Cursor invisible (0) o visible (1)
B Cursor fijo (0) o con parpadeo (1)
S/C Se desplaza el cursor (0) o toda la información (1) con cada escritura
R/L Desplazamiento a la izquierda (0) o a la derecha (1)
DL Bus de 4 bits (0) o de 8 bits (1)
N LCD de una fila (0) o de más filas (1)
F Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1)
BF La pantalla está ocupada (1) o puede aceptar otra instrucción (0)

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

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

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

Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 61

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

Conversión analógico/digital mediante consulta

1. #include <p18f452.h>
2.
3. void main (void)
4.
5. {
6. float resultado; // Para recoger la medida expresada en voltios
7.
8. TRISAbits.TRISA0 = 1;
9. // El bit menos significativo del puerto RA es una línea de entrada
10.
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 oscilador
14.
15. ADCON1 = 0x8E;
16. // El resultado de la conversión se sitúa en los 10 bits menos significativos
17. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN0
18.
19. while (1) // Ejecutar contínuamente ...
20. {
21. ADCON0bits.GO_DONE = 1; // Solicita una conversión
22. while (ADCON0bits.GO_DONE); // Espera mientras no finalice
23.
24. resultado = (float) ADRES * 5 / 1024;
25. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor
26. // de 10 bits de resolución
27.
28. Utilizar el resultado de la conversión
29. }
30. }
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 voltios
4. int finConversion; // Booleano cierto si terminó la conversión
5.
6.
7. #pragma interrupt interrupcionConversionAD
8. void interrupcionConversionAD (void)
9. // Rutina que atiende a la interrupción producida cuando finaliza una
10. // conversión A/D
11.
12. {
13. resultado = (float) ADRES * 5 / 1024;
14. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor
15. // de 10 bits de resolución
16.
17. finConversion = 1;
18. // Indica que ya se dispone de la medida
19.
20. PIR1bits. ADIF = 0;
21. // Hay que poner a cero el aviso de interrupción
22. }
23.
24.
25. #pragma code interruption = 0x8
26. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias
27. {
28. _asm
29. GOTO interrupcionConversionAD
30. _endasm
31. }

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 normal


33.
34.
35. void main (void)
36.
37. {
38. TRISAbits.TRISA0 = 1;
39. // El bit menos significativo del puerto RA es una línea de entrada
40.
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 oscilador
44.
45. ADCON1 = 0x8E;
46. // El resultado de la conversión se sitúa en los 10 bits menos significativos
47. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN0
48.
49. IPR1bits.ADIP = 1; // Interrupciones de fin de conversión son de alta prioridad
50. PIE1bits.ADIE = 1; // Permite interrupciones por conversión A/D
51. INTCONbits.GIEH = 1; // Permite interrupciones de alta prioridad
52. RCONbits.IPEN = 1; // Distingue entre interrupciones de alta y baja prioridad
53.
54. while (1) // Ejecutar contínuamente ...
55. {
56. finConversion = 0; // Prepara a este booleano
57. ADCON0bits. GO_DONE = 1; // Solicita una conversión
58. while (! finConversion); // Espera mientras no finalice
59.
60. Utilizar resultado de conversión
61. }
62. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 65

Unidad de captura

Temporizador 3
Interrupción

Entrada
Captura

Selección de
temporizador Temporizador 1
Selección de
flanco

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

Ejemplo
Programa que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de
tiempo entre dos flancos ascendentes en la línea RC2/CCP1

1. #include <p18f452.h>
2.
3. unsigned int duracion;
4. // Tiempo transcurrido entre dos flancos ascendentes de la línea RC2/CCP1
5.
6.
7. #pragma interrupt interrupcionComparacion
8. void interrupcionComparacion (void)
9. // Rutina que atiende a la interrupción producida cuando se detecta un flanco
10. // ascendente en RC2/CCP1
11.
12. {
13. unsigned static int anterior;
14. // Recuerda el instante en el que se detectó el último flanco ascendente
15.
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 anterior
19. anterior = CCPR1; // Recuerda este instante para la siguiente vez
20. }
21.
22. PIR1bits. CCP1IF = 0;
23. // Hay que poner a cero el aviso de interrupción
24. }

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

25. #pragma code interruption = 0x8


26. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias
27. {
28. _asm
29. GOTO interrupcionComparacion
30. _endasm
31. }
32.
33. #pragma code // Vuelta a la sección de código normal
34.
35. void main (void)
36.
37. {
38. TRSCbits. TRISC2 = 1; // Configura la línea RC2/CCP1 como entrada
39.
40. // Configuración de TIMER1:
41. T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits
42. T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operación de 1/8
43. T1CONbits. T1CKPS0 = 1;
44. T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno
45. T1CONbits. T1SYNC = 1; // Sin sincronización con señal externa
46. T1CONbits. TMR1ON = 1; // Activa TIMER1
47.
48. T3CONbits. T3CCP2 = 0; // La unidad de captura de la línea CCP1 utiliza TIMER1
49.
50. CCP1CON = 0x05; // La captura se realiza en los flancos ascendentes
51.
52. PIE1bits. CCP1IE = 1; // Habilita interrupciones de captura en CCP1
53. RCONbits. IPEN = 1; // Habilita interrupciones prioritarias
54. INTCONbits. GIE = 1; // Habilitación global de interrupciones
55.
56. while (1); // Bucle indefinido de espera
57. }

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


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

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


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

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

Tarjetas magnéticas

- Codificación estandarizada:
- Pista 2: número de tarjeta y fecha de caducidad, según ISO 7811/2-1985.

- Lectores de tarjetas: salida de información en serie. Ejemplo:


- Señal CLD: activa a nivel bajo mientras se efectúa una lectura.
- Señal RCL: cuando está a nivel bajo, en RDT hay una señal válida.
- Señal RDT: salida de información con lógica inversa.

CLD

RCL

RDT 1 1 0 1 0

Paridad impar: 0
Dígitos de 4 bits: 10112

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

SS PAN FS CC ED Más dígitos ... ES LRC

SS (Start Sentinel): delimitador de comienzo, valor 10112.

PAN (Primary Account Number): número de tarjeta, hasta 19 dígitos.

FS (Field Separator): separador de campos, valor 11012.

CC (Country Code): código de país, 3 dígitos

ED (Expiration Date): fecha de caducidad, 4 dígitos

ES (End Sentinel): delimitador de final de lectura, valor 11112.

LRC (Longitudinal Redundancy Check): para comprobación de errores, o-exclusiva de todo lo leído,
desde SS hasta ES.

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

Lectores fotoeléctricos

Superficie
clara

Fotodiodo Fototransistor

CNY70

4K7
Vcc Salida
220

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

Codificadores incrementales rotativos (rotary encoders)

Fotodiodo Disco
LEDs

Eje

Rodamientos

Disco codificado

Inserción sellada

Cable

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


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

Células fotoeléctricas

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

Reflexión mediante catadióptrico:


- Hasta 3 m.
- Fácil instalación.

Reflexión difusa:
- Hasta 30 cm.
- Sensible al color y tipo de superficie.

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

Canal A A

PIC18F452

Canal B B

Cambio de sentido
A

RA4/T0CKI

RC0/T1CKI
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 en
13. // entrada T1CKI
14.
15. ...
16.
17. timer0 = TMRL0; // Primero hay que leer la parte baja
18. timer0 |= TMRH0 << 8; // y luego hay que combinarla con la parte alta
19. 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 sentidos
24. }

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 xor B

1. unsigned long posicion = 0; // Posición del encóder


2. #define A PORTBbits.RB0 // El canal A conectado a RB0
3. #define B PORTBbits.RB1 // El canal B conectado a RB1
4.
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-exclusiva
13. if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++;
14. else posicion --; // actualiza la posición
15. }
16. else primera = 0; // La siguiente ya no es la primera interrupción
17. Aanterior = A; // Recuerda el estado anterior en el canal A
18. Banterior = B; // Lo mismo para el canal B
19. }
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 anchas
que las demás.

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

- Se pueden codificar cadenas compuestas por caracteres 0123456789ABCDEFGHIJKLMNOPQRS


TUVWXYZ-.$/+% y espacio en blanco.

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

- Ejemplo, para codificar la cadena PO-2537:

* P O - 2 5 3 7 G *

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

Carácter Patrón de barras Codificación Carácter Patrón de barras Codificación


1 ŰŰ Ű Ű Ű ŰŰ 1101 0010 1011 M ŰŰ ŰŰ Ű Ű Ű 1101 1010 1001
2 Ű ŰŰ Ű Ű ŰŰ 1011 0010 1011 N Ű Ű ŰŰ Ű ŰŰ 1010 1101 0011
3 ŰŰ ŰŰ Ű Ű Ű 1101 1001 0101 O ŰŰ Ű ŰŰ Ű Ű 1101 0110 1001
4 Ű Ű ŰŰ Ű ŰŰ 1010 0110 1011 P Ű ŰŰ ŰŰ Ű Ű 1011 0110 1001
5 ŰŰ Ű ŰŰ Ű Ű 1101 0011 0101 Q Ű Ű Ű ŰŰ ŰŰ 1010 1011 0011
6 Ű ŰŰ ŰŰ Ű Ű 1011 0011 0101 R ŰŰ Ű Ű ŰŰ Ű 1101 0101 1001
7 Ű Ű Ű ŰŰ ŰŰ 1010 0101 1011 S Ű ŰŰ Ű ŰŰ Ű 1011 0101 1001
8 ŰŰ Ű Ű ŰŰ Ű 1101 0010 1101 T Ű Ű ŰŰ ŰŰ Ű 1010 1101 1001
9 Ű ŰŰ Ű ŰŰ Ű 1011 0010 1101 U ŰŰ Ű Ű Ű ŰŰ 1100 1010 1011
0 Ű Ű ŰŰ ŰŰ Ű 1010 0110 1101 V Ű ŰŰ Ű Ű ŰŰ 1001 1010 1011
A ŰŰ Ű Ű Ű ŰŰ 1101 0100 1011 W ŰŰ ŰŰ Ű Ű Ű 1100 1101 0101
B Ű ŰŰ Ű Ű ŰŰ 1011 0100 1011 X Ű Ű ŰŰ Ű ŰŰ 1001 0110 1011
C ŰŰ ŰŰ Ű Ű Ű 1101 1010 0101 Y ŰŰ Ű ŰŰ Ű Ű 1100 1011 0101
D Ű Ű ŰŰ Ű ŰŰ 1010 1100 1011 Z Ű ŰŰ ŰŰ Ű Ű 1001 1011 0101
E ŰŰ Ű ŰŰ Ű Ű 1101 0110 0101 - Ű Ű Ű ŰŰ ŰŰ 1001 0101 1011
F Ű ŰŰ ŰŰ Ű Ű 1011 0110 0101 . ŰŰ Ű Ű ŰŰ Ű 1100 1010 1101
G Ű Ű Ű ŰŰ ŰŰ 1010 1001 1011 Espacio Ű ŰŰ Ű ŰŰ Ű 1001 1010 1101
H ŰŰ Ű Ű ŰŰ Ű 1101 0100 1101 * Ű Ű ŰŰ ŰŰ Ű 1001 0110 1101
I Ű ŰŰ Ű ŰŰ Ű 1011 0100 1101 $ Ű Ű Ű Ű Ű 1001 0010 1001
J Ű Ű ŰŰ ŰŰ Ű 1010 1100 1101 / Ű Ű Ű Ű Ű 1001 0010 1001
K ŰŰ Ű Ű Ű ŰŰ 1101 0101 0011 + Ű Ű Ű Ű Ű 1001 0100 1001
L Ű ŰŰ Ű Ű ŰŰ 1011 0101 0011 % Ű Ű Ű Ű Ű 1010 0100 1001
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 83

Carácter Valor Carácter Valor


1 1 M 22
Checksum final
2 2 N 23
- Suma de todos los dígitos módulo 43 3 3 O 24
4 4 P 25
- Ejemplo: para PO-2537:
5 5 Q 26
P = 25 6 6 R 27
O = 24
- = 36 7 7 S 28
2 = 2 8 8 T 29
5 = 5
3 = 3 9 9 U 30
7 = 7 + 0 0 V 31
102
A 10 W 32
Resto de la división 102/43 = 16 B 11 X 33
C 12 Y 34
Checksum = carácter G
D 13 Z 35
E 14 - 36
F 15 . 37
G 16 Espacio 38
H 17 *
I 18 $ 39
J 19 / 40
K 20 + 41
L 21 % 42

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


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

Transmisión serie asíncrona

Bit de
Período de
comienzo
Instantes de escritura reposo

T T T T T T T T T

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

T+ T T T T T T T T
2
Instantes de lectura

Instante de Instante de
sincronización sincronización

- Bits transmitidos por byte: normalmente 7 u 8.


- Bit de paridad: par, impar, ninguna.
- Período de reposo (stop bits): 1, 1.5, 2
- Velocidad de transmisión: 1/T en bits/s. (baud)

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

RS 485
Half-duplex

RS 422

Maestro Full-duplex

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

Protocolos maestro/esclavo

Maestro 0 Orden dirigida al esclavo 2

Respuesta
Esclavo 1 Esclavo 2 Esclavo 3

Sincronización del diálogo

Orden Respuesta Otra orden


2 0 0 2 3 0

Dirección origen Tiempo mínimo


Dirección destino entre ciclos
orden/respuesta

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
Temperatura

Consigna

Sensor

Tiempo
Período de
autoajuste
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 89

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

Sensor de
humedad

Humidificador

Alimentación Salida
220 VAC Alarma

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

Control on/off

Histéresis
Actuación
Zona muerta
Dead band

ON
Zona de Zona de
calentamiento enfriamiento
OFF

Punto de consigna
Set point
Temperatura
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 91

Configuración de parámetros de comunicación

Número 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 Informática Industrial 2004-2005 Sistemas embebidos 92

Protocolo de comunicación: operación de escritura


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

Dirección Parámetro
destino a modificar XOR

Orden
Maestro esclavo @ 0 9 2 0 1 3 0 0 0 7 9 * Cr

Comienzo
Operación Valor Fin orden
de escritura

Dirección Parámetro
origen modificado Valor Fin respuesta

Respuesta
Esclavo maestro @ 0 9 2 0 1 0 0 3 0 0 0 7 9 * Cr

Comienzo
Operación Operación XOR
de escritura correcta
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 93

Cálculo de la XOR

Carácter ASCII ASCII ASCII


Decimal Hexadecimal Binario
@ 64 40 0001 0000
0 48 30 0011 0000
9 57 39 0011 1001
2 50 32 0011 0010
0 48 30 0011 0000
1 49 31 0011 0001
3 51 33 0011 0011
0 48 30 0011 0000
0 48 30 0011 0000
0 48 30 0011 0000
XOR = 121 79 0111 1001

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

Protocolo de comunicación: operación de lectura


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

Nodo Parámetro
destino a leer XOR

Orden
Maestro esclavo @ 0 9 1 0 1 0 0 0 0 7 9 * Cr

Comienzo
Operación Valor Fin orden
de lectura No se utiliza

Nodo Parámetro
origen leído Valor Fin respuesta

Respuesta
Esclavo maestro @ 0 9 1 0 1 0 0 2 0 0 0 7 A * Cr

Comienzo
Operación Operación XOR
de lectura correcta
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 95

Protocolo XON/XOFF

- Quien recibe información solicita a quien le la envía que detenga temporalmente la transmisión,
enviándole el carácter XOFF (código ASCII 17).

- Quien recibe información le indica al transmisor que puede continuar mediante el carácter XON
(código ASCII 19).

- En comunicaciones manejadas mediante interrupción suelen utilizarse colas circulares:


1. typedef struct
2. {
3. char datos [1000];
4. unsigned carga, descarga, cargados;
5. } COLA;
6. // Cola circular donde almacenar hasta 1000 caracteres, disponiendo de una
7. // posición de carga, de descarga y contabilizando el número de caracteres
8. // cargados
9.
10. COLA ColaRecepcion, ColaTransmision;
11. // Colas circulares independientes para los datos recibidos y a transmitir
12.
13. unsigned char * pCanal;
14. // Se supone que los caracteres que se reciben o se transmiten se guardan
15. // o se leen de un registro mapeado en memoria en la dirección apuntada por
16. // este puntero
17.
18. int XOFFRecibido, XOFFEnviado;
19. // Booleanos que indican si se ha transmitido el carácter XOFF y si a su vez
20. // se ha recibido

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 curso
23.
24. #define XON 17
25. #define XOFF 19
26. // Macroinstrucciones para representar a los códigos ASCII de los caracteres
27. // XON y XOFF
28.
29.
30. void interrupt IRecibe ()
31. // Rutina que atiende a la interrupción que se produce cuando se recibe un
32. // nuevo carácter
33.
34. {
35. char recibido;
36.
37. recibido = * pCanal;
38. // Recoge el carácter recibido
39.
40. if (recibido == XOFF) XOFFRecibido = 1;
41. // Si se ha recibido un XOFF, indicarlo en este booleano
42.
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 la
48. // cola de envío, extraer un carácter de esa cola y enviarlo
49.
50. XOFFRecibido = 0;
51. // Indica que ya podemos transmitir caracteres
52. }
53.

Continúa
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 XOFF
60. XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF
61. }
62.
63. carga (recibido, & ColaRecepcion);
64. // En cualquier caso carga en la cola de recepción el carácter recibido
65. }
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 anteriormente
72.
73. {
74. if (ColaTransmision. cargados == 0) Transmitiendo = 0;
75. // Si la cola de transmisión está vacía, no hay que enviar nada más
76.
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, entonces
80. // recoger un carácter de la misma y provocar su envío
81. }
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 XON
94. XOFFEnviado = 0; // Indica que se ha anulado el anterior envío de XOFF
95. }
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 misma
99. else return 0; // Si no, devuelve un 0
100. }
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ón
106.
107. {
108. if (! Transmitiendo) // Si en este momento no hay transmisión en curso ...
109. {
110. * pCanal = dato; // Envía el carácter
111. Transmitiendo = 1; // Indica que hay una transmisión en curso
112. }
113. else carga (& ColaTransmision, dato); // Si no, cárgalo en la cola
114. }
115.

Continúa
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 la
122. // 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ón
127.
128. Instala (IRecibe, 3);
129. Instala (IEnvia, 4);
130. // Instala las rutinas para atender a las interrupciones
131.
132. Utiliza las funciones EnviaCola y RecibeCola para manejar el canal
133.
134. }

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

X1 X2 X3 X4 X5 X6 X7 X8
X0 D Q D Q D Q D Q D Q D Q D Q D Q
- Ejemplo: CRC-8
G G G G G G G G

Disparo para
desplazamientos
Entrada
de bits
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 101

CRC-8 en lenguaje C

1. unsigned char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Información a procesar


2. unsigned n = 4; // Número de bytes en la matriz m
3. unsigned i, j; // Contadores para bucles
4. unsigned char CRC8 = 0; // Variable donde se va a calcular el CRC-8
5. 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 procesar
11. 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ón
16. CRC8 >>= 1; // Desplaza todos los biestables
17. CRC8 |= 0x80; // Añade un 1 en el biestable más significativo
18. }
19. else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC
20. auxiliar >>= 1; // Continúa con el siguiente bit
21. }
22. }

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


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

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

Velocidad de transmisión
- Registro SPBRG

- Si bit BRGH = 1, entonces


velocidad = Foscilador / (16 * (SPBRG + 1))

- Si bit BRGH = 0, entonces


velocidad = Foscilador / (64 * (SPBRG + 1))
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 105

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

Habilita Overrun error


receptor 0 para Habilita Selección de Error de saturación
modo detección velocidad del receptor
asíncrono de dirección Framing error
Error de trama de bits

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

Configuración de la transmisión
Habilita
Habilita interrupciones Flag interrupción
interrupciones baja prioridad Habilita interrupción
por transmisión por transmisión
alta prioridad
Prioridad de interrupción
por transmisión
Permite Registro bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
interrupciones
de diferentes INTCON GIEH GIEL
prioridades RCON IPEN
PIR1 TXIF
Habilita
comunicación PIE1 TXIE
IPR1 TXIP
RCSTA SPEN
TXREG Dato a transmitir Bit 9 a
transmitir
TXTA TX9 TXEN SYNC BRGH TRMT TX9D
SPBRG Velocidad de comunicación
Habilita
bit 9
Habilita
transmisor 0 para Selección de 1 cuando finalizó
modo velocidad la serialización
asíncrono
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 107

Recepción y envío por consulta


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 programa
6.
7. void enviaCaracter (char caracter)
8. // Envio de un carácter por consulta
9. {
10. while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carácter
11. TXREG = caracter; // Suministra el carácter para serializarlo
12. }
13.
14. char recibeCaracter (void)
15. // Recepción de un carácter por consulta
16. {
17. while (! PIR1bits. RCIF); // Espera mientras no se na recibido nada
18. PIR1bits. RCIF = 0; // Este flag hay que ponerlo a cero en el programa
19. return RCREG; // Devuelve el carácter recibido
20. }
21.
22. void inicializaCanalConsulta ()
23. // Inicializa el canal serie para recepción/transmisión por consulta
24. {
25. TRISCbits. TRISC6 = 0; // Línea de transmisión en RC6 como salida
26. TRISCbits. TRISC7 = 1; // Línea de recepción en RC7 como entrada
27. SPBRG = 25; // Con un reloj de 4 MHz fija una velocidad de 9600 baud
28. TXSTA = 0x24; // 8 bits y sin paridad, habilita transmisor
29. RCSTA = 0x90; // Habilita receptor
30. }
31.

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 ROM
34. {
35. rom char * p;
36. p = cadena; // Apunta al primer carácter
37. while (* p) // Mientras no se haya llegado al final de la cadena ...
38. {
39. enviaCaracter (* p); // Envía un carácter
40. p ++; // Para enviar luego el siguiente
41. }
42. }
43.
44.
45. void main (void)
46.
47. {
48. char caracter;
49.
50. inicializaCanalConsulta (); // Inicializa los parámetros del canal
51. enviaCadenaROM (mensaje); // Envía ese mensaje
52. while (1) // Repite contínuamente ...
53. {
54. caracter = recibeCaracter (); // Espera a recibir un carácter y recógelo
55. enviaCaracter (caracter); // Lo envía por el mismo canal
56. }
57. }

You might also like