Sie sind auf Seite 1von 54

Microcontrolador Microchip PIC18F452

- Arquitectura RISC (Reduced Instruction Set Computer).


- Juego de instrucciones reducido para ejecucin rpida.
- Oscilador hasta 40 MHz 10 MIPs (Million Instructions Per second).
- Optimizado para compilacin desde lenguaje C.
- Micro de 8 bits.
- Arquitectura de memoria Hardvard:
- memoria interna de programa FLASH de 32 Kb
- memoria interna RAM de 1536 bytes
- memoria interna EEPROM de 256 bytes
- contador de programa de 21 bits hasta 2 Mb de memoria de programa
- direccionamiento de 12 bits en memoria de datos 4Kb
- Perifricos integrados:
- temporizadores, contadores, comparadores, unidades de captura
- modulacin en ancho de pulso PWM (Pulse Width Modulation)
- interrupciones internas y externas
- canal serie USART (Universal Synchronous/Asnynchronous Serial Receiver/Transmiter)
- canal serie SPI (Serial Peripheral Interface)
- canal serie I
2
C (Inter-Integrated Circuit)
- puerto paralelo esclavo PSP (Parallel Slave Port)
- conversin A/D de 10 bits
- perro guardin WDT (Watchdog Timer).
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 1
Encapsulados
PIC18F452:
DIP
PLCC
QFN (Quad Flat No lead)
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 2
Operaciones simultneas de lectura y ejecucin 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 Informtica Industrial 2004-2005 Sistemas embebidos 3
Mapa de memoria de datos
Memoria de propsito general
GPR (General Purpose Registers)
Registros de configuracin y operacin
SFR (Special Function Registers)
Bancos de memoria de 256 bytes
Registro de seleccin de banco
BSR (Bank Select Register)
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 4
SFRs
- Direcciones
0xF80 a 0xFFF
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 5
Microchip MPLAB C18
Entorno de programacin MPLAB IDE
- Gratuito, descargable desde http://www.microchip.com
- IDE (Integrated Development Environment) para Windows.
- Ensamblador, enlazador, gestin de proyectos, depurador, simulador.
Compilador MPLAB C18
- Compilador cruzado de lenguaje C para la serie de microcontroladores Microchip PIC 18.
- Sigue la norma ANSI C X3.159-1989, salvo en particularizaciones para este microcontrolador.
- Se integra en el entorno MPLAB IDE.
- Bibliotecas de rutinas para PWM, canales SPI, I2C, UART, USART, cadenas de caracteres y
funciones matemticas en punto flotante.
- Almacenamiento de variables multibyte de tipo little-endian.
- Nmeros reales float y double de 32 bits.
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 6
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 7
Sistema de desarrollo Microchip MPLAB ICD 2
- Entorno de programacin y depuracin en tiempo real para microcontroladores Microchip PIC.
- Conexin USB o RS 232 con el computador de desarrollo, en el que se utiliza MPLAB IDE
(gratuito http://www.microchip.com).
- Manejo del microcontrolador real mediante lneas dedicadas.
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 8
Placa de desarrollo Microchip PICDEM 2 PLUS
1: Soporte para microcontroladores PIC de 18, 28 y 40 patillas.
2: Alimentacin de 9V (adaptador externo o pila) y regulador para 5V 100mA.
3: Conector RS 232 y driver MAX232.
4: Conexin al depurador MPLAB IDC 2.
5: Potencimetro para simulacin de entrada analgica.
6, 8: Tres pulsadores (entradas) y 4 LEDs (salidas).
14: Memoria EEPROM serie externa 24L256 de 256K x 8
15: Pantalla de cristal lquido LCD
16: Zumbador
17: rea de prototipos
18: Sensor de temperatura
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 9
Conexin al depurador y programador MPLAB IDC 2
USB al computador
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 10
PIC 18F452
Poten-
cimetro
EEPROM
Pulsador S2
Pulsador S1
Reset
Placa de desarrollo Microchip PICDEM 2 PLUS
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 11
Pantalla de cristal lquido
LEDs
Pulsador S3
Zumbador
Sensor de temperatura
Placa de desarrollo Microchip PICDEM 2 PLUS
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 12
RS 232
Placa de desarrollo Microchip PICDEM 2 PLUS
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 13
Compilador MPLAB C18 en entorno MPLAB IDE
Compilacin, enlazado
con MPLAB C18
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 14
1. #include <p18f452.h>
2.
3. int contador;
4.
5. void main ()
6. {
7. contador = 1;
8. TRISB = 0;
9. while (contador <= 15)
10. {
11. PORTB = contador;
12. contador ++;
13. }
14. }
Primer ejemplo con MPLAB C18
Contador utilizado para repetir el
bucle 15 veces
Configura todas las lneas del puerto B
como salidas digitales
A cada paso del bucle, las 8 lneas del
puerto B reflejan el estado del contador
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 15
Configuracin del sistema de desarrollo MPLAB IDE:
seleccin del microcontrolador
Configure Select device
- Soporte para la familia de
microcontroladores Microchip PIC18
- Configuracin del sistema de desarrollo,
con diferentes SFR (Special Function Registers)
y espacio de direccionamiento
- Soporte de herramientas de programacin y
depuracin.
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 16
Creacin de un nuevo proyecto:
Project New
Eleccin del compilador:
Project Select Language Toolsuite
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 17
Aadir un fichero fuente al proyecto:
File New
Editar y guardar en ejemplo.c
En la ventana de proyecto aadir:
- Fichero fuente ejemplo.c
- Script de enlazado:
18f452i.lkr para simulacin
18f452.lkr para MPLAB ICD2
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 18
Configuracin de subdirectorios de trabajo
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
Project Build options Project
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 19
Compilacin, enlazado y generacin de cdigo mquina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 20
1. #include <p18f452.h>
2. int contador;
3.
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 }
P1.lst: listado con cdigo mquina y cdigo ensamblador. Vista parcial:
Cdigo
mqina
Cdigo
ensamblador
Direccin
programa
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 21
1. :020000040000FA
2. :0600000089EF00F0120080
3. :02002A000000D4
4. :0C0044002A0EF66E000EF76E000EF86E2D
5. :1000500000010900F550856F0900F550866F03E136
6. :10006000856701D03DD00900F550806F0900F5503B
7. :10007000816F0900F550826F09000900F550E96EA3
8. :100080000900F550EA6E090009000900F550836F78
9. :100090000900F550846F09000900F6CF87F0F7CF0B
10. :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA
11. :1000B000F8FF0001835302E1845307E00900F55083
12. :1000C000EE6E8307F8E28407F9D787C0F6FF88C091
13. :1000D000F7FF89C0F8FF00018507000E865BBFD7D8
14. :0200E00012000C
15. :0E00E200010E00018A6F8B6B936A8B51000A2E
16. :1000F000E8AE02D08B3505D00F0ED8808A55000EA1
17. :100100008B5506E38AC081FF8A2B000E8B23EED726
18. :020110001200DB
19. :0E01120015EE00F025EE00F0F86A019CA68EB6
20. :0E012000A69C22EC00F071EC00F0FDD712005E
21. :00000001FF
P1.hex: cdigo mquina en formato Intel INHX32
0E 00E2 00 010E 0001 8A6F 8B6B 936A 8B51 000A 2E
Se
indican
14 bytes
Se
guardan
a partir de
00E2
Informacin a
almacenar
Suma de
comprobacin
0A
00
8B
51
93
6A
8B
6B
8A
6F
00
01
01
0E
00ED
00EC
00EB
00EA
00E9
00E8
00E7
00E6
00E5
00E4
00E3
00E2
Se indican
datos a
almacenar
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 22
Generacin de un mapa de memoria:
Project Build Options Project MPLINK Linker
Activar casilla
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 23
Mapa de memoria: generado en el fichero P1.map
1. PORTD 0x000f83 data extern C:\MCC18\SRC\PROC\p18f452.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
1. Program Memory Usage
2. Start End
3. --------- ---------
4. 0x000000 0x000005
5. 0x000044 0x00012d
6. 242 out of 33048 program addresses used
Memoria de programa utilizada:
Direccionamiento de algunos identificadores:
Comienzo ejecucin: GOTO 0x112
Cdigo de inicializacin
Bucle de ejecucin contnua:
LOOP:
main ()
GOTO LOOP
Cdigo del programa
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 24
Eleccin del depurador: Debugger Select Tool MPLAB SIM
MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardware
MPLAB SIM: simulador
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 25
Depuracin de programas: ejecucin de instrucciones
Punto de ruptura
Siguiente instruccin
a ejecutar
Run: ejecucin contnua del programa
Step Into: en una llamada a una funcin, detenerse al comienzo de la misma
Step Over: en una llamada a una funcin, ejecutarla completamente
Reset: comenzar de nuevo
Step Out: ejecutar el resto de la funcin
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 26
Particularidades de MPLAB C18: clase de almacenamiento overlay
1. int f ()
2. {
3. overlay int a = 3;
4. return a;
5. }
6.
7. int g ()
8. {
9. overlay int b = 7;
10. return b;
11. }
12.
13. int main ()
14. {
15. f ();
16. g ();
17. }
- Almacenamiento esttico
- Inicializacin en cada llamada
- Se comparte memoria en el caso de que no haya uso simultneo
- Ventaja: optimizacin de memoria, necesario en arquitecturas reducidas
Ejemplos:
a y b comparten memoria
1. int f ()
2. {
3. overlay int a = 3;
4. return a;
5. }
6.
7. int g ()
8. {
9. overlay int b = 7;
10. b = f ();
11. return b;
12. }
13.
14. int main ()
15. {
16. f ();
17. g ();
18. }
a y b se guardan en
posiciones diferentes:
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 27
Particularidades de MPLAB C18: parmetros static en funciones
- Almacenamiento esttico en lugar de pila
- Ventajas: cdigo ms pequeo y rpido
- No permite llamadas reentrantes
1. int doblePila (int x)
2. {
3. return 2 * x;
4. }
5.
6. int dobleEstatico (static int x)
7. {
8. return 2 * x;
9. }
Ejemplo:
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 28
Memoria de datos
Memoria interna organizada en bancos de 256 bytes
Tambin existe direccionamiento indexado, que permite manejar toda la memoria
RAM de forma lineal.
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 29
Banco de memoria especial:
Formado con los 128 primeros
bytes del banco 0 y los SFR
La memoria interna se reduce a este
banco cuando el bit a del cdigo
mquina est a 0
Ventaja: mayor rapidez de acceso
Ejemplo: copiar valor desde el acumulador
a la direccin dddd dddd con la etiqueta D
Ensamblador: MOVWF D, a
Mquina: 0110 111a dddd dddd
Caso particular:
MOVWF PORTB, 0
0110 1110 1000 0001
Universidade de Vigo - EUITI Informtica Industrial 2004-2005 Sistemas embebidos 30 Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 30
Soporte en MPLAB C18 para especificacin de banco en memoria de datos:
- Clase de almacenamiento far para variables que pueden residir en cualquier banco.
- Clase de almacenamiento near para variables que tienen que residir en el banco especial.
- Ejemplo:
1. far int f;
2.
3. int main ()
4. {
5. near int n;
6. f = 3;
7. n = 5;
8. }
1. MOVLB 0x0 ; BSR=0 para seleccionar
2. ; el banco 0
3. MOVLW 0x3 ; Carga 0x3 en acumulador
4. MOVWF 0x8A,0x1 ; Copia acumulador en 0x8A
5. ; seleccionando banco con BSR
6. CLRF 0x8B,0x1 ; Pone a cero la direccin
7. ; 0x8B, seleccionando banco
8. ; con BSR
Compilacin
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 31
Configuracin del modelo de memoria
Project

Build Options

Project

MPLAB C18

Categories

Memory Model
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 32
Mapa de memoria
de programa
Pila
Comienzo despus de
una inicializacin (reset)
Dos tipos de
interrupciones:
de alta y baja prioridad
Memoria de
programa interna
Posible memoria de
programa externa
Capacidad de direccionamiento
de hasta 2 Mb
Pila independiente:
- Hasta 31 direcciones de retorno
desde rutina o interrupcin
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 33
Datos en memoria de programa
- Memoria FLASH no voltil de lectura/escritura
- Mayor capacidad que la RAM. Almacenamiento de informacin constante o que no se va a modificar
frecuentemente.
- Se manejan mediante los SFR:
TBLPTRU (TaBLe PoinTeR Upper byte)
TBLPTRH (TaBLe PoinTeR High byte)
TBLPTRL (TaBLe PoinTeR Low byte)
TABLAT (program memory TABLe LAtch)
- Instrucciones TBLRD (TaBle ReaD) y TBLWT (TaBLe WriTe)
Direccin de memoria de programa
Dato a transferir
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 34
1. #include <p18f452.h>
2. rom far char f;
3. int main ()
4. {
5. f = 3;
6. }
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
Soporte en MPLAB C18 para datos en memoria de programa:
- Clase de almacenamiento rom para variables que residen en memoria de programa.
- Ejemplo:
Segn el fichero de mapa de memoria,
la variable f se almacena en la direccin 0x000112
TBLPTRU:TBLPTRH:TBLPTRL = 0x000112
Compilacin
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 35
Punteros a memoria de datos y de programa
- Incompatibles debido a que a puntan a diferentes tipos de memoria.
- Ejemplo:
1. #include <p18f452.h>
2. int x, * px;
3. rom int y, * py;
4. int main ()
5. {
6. px = & x;
7. py = & y;
8. px = py;
9. }
Error
Tamao de los punteros:
24 bits
rom far int * p;
Puntero far a memoria de programa
16 bits
rom near int * p;
Puntero near a memoria de programa
16 bits
int * p;
Puntero a memoria de datos
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 36
Informacin en memoria de programa
- Caso tpico: cadenas de caracteres constantes.
- Hay funciones para realizar trasvases RAM ROM
rom char * strcpypgm2pgm (auto rom char * destino,
auto const rom char * origen);
rom rom
rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen);
ram rom
char * strcpypgm2ram (auto char * destino, auto const rom char * origen);
rom ram
char * strcpy (auto char * destino, auto const char * origen);
ram ram
const: la cadena de caracteres origen no se modifica
auto: los parmetros de estas funciones se manejan en la pila
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 37
1. rom far const char cadenaROM [] = "Hola";
2. char cadenaRAM [20];
3.
4. strcpypgm2ram (cadenaRAM, cadenaROM);
Ejemplo
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 38
Configuracin del microcontrolador
- Los compiladores de lenguaje C utilizan la directiva #pragma para poder indicar informacin no
estandarizada al compilador.
- Ejemplos para la configuracin de un PIC en un programa compilado con MPLAB C18:
1. #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 guardin (WatchDog Timer)
6.
7. #pragma config LVP = OFF
8. // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming)
- Tambin se pueden establecer en el MPLAB IDE, bajo Configure Configuration bits ...
Ejemplo de unin: lneas del microcontrolador con varias funciones
1. union
2. {
3. struct
4. {
5. unsigned RD0:1;
6. unsigned RD1:1;
7. unsigned RD2:1;
8. unsigned RD3:1;
9. unsigned RD4:1;
10. unsigned RD5:1;
11. unsigned RD6:1;
12. unsigned RD7:1;
13. };
14. struct
15. {
16. unsigned AD0:1;
17. unsigned AD1:1;
18. unsigned AD2:1;
19. unsigned AD3:1;
20. unsigned AD4:1;
21. unsigned AD5:1;
22. unsigned AD6:1;
23. unsigned AD7:1;
24. };
25. } PORTDbits ;
Parte del fichero p18f452.h
Manejo como 8
seales digitales
Manejo como 8
entradas analgicas
1. #include <p18f452.h>
2.
3. int main ()
4. {
5. int x;
6. PORTDbits.RD0 = 1;
7. x = PORTDbits.RD2;
8. }
Utilizacin en
un programa
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 39
Incluir cdigo en ensamblador
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 Informtica Industrial 2004-2005 Sistemas embebidos 40
- Ejemplo: insertar un pequeo retardo mediante la ejecucin de la instruccin NOP
Rutinas de atencin a interrupciones
1. #include <p18f452.h>
2.
3. #pragma code bajaPrioridad = 0x18
4.
5. void saltoBajaPrioridad (void)
6. {
7. _asm
8. GOTO rutinaBajaPrioridad
9. _endasm
10. }
11.
12. #pragma code
13.
14. #pragma interruptlow rutinaBajaPrioridad
15. void rutinaBajaPrioridad (void)
16. {
17. Cdigo que atiende a la interrupcin
18. }
Creacin de una nueva seccin
de cdigo a partir de la direccin
0x18 denominada bajaPrioridad
Instruccin insertada en la
direccin 0x18
Cerrar seccin bajaPrioridad
y abrir seccin normal de cdigo
Rutina que atiende a la
interrupcin
#pragma code seccin=direccin Abre una seccin de cdigo
#pragma interruptlow Permite indicar cul es la rutina que atiende a las
interrupciones de baja prioridad
#pragma interrupt Permite indicar cul es la rutina que atiende a las
interrupciones de alta prioridad
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 41
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 42
1. #include <p18f452.h>
2.
3. // Definicin de la funcin rutinaInterrupcin que va a atender interrupciones
4. #pragma interrupt rutinaInterrupcion
5. void rutinaInterrupcion ()
6. {
7. if (INTCONbits.TMR0IF) // Si la interrupcin 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 seccin de cdigo 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 seccin de cdigo normal
24.
Ejemplo: interrupciones mediante temporizador TMR0
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 43
25. void main ()
26.
27. {
28. INTCON = 0x20; // Habilita interrupcin del temporizador 0, pero
29. // deshabilitndolas globalmente
30.
31. INTCON2 = 0x84; // La configura como interrupcin 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 interrupcin a cada transicin 0xFFFF->0x0000
40.
41. INTCONbits.GIEH = 1; // Habilita interrupciones globalmente
42.
43. TRISB = 0; // Seales del puerto B configuradas como salidas
44.
45. while (1); // Bucle infinito vaco
46. }
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 44
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 45
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 46
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 47
Situar datos en direcciones especficas
1. #include <p18f452.h>
2.
3. #pragma udata zona1 = 0x100;
4. // Define una nueva seccin en la memoria de datos que comienza
5. // en la direccin 0x100. A esta nueva seccin se le asigna
6. // el identificador zona1
7.
8. int x, y, z;
9. // Dentro de esta seccin 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. // Seccin 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 Informtica Industrial 2004-2005 Sistemas embebidos 48
- Secciones de dos tipos:
udata: variables estticas sin valor inicial
idata: variables estticas con valor inicial
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 49
Secciones que comparten memoria
1. #include <p18f452.h>
2.
3. #pragma udata overlay seccionCompartida1 = 0x100;
4. // Define una nueva seccin en la memoria de datos que comienza
5. // en la direccin 0x100. La memoria utilizada en esta seccin se
6. // puede compartir para otra seccin.
7.
8. int x, y, z;
9. // Dentro de esta seccin 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. // Seccin de datos almacenados a partir de 0x100
14.
15. long a, b;
16. // Variables a y b que se guardan a partir de 0x100 y 0x104
- Se pueden declarar varias secciones de datos en las mismas posiciones de memoria,
siempre y cuando no se utilicen simultaneamente.
- Se utiliza la palabra reservada overlay
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 50
Ctodo comn
nodo comn
Visualizadores de 7 segmentos
F 1000111
E 1001111
d 0111101
C 1001110
b 0011111
A 1110111
9 1111011
8 1111111
7 1110000
6 1011111
5 1011011
4 0110011
3 1111001
2 1101101
1 0110000
0 1111110
Ver abcdefg
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 51
Pantallas de cristal lquido (LCD, Lyquid Crystal Display) alfanumricas
- Configuraciones tpicas: 1, 2 o 4 filas y 16, 20 o 40 columnas.
- Bus de datos y de control:
DB0-DB7
E
R/W
RS
Vc
Vdd
Vss
Seal
Bus de datos 7-14
Pulso a nivel alto para realizar la transferencia 6
Operacin de lectura (R/W=1) o escritura (R/W=0) 5
Transmisin de texto (RS=1) o transmisitn de instruccin (RS=0) 4
Alimentacin para la pantalla 3
Alimentacin +5Vdc para circuitos lgicos 2
Masa 1
Significado Nmero de lnea
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 52
Configuracin del bus de datos
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
E
R/W
RS
C LCD
DB0-DB7
R/W
E
dato
C LCD
DB4-DB7
R/W
E
bits 4-7 bits 0-3
8 bits
4 bits
RD0
RD1
RD2
RD3
RA1
RA2
RA3
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
E
R/W
RS
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 53
1. #include <p18f452.h>
2.
3. // Macros para dar nombre a las lneas 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. // Enva al LCD la instruccin codificada en el parmetro
11.
12. {
13. RS_LCD = 0; // Se va a enviar una instruccin
14. RW_LCD = 0; // En una operacin 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 ms significativos
17. E_LCD = 1;
18. E_LCD = 0; // Pulso de activacin 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. }
Envo de instrucciones con bus de 4 bits
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 54
DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
*
*
C
I/D
1
0
*
*
B
S
*
1
Dato 1 1 Lectura en RAM
Dato 0 1 Escritura en RAM
Direccin DDRAM BF 1 0 Lee estado
Direccin DDRAM 1 0 0 Direccin DDRAM
Direccin CGRAM 1 0 0 0 Direccin CGRAM
F N DL 1 0 0 0 0 Funcin
R/L S/C 1 0 0 0 0 0 Desplazamiento
D 1 0 0 0 0 0 0 Activacin pantalla
1 0 0 0 0 0 0 0 Modo introduccin
0 0 0 0 0 0 0 0 Cursor a origen
0 0 0 0 0 0 0 0 Borrar pantalla
Bus de datos en dos transferencias de 4 bits DB4-DB7
R/W RS Instruccin
Juego de instrucciones de una pantalla LCD
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 55
Se desplaza el cursor (0) o toda la informacin (1) con cada escritura S/C
Bus de 4 bits (0) o de 8 bits (1) DL
LCD de una fila (0) o de ms filas (1) N
Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1) F
La pantalla est ocupada (1) o puede aceptar otra instruccin (0) BF
Desplazamiento a la izquierda (0) o a la derecha (1) R/L
Cursor fijo (0) o con parpadeo (1) B
Cursor invisible (0) o visible (1) C
Pantalla apagada (0) o en funcionamiento (1) D
Sin desplazamiento (0) o con desplazamiento (1) S
Decrementa (0) o incrementa (1) la posicin del cursor con cada escritura I/D
Significado Bit
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 56
Inicializacin
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 57
Conversin analgico/digital
- Ocho entradas analgicas de 10 bits de resolucin.
- Referencia de tensin interna o externa.
- Manejo por consulta o interrupcin.
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 58
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 59
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 60
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 61
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 62
Conversin analgico/digital mediante consulta
1. #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 lnea de entrada
10.
11. ADCON0 = 0x41;
12. // Activa el mdulo de conversin analgica, selecciona el canal 0 y
13. // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador
14.
15. ADCON1 = 0x8E;
16. // El resultado de la conversin se sita en los 10 bits menos significativos
17. // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0
18.
19. while (1) // Ejecutar contnuamente ...
20. {
21. ADCON0bits.GO_DONE = 1; // Solicita una conversin
22. while (ADCON0bits.GO_DONE); // Espera mientras no finalice
23.
24. resultado = (float) ADRES * 5 / 1024;
25. // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor
26. // de 10 bits de resolucin
27.
28. Utilizar el resultado de la conversin
29. }
30. }
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 63
Conversin analgico/digital mediante interrupcin
1. #include <p18f452.h>
2.
3. float resultado; // Para recoger la medida expresada en voltios
4. int finConversion; // Booleano cierto si termin la conversin
5.
6.
7. #pragma interrupt interrupcionConversionAD
8. void interrupcionConversionAD (void)
9. // Rutina que atiende a la interrupcin producida cuando finaliza una
10. // conversin A/D
11.
12. {
13. resultado = (float) ADRES * 5 / 1024;
14. // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor
15. // de 10 bits de resolucin
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 interrupcin
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. }
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 64
32. #pragma code // Vuelve a la seccin de cdigo normal
33.
34.
35. void main (void)
36.
37. {
38. TRISAbits.TRISA0 = 1;
39. // El bit menos significativo del puerto RA es una lnea de entrada
40.
41. ADCON0 = 0x41;
42. // Activa el mdulo de conversin analgica, selecciona el canal 0 y
43. // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador
44.
45. ADCON1 = 0x8E;
46. // El resultado de la conversin se sita en los 10 bits menos significativos
47. // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0
48.
49. IPR1bits.ADIP = 1; // Interrupciones de fin de conversin son de alta prioridad
50. PIE1bits.ADIE = 1; // Permite interrupciones por conversin 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 contnuamente ...
55. {
56. finConversion = 0; // Prepara a este booleano
57. ADCON0bits. GO_DONE = 1; // Solicita una conversin
58. while (! finConversion); // Espera mientras no finalice
59.
60. Utilizar resultado de conversin
61. }
62. }
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 65
Unidad de captura
Interrupcin
Seleccin de
flanco
Entrada
Seleccin de
temporizador
Temporizador 1
Temporizador 3
Captura
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 66
1. #include <p18f452.h>
2.
3. unsigned int duracion;
4. // Tiempo transcurrido entre dos flancos ascendentes de la lnea RC2/CCP1
5.
6.
7. #pragma interrupt interrupcionComparacion
8. void interrupcionComparacion (void)
9. // Rutina que atiende a la interrupcin 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 interrupcin 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 interrupcin
24. }
Ejemplo
Programa que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de
tiempo entre dos flancos ascendentes en la lnea RC2/CCP1
Contina
Universidade de Vigo EUITI Informtica 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 seccin de cdigo normal
34.
35. void main (void)
36.
37. {
38. TRSCbits. TRISC2 = 1; // Configura la lnea RC2/CCP1 como entrada
39.
40. // Configuracin 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 operacin de 1/8
43. T1CONbits. T1CKPS0 = 1;
44. T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno
45. T1CONbits. T1SYNC = 1; // Sin sincronizacin con seal externa
46. T1CONbits. TMR1ON = 1; // Activa TIMER1
47.
48. T3CONbits. T3CCP2 = 0; // La unidad de captura de la lnea 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; // Habilitacin global de interrupciones
55.
56. while (1); // Bucle indefinido de espera
57. }
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 68
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 69
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 70
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 71
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 72
Tarjetas magnticas
- Codificacin estandarizada:
- Pista 2: nmero de tarjeta y fecha de caducidad, segn ISO 7811/2-1985.
- Lectores de tarjetas: salida de informacin en serie. Ejemplo:
- Seal CLD: activa a nivel bajo mientras se efecta una lectura.
- Seal RCL: cuando est a nivel bajo, en RDT hay una seal vlida.
- Seal RDT: salida de informacin con lgica inversa.
CLD
RCL
RDT
1 1 1 0 0
Dgitos de 4 bits: 1011
2
Paridad impar: 0
Banda
magntica
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 73
SS PAN
SS (Start Sentinel): delimitador de comienzo, valor 1011
2
.
PAN (Primary Account Number): nmero de tarjeta, hasta 19 dgitos.
FS (Field Separator): separador de campos, valor 1101
2
.
CC (Country Code): cdigo de pas, 3 dgitos
ED (Expiration Date): fecha de caducidad, 4 dgitos
ES (End Sentinel): delimitador de final de lectura, valor 1111
2
.
LRC (Longitudinal Redundancy Check): para comprobacin de errores, o-exclusiva de todo lo ledo,
desde SS hasta ES.
FS CC ED ES LRC Ms dgitos ...
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 74
Fotodiodo Fototransistor
Superficie
clara
220
4K7
Vcc
GND
Salida
CNY70
Lectores fotoelctricos
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 75
Codificadores incrementales rotativos (rotary encoders)
Disco codificado
Insercin sellada
LEDs
Disco
Fotodiodo
Rodamientos
Eje
Cable
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 76
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 77
Emisor/receptor:
- Grandes distancias (20 m).
- Sensible a fallos de alineacin.
Reflexin mediante catadiptrico:
- Hasta 3 m.
- Fcil instalacin.
Reflexin difusa:
- Hasta 30 cm.
- Sensible al color y tipo de superficie.
Clulas fotoelctricas
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 78
Cambio de sentido
A
B
RA4/T0CKI
RC0/T1CKI
PIC18F452
Canal A
Canal B
A
B
Universidade de Vigo EUITI Informtica 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 posicin del encder como la diferencia entre el nmero de
23. // pulsos en uno y otro sentidos
24. }
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 80
Alternativa: puerto en el que se produce una interrupcin cuando cambia cualquier seal
A
B
A xor B
1. unsigned long posicion = 0; // Posicin del encder
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 interrupcin ...
11. {
12. xor = A ^ B; // Calcula a o-exclusiva
13. if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++;
14. else posicion --; // actualiza la posicin
15. }
16. else primera = 0; // La siguiente ya no es la primera interrupcin
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 Informtica Industrial 2004-2005 Sistemas embebidos 81
Cdigos de barras
- Ejemplo: formato Code 39 o "Cdigo 3 de 9".
- Cada carcter se codifica con 9 barras (5 negras y 4 blancas), 3 de las cuales son ms anchas
que las dems.
- Entre caracteres consecutivos se inserta un pequeo espacio equivalente a una barra blanca.
- Se pueden codificar cadenas compuestas por caracteres 0123456789ABCDEFGHIJKLMNOPQRS
TUVWXYZ-.$/+% y espacio en blanco.
- El asterisco * se utiliza como delimitador de inicio y final de cadena.
- Ejemplo, para codificar la cadena PO-2537:
* P O - 2 5 3 7 G *
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 82
Codificacin Patrn de barras Carcter
1101 0101 0011 K
1101 0100 1101 H
1011 0100 1101 I
1010 1100 1101 J
1011 0010 1101 9
1010 0110 1101 0
1101 0100 1011 A
1011 0100 1011 B
1101 1010 0101 C
1010 1100 1011 D
1101 0110 0101 E
1011 0110 0101 F
1010 1001 1011 G
1101 0010 1101 8








1011 0101 0011 L
1010 0101 1011 7
1011 0011 0101 6
1101 0011 0101 5
1010 0110 1011 4
1101 1001 0101 3
1011 0010 1011 2
1101 0010 1011 1
Codificacin Patrn de barras Carcter
1001 0100 1001 +
1001 0110 1101 *
1001 0010 1001 $
1001 0010 1001 /
1100 1010 1011 U
1001 1010 1011 V
1100 1101 0101 W
1001 0110 1011 X
1100 1011 0101 Y
1001 1011 0101 Z
1001 0101 1011 -
1100 1010 1101 .
1001 1010 1101 Espacio
1010 1101 1001 T








1010 0100 1001 %
1011 0101 1001 S
1101 0101 1001 R
1010 1011 0011 Q
1011 0110 1001 P
1101 0110 1001 O
1010 1101 0011 N
1101 1010 1001 M
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 83
Checksum final
- Suma de todos los dgitos mdulo 43
- Ejemplo: para PO-2537:
P = 25
O = 24
- = 36
2 = 2
5 = 5
3 = 3
7 = 7 +
102
Resto de la divisin 102/43 = 16
Checksum = carcter G
L
K
J
I
H
G
F
E
D
C
B
A
0
9
8
7
6
5
4
3
2
1
Carcter
21
20
19
18
17
16
15
14
13
12
11
10
0
9
8
7
6
5
4
3
2
1
Valor
%
+
/
$
*
Espacio
.
-
Z
Y
X
W
V
U
T
S
R
Q
P
O
N
M
Carcter
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
Valor
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 84
Transmisin serie sncrona
- Todos los bytes que componen un mensaje se transmiten juntos.
- Los bits que componen cada byte se representan elctricamente en el mismo hilo conductor
sucesivamente, durante un pequeo intervalo de tiempo que depende de la velocidad de
transmisin.
- Sincronizacin entre transmisor y receptor mediante una seal de reloj independiente (ejemplo, SPI)
o modulada en la informacin enviada (ejemplo, Ethernet) a cada bit.
byte 1 byte 2 byte 3
Transmisin serie asncrona
- Canales frecuentes en aplicaciones industriales: RS-232, RS-485, RS-422.
- Cada byte se transmite de forma independiente.
- Los bits que componen cada byte se representan elctricamente en el mismo hilo conductor
sucesivamente, durante un pequeo intervalo de tiempo que depende de la velocidad de
transmisin.
- Bit de comienzo (start bit, nivel 0) inicial y perodo de reposo final (nivel 1) para sincronizacin entre
transmisor y receptor a cada byte.
byte 1 byte 2 byte 3
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 85
Transmisin serie asncrona
bit 0bit 1bit 2bit 3bit 4bit 5bit 6bit 7
Perodo de
reposo
T+
T
2
T T T T T T T T T
Instantes de lectura
Instantes de escritura
T T T T T T T
Bit de
comienzo
Instante de
sincronizacin
Instante de
sincronizacin
1 1 0 1 0 0 0 1
- Bits transmitidos por byte: normalmente 7 u 8.
- Bit de paridad: par, impar, ninguna.
- Perodo de reposo (stop bits): 1, 1.5, 2
- Velocidad de transmisin: 1/T en bits/s. (baud)
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 86
RS 485
Esclavos
RS 422
Maestro
Half-duplex
Full-duplex
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 87
Protocolos maestro/esclavo
Esclavo 1 Esclavo 2 Esclavo 3
Orden dirigida al esclavo 2
Respuesta
2 0 0 2 3 0
Orden Respuesta
Tiempo mnimo
entre ciclos
orden/respuesta
Otra orden
Maestro 0
Sincronizacin del dilogo
Direccin destino
Direccin origen
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 88
Controlador Omron E5CK
- Control PID autoajustable (auto-tuning, self-tuning) mediante algoritmo borroso (fuzzy).
- Entrada: sensor de temperatura (termopar o resistencia de platino), tensin (0-10V) o
bucle de corriente (4-20 mA).
- Salida analgica o modulada en ancho de pulso (PWM Pulse Width Modulation)
- Canal RS 485 para supervisin y control externos.
Calentamiento
Consigna
Sensor
Temperatura
Tiempo
Perodo de
autoajuste
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 89
Ejemplo de aplicacin: control de humedad de un recinto
Alimentacin
220 VAC
Humidificador
Sensor de
humedad
Salida
Alarma
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 90
Control on/off
ON
OFF
Zona muerta
Dead band
Histresis
Punto de consigna
Set point
Temperatura
Actuacin
Zona de
calentamiento
Zona de
enfriamiento
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 91
Configuracin de parmetros de comunicacin
Velocidad: 1.2, 2.4, 4.8, 9.6, 19.2 Kbaud
Nmero de nodo: 0 a 99
Paridad: par, impar, ninguna
Bits por byte: 7, 8 Bits parada: 1, 2
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 92
Protocolo de comunicacin: operacin de escritura
- Formato texto
@ 0 9 2 0 1 3 0 0 0
Comienzo
Direccin
destino
Operacin
de escritura
Parmetro
a modificar
Valor
7 9 * Cr
- Ejemplo: modificar el valor de consigna (parmetro nmero 1) a 300.0 grados en el nodo 9.
Orden
Maestro esclavo
@ 0 9 2 0 1 3 0 0 0
Comienzo
Direccin
origen
Operacin
de escritura
Valor
7 9 * Cr
Respuesta
Esclavo maestro
0 0
XOR
Fin orden
Operacin
correcta
Parmetro
modificado
XOR
Fin respuesta
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 93
Clculo de la XOR
30
30
30
33
31
30
32
39
30
40
ASCII
Hexadecimal
0011 0000 48 0
0011 0000 48 0
0011 0000 48 0
0011 0011 51 3
0011 0001 49 1
0011 0000 48 0
0011 0010 50 2
0011 1001 57 9
0011 0000 48 0
0001 0000 64 @
ASCII
Binario
ASCII
Decimal
Carcter
XOR = 121 79 0111 1001
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 94
@ 0 9 1 0 1 0 0 0 0
Comienzo
Nodo
destino
Operacin
de lectura
Parmetro
a leer
Valor
No se utiliza
7 9 * Cr
- Ejemplo: obtener el valor actual de la variable controlada en el nodo 9.
Orden
Maestro esclavo
@ 0 9 1 0 1 2 0 0 0
Comienzo
Nodo
origen
Operacin
de lectura
Valor
7 A * Cr
Respuesta
Esclavo maestro
0 0
XOR
Fin orden
Operacin
correcta
Parmetro
ledo
XOR
Fin respuesta
Protocolo de comunicacin: operacin de lectura
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 95
Protocolo XON/XOFF
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. // posicin de carga, de descarga y contabilizando el nmero 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 direccin apuntada por
16. // este puntero
17.
18. int XOFFRecibido, XOFFEnviado;
19. // Booleanos que indican si se ha transmitido el carcter XOFF y si a su vez
20. // se ha recibido
- Quien recibe informacin solicita a quien le la enva que detenga temporalmente la transmisin,
envindole el carcter XOFF (cdigo ASCII 17).
- Quien recibe informacin le indica al transmisor que puede continuar mediante el carcter XON
(cdigo ASCII 19).
- En comunicaciones manejadas mediante interrupcin suelen utilizarse colas circulares:
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 96
21. int Transmitiendo = 0;
22. // Booleano que indica si hay alguna transmisin en curso
23.
24. #define XON 17
25. #define XOFF 19
26. // Macroinstrucciones para representar a los cdigos ASCII de los caracteres
27. // XON y XOFF
28.
29.
30. void interrupt IRecibe ()
31. // Rutina que atiende a la interrupcin que se produce cuando se recibe un
32. // nuevo carcter
33.
34. {
35. char recibido;
36.
37. recibido = * pCanal;
38. // Recoge el carcter 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 adems hay an caracteres en la
48. // cola de envo, extraer un carcter de esa cola y enviarlo
49.
50. XOFFRecibido = 0;
51. // Indica que ya podemos transmitir caracteres
52. }
53.
Contina
Universidade de Vigo EUITI Informtica 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); // Enva 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 recepcin el carcter recibido
65. }
66. }
67.
68.
69. void interrupt IEnvia ()
70. // Rutina que atiende a la interrupcin que se produce cuando ha finalizado
71. // el envo de un carcter enviado anteriormente
72.
73. {
74. if (ColaTransmision. cargados == 0) Transmitiendo = 0;
75. // Si la cola de transmisin est vaca, no hay que enviar nada ms
76.
77. if (! XOFFRecibido && ColaTransmision. cargados > 0)
78. * pCanal = descarga (& ColaTransmision);
79. // Si no se ha recibido XOFF y en la cola de transmisin hay algo, entonces
80. // recoger un carcter de la misma y provocar su envo
81. }
82.
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 98
83. char RecibeCola ()
84. // Recoge de la cola de recepcin un carcter y lo devuelve. Si esta cola est
85. // vaca, 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 recepcin ...
91.
92. {
93. * pCanal = XON; // Enva un XON
94. XOFFEnviado = 0; // Indica que se ha anulado el anterior envo de XOFF
95. }
96.
97. if (ColaRecepcion. cuantos > 0) // Si la cola de recepcin no est vaca ...
98. return descarga (& ColaRecepcion); // Devuelve un carcter de la misma
99. else return 0; // Si no, devuelve un 0
100. }
101.
102.
103. void EnviaCola (char dato)
104. // Enva el carcter pasado por parmetro. Si hay una transmisin en curso,
105. // lo guarda en la cola de transmisin
106.
107. {
108. if (! Transmitiendo) // Si en este momento no hay transmisin en curso ...
109. {
110. * pCanal = dato; // Enva el carcter
111. Transmitiendo = 1; // Indica que hay una transmisin en curso
112. }
113. else carga (& ColaTransmision, dato); // Si no, crgalo en la cola
114. }
115.
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 99
116.
117. main ()
118.
119. {
120. pCanal = (unsigned char *) 0x100;
121. // Supongamos que el registro para recepcin/transmisin est mapeado en la
122. // direccin 0x100;
123.
124. ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0;
125. ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0;
126. // Inicializa las colas de recepcin y transmisin
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. }
X
8
X
5
X
6
X
7
X
4
X
3
X
2
X
1
X
0
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 100
Cdigos de redundancia cclica
- CRC (Cyclic Redundancy Check)
- Algoritmos ms utilizados:
CRC-8 = X
8
+ X
5
+ X
4
+ 1
CRC-12 = X
12
+ X
11
+ X
3
+ X
2
+ X + 1
CRC-16 = X
16
+ X
15
+ X
2
+ 1
CRC-CCITT = X
16
+ X
12
+ X
5
+ 1
CRC-32 = X
32
+ X
26
+ X
23
+ X
22
+ X
16
+ X
12
+ X
11
+ X
10
+ X
8
+ X
7
+ X
5
+ X
4
+ X
2
+ X + 1
D
G
Q
Entrada
de bits
D
G
Q D
G
Q D
G
Q D
G
Q
D
G
D
G
Q D
G
Disparo para
desplazamientos
Q Q
- Ejemplo: CRC-8
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 101
1. unsigned char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Informacin a procesar
2. unsigned n = 4; // Nmero 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 tambin la XOR con los puntos de realimentacin
16. CRC8 >>= 1; // Desplaza todos los biestables
17. CRC8 |= 0x80; // Aade un 1 en el biestable ms significativo
18. }
19. else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC
20. auxiliar >>= 1; // Contina con el siguiente bit
21. }
22. }
CRC-8 en lenguaje C
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 102
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 103
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 104
Velocidad de transmisin
- Registro SPBRG
- Si bit BRGH = 1, entonces
velocidad = Foscilador / (16 * (SPBRG + 1))
- Si bit BRGH = 0, entonces
velocidad = Foscilador / (64 * (SPBRG + 1))
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 105
IPEN RCON
bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 Registro
Velocidad de comunicacin SPBRG
BRGH SYNC TXTA
Dato recibido RCREG
RX9D OERR FERR ADDEN CREN RX9 SPEN RCSTA
RCIP IPR1
RCIE PIE1
RCIF PIR1
GIEL GIEH INTCON
Habilita
interrupciones
alta prioridad
Habilita
interrupciones
baja prioridad
Flag interrupcin
por recepcin
Habilita interrupcin
por recepcin
Prioridad de interrupcin
por recepcin
Habilita
comunicacin
Habilita
bit 9
Habilita
receptor
Habilita
deteccin
de direccin
Bit 9
recibido
Framing error
Error de trama de bits
Overrun error
Error de saturacin
del receptor
Configuracin de la recepcin
0 para
modo
asncrono
Seleccin de
velocidad
Permite
interrupciones
de diferentes
prioridades
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 106
IPEN RCON
bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 Registro
Velocidad de comunicacin SPBRG
TX9D TRMT BRGH SYNC TXEN TX9 TXTA
Dato a transmitir TXREG
SPEN RCSTA
TXIP IPR1
TXIE PIE1
TXIF PIR1
GIEL GIEH INTCON
Habilita
interrupciones
alta prioridad
Habilita
interrupciones
baja prioridad
Flag interrupcin
por transmisin
Habilita interrupcin
por transmisin
Prioridad de interrupcin
por transmisin
Habilita
comunicacin
Habilita
bit 9
Habilita
transmisor
Bit 9 a
transmitir
1 cuando finaliz
la serializacin
Configuracin de la transmisin
0 para
modo
asncrono
Seleccin de
velocidad
Permite
interrupciones
de diferentes
prioridades
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 107
1. #include <p18f452.h>
2.
3. rom char mensaje[] = "\nHola\nEste programa hace eco de "
4. "toda la informacin recibida\n";
5. // Cadena de caracteres guardada en memoria de programa
6.
7. void enviaCaracter (char caracter)
8. // Envio de un carcter por consulta
9. {
10. while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carcter
11. TXREG = caracter; // Suministra el carcter para serializarlo
12. }
13.
14. char recibeCaracter (void)
15. // Recepcin de un carcter 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 carcter recibido
20. }
21.
22. void inicializaCanalConsulta ()
23. // Inicializa el canal serie para recepcin/transmisin por consulta
24. {
25. TRISCbits. TRISC6 = 0; // Lnea de transmisin en RC6 como salida
26. TRISCbits. TRISC7 = 1; // Lnea de recepcin 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.
Recepcin y envo por consulta
Contina
Universidade de Vigo EUITI Informtica Industrial 2004-2005 Sistemas embebidos 108
32. void enviaCadenaROM (rom char * cadena)
33. // Enva por el canal serie una cadena de caracteres almacenada en ROM
34. {
35. rom char * p;
36. p = cadena; // Apunta al primer carcter
37. while (* p) // Mientras no se haya llegado al final de la cadena ...
38. {
39. enviaCaracter (* p); // Enva un carcter
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 parmetros del canal
51. enviaCadenaROM (mensaje); // Enva ese mensaje
52. while (1) // Repite contnuamente ...
53. {
54. caracter = recibeCaracter (); // Espera a recibir un carcter y recgelo
55. enviaCaracter (caracter); // Lo enva por el mismo canal
56. }
57. }

Das könnte Ihnen auch gefallen