Microcontrolador Microchip PIC18F452

Transcripción

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

Documentos relacionados