Download - Tutorial Español C18
Microcontrolador Microchip PIC18F452
- Arquitectura RISC (Reduced Instruction Set Computer).- Juego de instrucciones reducido para ejecución rápida.- Oscilador hasta 40 MHz 10 MIPs (Million Instructions Per second).- Optimizado para compilación desde lenguaje C. - Micro de 8 bits.
- Arquitectura de memoria Hardvard:- memoria interna de programa FLASH de 32 Kb- memoria interna RAM de 1536 bytes- memoria interna EEPROM de 256 bytes- contador de programa de 21 bits hasta 2 Mb de memoria de programa- direccionamiento de 12 bits en memoria de datos 4Kb
- Periféricos integrados:- temporizadores, contadores, comparadores, unidades de captura- modulación en ancho de pulso PWM (Pulse Width Modulation)- interrupciones internas y externas- canal serie USART (Universal Synchronous/Asnynchronous Serial Receiver/Transmiter)- canal serie SPI (Serial Peripheral Interface)- canal serie I2C (Inter-Integrated Circuit)- puerto paralelo esclavo PSP (Parallel Slave Port)- conversión A/D de 10 bits- perro guardián WDT (Watchdog Timer).
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 1
Encapsulados
PIC18F452:
DIP
PLCC
QFN (Quad Flat No lead)
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 2
Operaciones simultáneas de lectura y ejecución de instrucciones (pipeline)
Ciclos de reloj
MOVLW 55h carga el valor 0x55 en el acumulador
MOVWF PORTB copia el acumulador en el puerto B
BRA SUB_1 salto a la rutina SUB_1
BSF PORTA, BIT3 pone a 1 el bit 3 del puerto A
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 3
Mapa de memoria de datos
Memoria de propósito general
GPR (General Purpose Registers)
Registros de configuración y operación
SFR (Special Function Registers)
Bancos de memoria de 256 bytes
Registro de selección de banco
BSR (Bank Select Register)
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 4
SFRs
- Direcciones 0xF80 a 0xFFF
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 5
Microchip MPLAB C18
Entorno de programación MPLAB IDE
- Gratuito, descargable desde http://www.microchip.com
- IDE (Integrated Development Environment) para Windows.- Ensamblador, enlazador, gestión de proyectos, depurador, simulador.
Compilador MPLAB C18
- Compilador cruzado de lenguaje C para la serie de microcontroladores Microchip PIC 18.- Sigue la norma ANSI C X3.159-1989, salvo en particularizaciones para este microcontrolador.- Se integra en el entorno MPLAB IDE.- Bibliotecas de rutinas para PWM, canales SPI, I2C, UART, USART, cadenas de caracteres y
funciones matemáticas en punto flotante.- Almacenamiento de variables multibyte de tipo little-endian.- Números reales float y double de 32 bits.
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 6
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 7
Sistema de desarrollo Microchip MPLAB ICD 2
- Entorno de programación y depuración en tiempo real para microcontroladores Microchip PIC.
- Conexión USB o RS 232 con el computador de desarrollo, en el que se utiliza MPLAB IDE(gratuito http://www.microchip.com).
- Manejo del microcontrolador real mediante líneas dedicadas.
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 8
Placa de desarrollo Microchip PICDEM 2 PLUS
1: Soporte para microcontroladores PIC de 18, 28 y 40 patillas.2: Alimentación de 9V (adaptador externo o pila) y regulador para 5V 100mA.3: Conector RS 232 y driver MAX232.4: Conexión al depurador MPLAB IDC 2.5: Potenciómetro para simulación de entrada analógica.6, 8: Tres pulsadores (entradas) y 4 LEDs (salidas).14: Memoria EEPROM serie externa 24L256 de 256K x 8
15: Pantalla de cristal líquido LCD16: Zumbador17: Área de prototipos18: Sensor de temperatura
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 9
Conexión al depurador y programador MPLAB IDC 2
USB al computador
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 10
PIC 18F452
Poten-ciómetro
EEPROM
Pulsador S2
Pulsador S1Reset
Placa de desarrollo Microchip PICDEM 2 PLUS
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 11
Pantalla de cristal líquidoLEDs
Pulsador S3
Zumbador Sensor de temperatura
Placa de desarrollo Microchip PICDEM 2 PLUS
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 12
RS 232
Placa de desarrollo Microchip PICDEM 2 PLUS
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 13
Compilador MPLAB C18 en entorno MPLAB IDE
Compilación, enlazado
con MPLAB C18
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 14
1. #include <p18f452.h>2.
3. int contador;4.
5. void main ()6. {7. contador = 1;8. TRISB = 0;9. while (contador <= 15) 10. {11. PORTB = contador;12. contador ++; 13. }14. }
Primer ejemplo con MPLAB C18
Contador utilizado para repetir el bucle 15 veces
Configura todas las líneas del puerto Bcomo salidas digitales
A cada paso del bucle, las 8 líneas delpuerto B reflejan el estado del contador
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 15
Configuración del sistema de desarrollo MPLAB IDE:
selección del microcontrolador
Configure Select device
- Soporte para la familia de microcontroladores Microchip PIC18
- Configuración del sistema de desarrollo, con diferentes SFR (Special Function Registers)y espacio de direccionamiento
- Soporte de herramientas de programación y depuración.
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 16
Creación de un nuevo proyecto:Project New
Elección del compilador:Project Select Language Toolsuite
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 17
Añadir un fichero fuente al proyecto:
File NewEditar y guardar en ejemplo.c
En la ventana de proyecto añadir: - Fichero fuente ejemplo.c- Script de enlazado:
18f452i.lkr para simulación18f452.lkr para MPLAB ICD2
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 18
Configuración de subdirectorios de trabajo
Ficheros creados en el mismosubdirectorio del proyecto
Ficheros de declaraciones en c:\mcc18\h
Bibliotecas en c:\mcc18\lib
Script de enlazado en c:\mcc18\lkr
Project Build options Project
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 19
Compilación, enlazado y generación de código máquina
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 20
1. #include <p18f452.h> 2. int contador;3.
4. int main ()5. {6. 0000e2 0e01 MOVLW 0x1 contador = 1;7. 0000e4 0100 MOVLB 0x08. 0000e6 6f8a MOVWF 0x8a,0x19. 0000e8 6b8b CLRF 0x8b,0x110. 0000ea 6a93 CLRF 0x93,0x0 TRISB = 0;11. 0000ec 518b MOVF 0x8b,0x0,0x1 while (contador <= 15)12. 0000ee 0a00 XORLW 0x013. 0000f0 aee8 BTFSS 0xe8,0x7,0x014. 0000f2 d002 BRA 0xf815. 0000f4 358b RLCF 0x8b,0x0,0x116. 0000f6 d005 BRA 0x10217. 0000f8 0e0f MOVLW 0xf18. 0000fa 80d8 BSF 0xd8,0x0,0x019. 0000fc 558a SUBFWB 0x8a,0x0,0x120. 0000fe 0e00 MOVLW 0x021. 000100 558b SUBFWB 0x8b,0x0,0x122. 000102 e306 BNC 0x11023. 00010e d7ee BRA 0xec24. {25. 000104 c08a MOVFF 0x8a,0xf81 PORTB = contador;26. 000106 ff8127. 000108 2b8a INCF 0x8a,0x1,0x1 contador ++;28. 00010a 0e00 MOVLW 0x029. 00010c 238b ADDWFC 0x8b,0x1,0x130. }31. 000110 0012 RETURN 0x0 }
P1.lst: listado con código máquina y código ensamblador. Vista parcial:
Código
máqina
Código
ensamblador
Dirección
programa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 21
1. :020000040000FA2. :0600000089EF00F01200803. :02002A000000D44. :0C0044002A0EF66E000EF76E000EF86E2D5. :1000500000010900F550856F0900F550866F03E1366. :10006000856701D03DD00900F550806F0900F5503B7. :10007000816F0900F550826F09000900F550E96EA38. :100080000900F550EA6E090009000900F550836F789. :100090000900F550846F09000900F6CF87F0F7CF0B10. :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA11. :1000B000F8FF0001835302E1845307E00900F5508312. :1000C000EE6E8307F8E28407F9D787C0F6FF88C09113. :1000D000F7FF89C0F8FF00018507000E865BBFD7D814. :0200E00012000C15. :0E00E200010E00018A6F8B6B936A8B51000A2E16. :1000F000E8AE02D08B3505D00F0ED8808A55000EA117. :100100008B5506E38AC081FF8A2B000E8B23EED72618. :020110001200DB19. :0E01120015EE00F025EE00F0F86A019CA68EB620. :0E012000A69C22EC00F071EC00F0FDD712005E21. :00000001FF
P1.hex: código máquina en formato Intel INHX32
0E 00E2 00 010E 0001 8A6F 8B6B 936A 8B51 000A 2E
Seindican
14 bytes
Seguardan
a partir de 00E2
Información a almacenar
Suma decomprobación
0A
00
8B
51
93
6A
8B
6B
8A
6F
00
01
01
0E
00ED
00EC
00EB
00EA
00E9
00E8
00E7
00E6
00E5
00E4
00E3
00E2
Se indican datos a
almacenar
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 22
Generación de un mapa de memoria:
Project Build Options Project MPLINK Linker
Activar casilla
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 23
Mapa de memoria: generado en el fichero P1.map
1. PORTD 0x000f83 data extern C:\MCC18\SRC\PROC\p18f452.asm2. TRISD 0x000f95 data extern C:\MCC18\SRC\PROC\p18f452.asm3. contador 0x00008a data extern C:\Ejemplos\P1\ejemplo.c 4. _entry 0x000000 program extern C:\mcc18\src\startup\c018i.c5. main 0x0000e2 program extern C:\Ejemplos\P1\ejemplo.c
1. Program Memory Usage 2. Start End3. --------- ---------4. 0x000000 0x0000055. 0x000044 0x00012d6. 242 out of 33048 program addresses used
Memoria de programa utilizada:
Direccionamiento de algunos identificadores:
Comienzo ejecución: GOTO 0x112
Código de inicialización
Bucle de ejecución contínua:LOOP:
main ()GOTO LOOP
Código del programa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 24
Elección del depurador: Debugger Select Tool MPLAB SIM
MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardwareMPLAB SIM: simulador
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 25
Depuración de programas: ejecución de instrucciones
Punto de ruptura
Siguiente instruccióna ejecutar
Run: ejecución contínua del programa
Step Into: en una llamada a una función, detenerse al comienzo de la misma
Step Over: en una llamada a una función, ejecutarla completamente
Reset: comenzar de nuevo
Step Out: ejecutar el resto de la función
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 26
Particularidades de MPLAB C18: clase de almacenamiento overlay
1. int f ()2. {3. overlay int a = 3;4. return a;5. }6.
7. int g ()8. {9. overlay int b = 7;10. return b;11. }12.
13. int main ()14. {15. f ();16. g ();17. }
- Almacenamiento estático- Inicialización en cada llamada- Se comparte memoria en el caso de que no haya uso simultáneo- Ventaja: optimización de memoria, necesario en arquitecturas reducidas
Ejemplos:
a y b comparten memoria
1. int f ()2. {3. overlay int a = 3;4. return a;5. }6.
7. int g ()8. {9. overlay int b = 7;10. b = f ();11. return b;12. }13.
14. int main ()15. {16. f ();17. g ();18. }
a y b se guardan en
posiciones diferentes:
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 27
Particularidades de MPLAB C18: parámetros static en funciones
- Almacenamiento estático en lugar de pila- Ventajas: código más pequeño y rápido- No permite llamadas reentrantes
1. int doblePila (int x)2. {3. return 2 * x;4. }5.
6. int dobleEstatico (static int x)7. {8. return 2 * x;9. }
Ejemplo:
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 28
Memoria de datosMemoria interna organizada en bancos de 256 bytes
También existe direccionamiento indexado, que permite manejar toda la memoriaRAM de forma lineal.
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 29
Banco de memoria especial:
Formado con los 128 primerosbytes del banco 0 y los SFR
La memoria interna se reduce a este banco cuando el bit a del código máquina está a 0
Ventaja: mayor rapidez de acceso
Ejemplo: copiar valor desde el acumuladora la dirección dddd dddd con la etiqueta D
Ensamblador: MOVWF D, a Máquina: 0110 111a dddd dddd
Caso particular: MOVWF PORTB, 0 0110 1110 1000 0001
Universidade de Vigo - EUITI Informática Industrial 2004-2005 Sistemas embebidos 30Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 30
Soporte en MPLAB C18 para especificación de banco en memoria de datos:
- Clase de almacenamiento far para variables que pueden residir en cualquier banco.
- Clase de almacenamiento near para variables que tienen que residir en el banco especial.
- Ejemplo:
1. far int f;2.
3. int main ()4. {5. near int n;6. f = 3;7. n = 5;8. }
1. MOVLB 0x0 ; BSR=0 para seleccionar2. ; el banco 03. MOVLW 0x3 ; Carga 0x3 en acumulador4. MOVWF 0x8A,0x1 ; Copia acumulador en 0x8A5. ; seleccionando banco con BSR6. CLRF 0x8B,0x1 ; Pone a cero la dirección 7. ; 0x8B, seleccionando banco8. ; con BSR
Compilación
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 31
Configuración del modelo de memoria
Project
Build Options
Project
MPLAB C18
Categories
Memory Model
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 32
Mapa de memoria
de programa Pila
Comienzo después deuna inicialización (reset)
Dos tipos de interrupciones:
de alta y baja prioridad
Memoria de programa interna
Posible memoria de programa externa
Capacidad de direccionamiento de hasta 2 Mb
Pila independiente:- Hasta 31 direcciones de retornodesde rutina o interrupción
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 33
Datos en memoria de programa
- Memoria FLASH no volátil de lectura/escritura
- Mayor capacidad que la RAM. Almacenamiento de información constante o que no se va a modificarfrecuentemente.
- Se manejan mediante los SFR:TBLPTRU (TaBLe PoinTeR Upper byte)TBLPTRH (TaBLe PoinTeR High byte)TBLPTRL (TaBLe PoinTeR Low byte)TABLAT (program memory TABLe LAtch)
- Instrucciones TBLRD (TaBle ReaD) y TBLWT (TaBLe WriTe)
Dirección de memoria de programa
Dato a transferir
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 34
1. #include <p18f452.h>
2. rom far char f;
3. int main ()4. {5. f = 3;6. }
1. MOVLW 0x12 ; Carga 0x12 en el acumulador2. MOVWF TBLPTRL, 0 ; Copia el acumulador en TBLPTRL3.
4. MOVLW 0x1 ; Carga 0x1 en el acumulador5. MOVWF TBLPTRH, 0 ; Copia el acumulador en TBLPTRH6.
7. MOVLW 0x0 ; Carga 0x0 en el acumulador8. MOVWF TBLPTRU, 0 ; Copia el acumulador en TBLPTRU9.
10. MOVLW 0x3 ; Carga 0x3 en el acumulador11. MOVWF TABLAT, 0 ; Copia el acumulador en TABLAT12.
13. TBLWT ; Escribe en memoria FLASH
Soporte en MPLAB C18 para datos en memoria de programa:
- Clase de almacenamiento rom para variables que residen en memoria de programa.
- Ejemplo:
Según el fichero de mapa de memoria, la variable f se almacena en la dirección 0x000112
TBLPTRU:TBLPTRH:TBLPTRL = 0x000112
Compilación
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 35
Punteros a memoria de datos y de programa
- Incompatibles debido a que a puntan a diferentes tipos de memoria.
- Ejemplo:
1. #include <p18f452.h>
2. int x, * px;3. rom int y, * py;
4. int main ()5. {6. px = & x;7. py = & y;8. px = py;9. }
Error
Tamaño de los punteros:
24 bitsrom far int * p;Puntero far a memoria de programa
16 bitsrom near int * p;Puntero near a memoria de programa
16 bitsint * p;Puntero a memoria de datos
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 36
Información en memoria de programa
- Caso típico: cadenas de caracteres constantes.
- Hay funciones para realizar trasvases RAM ROM
rom char * strcpypgm2pgm (auto rom char * destino,
auto const rom char * origen);rom rom
rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen);ram rom
char * strcpypgm2ram (auto char * destino, auto const rom char * origen);rom ram
char * strcpy (auto char * destino, auto const char * origen);ram ram
const: la cadena de caracteres origen no se modifica
auto: los parámetros de estas funciones se manejan en la pila
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 37
1. rom far const char cadenaROM [] = "Hola";2. char cadenaRAM [20];3.
4. strcpypgm2ram (cadenaRAM, cadenaROM);
Ejemplo
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 38
Configuración del microcontrolador
- Los compiladores de lenguaje C utilizan la directiva #pragma para poder indicar información no
estandarizada al compilador.
- Ejemplos para la configuración de un PIC en un programa compilado con MPLAB C18:
1. #pragma config OSC = HS2. // Se utiliza un cristal de cuarzo de frecuencia alta3.
4. #pragma config WDT = OFF5. // Se desactiva el perro guardián (WatchDog Timer)6.
7. #pragma config LVP = OFF8. // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming)
- También se pueden establecer en el MPLAB IDE, bajo Configure Configuration bits ...
Ejemplo de unión: líneas del microcontrolador con varias funciones
1. union2. {3. struct4. {5. unsigned RD0:1;6. unsigned RD1:1;7. unsigned RD2:1;8. unsigned RD3:1;9. unsigned RD4:1;10. unsigned RD5:1;11. unsigned RD6:1;12. unsigned RD7:1;13. };14. struct15. {16. unsigned AD0:1;17. unsigned AD1:1;18. unsigned AD2:1;19. unsigned AD3:1;20. unsigned AD4:1;21. unsigned AD5:1;22. unsigned AD6:1;23. unsigned AD7:1;24. };25. } PORTDbits ;
Parte del fichero p18f452.h
Manejo como 8 señales digitales
Manejo como 8 entradas analógicas
1. #include <p18f452.h>2.
3. int main ()4. {5. int x;6. PORTDbits.RD0 = 1;7. x = PORTDbits.RD2;8. }
Utilización en un programa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 39
Incluir código en ensamblador
1. #include <p18f452.h>2.
3.
4. int main ()5. {
6. Instrucciones7. _asm8. NOP9. _endasm
10. Instrucciones11. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 40
- Ejemplo: insertar un pequeño retardo mediante la ejecución de la instrucción NOP
Rutinas de atención a interrupciones
1. #include <p18f452.h>2.
3. #pragma code bajaPrioridad = 0x184.
5. void saltoBajaPrioridad (void)6. {7. _asm8. GOTO rutinaBajaPrioridad 9. _endasm10. }11.
12. #pragma code13.
14. #pragma interruptlow rutinaBajaPrioridad15. void rutinaBajaPrioridad (void)16. {
17. Código que atiende a la interrupción18. }
Creación de una nueva sección de código a partir de la dirección0x18 denominada bajaPrioridad
Instrucción insertada en la dirección 0x18
Cerrar sección bajaPrioridady abrir sección normal de código
Rutina que atiende a la interrupción
#pragma code sección=dirección Abre una sección de código
#pragma interruptlow Permite indicar cuál es la rutina que atiende a las interrupciones de baja prioridad
#pragma interrupt Permite indicar cuál es la rutina que atiende a las interrupciones de alta prioridad
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 41
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 42
1. #include <p18f452.h>2.
3. // Definición de la función rutinaInterrupción que va a atender interrupciones4. #pragma interrupt rutinaInterrupcion5. void rutinaInterrupcion ()6. {7. if (INTCONbits.TMR0IF) // Si la interrupción la produjo TMR08. {9. INTCONbits.TMR0IF = 0; // Poner a 0 ese indicador10. PORTBbits.PORTB0 = ! PORTBbits.PORTB0; // Cambia la salida 0 del puerto B11. }12. }13.
14. #pragma code seccionAltaPrioridad = 0x08 // Abre una sección de código en 0x0815. void rutinaAltaPrioridad (void)16. {17. _asm18. GOTO rutinaInterrupcion // Salto a la rutina que atiende a las 19. // interrupciones de alta prioridad20. _endasm21. }22.
23. #pragma code // Vuelve a la sección de código normal24.
Ejemplo: interrupciones mediante temporizador TMR0
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 43
25. void main ()26.
27. {28. INTCON = 0x20; // Habilita interrupción del temporizador 0, pero29. // deshabilitándolas globalmente30.
31. INTCON2 = 0x84; // La configura como interrupción de alta prioridad32.
33. RCONbits.IPEN = 1; // Habilita interrupciones de diferentes prioridades34.
35. TMR0H = 0; TMR0L = 0; // Pone temporizador a cero36.
37. T0CON = 0x82; // Configura a TMR0 como temporizador con contaje ascendente38. // de 16 bits, frecuencia de incremento = reloj/8 y lo activa,39. // genera una interrupción a cada transición 0xFFFF->0x000040.
41. INTCONbits.GIEH = 1; // Habilita interrupciones globalmente42.
43. TRISB = 0; // Señales del puerto B configuradas como salidas44.
45. while (1); // Bucle infinito vacío46. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 44
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
Situar datos en direcciones específicas
1. #include <p18f452.h>2.
3. #pragma udata zona1 = 0x100;4. // Define una nueva sección en la memoria de datos que comienza5. // en la dirección 0x100. A esta nueva sección se le asigna6. // el identificador zona17.
8. int x, y, z;9. // Dentro de esta sección se declaran las variables x, y, z que se10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente11.
12. #pragma idata zona2 = 0x200;13. // Sección zona2 de datos inicializados a partir de 0x20014.
15. int a, b;16. // Variables a y b que se guardan a partir de 0x200 y 0x202
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 48
- Secciones de dos tipos:udata: variables estáticas sin valor inicialidata: variables estáticas con valor inicial
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 49
Secciones que comparten memoria
1. #include <p18f452.h>2.
3. #pragma udata overlay seccionCompartida1 = 0x100;4. // Define una nueva sección en la memoria de datos que comienza5. // en la dirección 0x100. La memoria utilizada en esta sección se 6. // puede compartir para otra sección.7.
8. int x, y, z;9. // Dentro de esta sección se declaran las variables x, y, z que se10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente11.
12. #pragma udata overlay seccionCompartida2 = 0x100;13. // Sección de datos almacenados a partir de 0x100 14.
15. long a, b;16. // Variables a y b que se guardan a partir de 0x100 y 0x104
- Se pueden declarar varias secciones de datos en las mismas posiciones de memoria,siempre y cuando no se utilicen simultaneamente.
- Se utiliza la palabra reservada overlay
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 50
Cátodo común
Ánodo común
Visualizadores de 7 segmentos
F1000111
E1001111
d0111101
C1001110
b0011111
A1110111
91111011
81111111
71110000
61011111
51011011
40110011
31111001
21101101
10110000
01111110
Verabcdefg
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 51
Pantallas de cristal líquido (LCD, Lyquid Crystal Display) alfanuméricas
- Configuraciones típicas: 1, 2 o 4 filas y 16, 20 o 40 columnas.
- Bus de datos y de control:
DB0-DB7
E
R/W
RS
Vc
Vdd
Vss
Señal
Bus de datos7-14
Pulso a nivel alto para realizar la transferencia6
Operación de lectura (R/W=1) o escritura (R/W=0)5
Transmisión de texto (RS=1) o transmisitón de instrucción (RS=0)4
Alimentación para la pantalla3
Alimentación +5Vdc para circuitos lógicos2
Masa1
SignificadoNúmero de línea
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 52
Configuración del bus de datos
DB0DB1DB2DB3DB4DB5DB6DB7
ER/WRS
µC LCD
DB0-DB7
R/W
E
dato
µC LCD
DB4-DB7
R/W
E
bits 4-7 bits 0-3
8 bits 4 bits
RD0RD1RD2RD3
RA1RA2RA3
DB0DB1DB2DB3DB4DB5DB6DB7
ER/WRS
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 53
1. #include <p18f452.h>2.
3. // Macros para dar nombre a las líneas del puerto PORTB utilizadas4. #define E_LCD PORTAbits.RA15. #define RW_LCD PORTAbits.RA26. #define RS_LCD PORTAbits.RA37.
8.
9. void instruccionLCD (unsigned char instruccion)10. // Envía al LCD la instrucción codificada en el parámetro11.
12. {13. RS_LCD = 0; // Se va a enviar una instrucción14. RW_LCD = 0; // En una operación de escritura15. PORTD &= 0xF0; // Pone a cero los 4 bits menos significativos de PORTD16. PORTD |= instruccion >> 4; // Pone en PORTD(0-3) los 4 bits más significativos17. E_LCD = 1;18. E_LCD = 0; // Pulso de activación de transferencia19. PORTD &= 0xF0;20. PORTD |= instruccion & 0x0F; // Pone en PORTD(0-3) los 4 bits menos significativos21. E_LCD = 1;22. E_LCD = 0; // Otro pulso de transferencia23. }
Envío de instrucciones con bus de 4 bits
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 54
DB0DB1DB2DB3DB4DB5DB6DB7
*
*
C
I/D
1
0
*
*
B
S
*
1
Dato11Lectura en RAM
Dato01Escritura en RAM
Dirección DDRAMBF10Lee estado
Dirección DDRAM100Dirección DDRAM
Dirección CGRAM1000Dirección CGRAM
FNDL10000Función
R/LS/C100000Desplazamiento
D1000000Activación pantalla
10000000Modo introducción
00000000Cursor a origen
00000000Borrar pantalla
Bus de datos en dos transferencias de 4 bits DB4-DB7R/WRSInstrucción
Juego de instrucciones de una pantalla LCD
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 55
Se desplaza el cursor (0) o toda la información (1) con cada escrituraS/C
Bus de 4 bits (0) o de 8 bits (1)DL
LCD de una fila (0) o de más filas (1)N
Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1)F
La pantalla está ocupada (1) o puede aceptar otra instrucción (0)BF
Desplazamiento a la izquierda (0) o a la derecha (1)R/L
Cursor fijo (0) o con parpadeo (1)B
Cursor invisible (0) o visible (1)C
Pantalla apagada (0) o en funcionamiento (1)D
Sin desplazamiento (0) o con desplazamiento (1)S
Decrementa (0) o incrementa (1) la posición del cursor con cada escrituraI/D
SignificadoBit
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 56
Inicialización
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 57
Conversión analógico/digital
- Ocho entradas analógicas de 10 bits de resolución.
- Referencia de tensión interna o externa.
- Manejo por consulta o interrupción.
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 58
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 59
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 60
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 61
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 62
Conversión analógico/digital mediante consulta
1. #include <p18f452.h>2.
3. void main (void)4.
5. {6. float resultado; // Para recoger la medida expresada en voltios7.
8. TRISAbits.TRISA0 = 1;9. // El bit menos significativo del puerto RA es una línea de entrada10.
11. ADCON0 = 0x41;12. // Activa el módulo de conversión analógica, selecciona el canal 0 y 13. // utiliza un tiempo de conversión igual 8 veces el período del oscilador14.
15. ADCON1 = 0x8E;16. // El resultado de la conversión se sitúa en los 10 bits menos significativos17. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN018.
19. while (1) // Ejecutar contínuamente ...20. {21. ADCON0bits.GO_DONE = 1; // Solicita una conversión22. while (ADCON0bits.GO_DONE); // Espera mientras no finalice23.
24. resultado = (float) ADRES * 5 / 1024;25. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor26. // de 10 bits de resolución27.
28. Utilizar el resultado de la conversión29. }30. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 63
Conversión analógico/digital mediante interrupción
1. #include <p18f452.h>2.
3. float resultado; // Para recoger la medida expresada en voltios4. int finConversion; // Booleano cierto si terminó la conversión5.
6.
7. #pragma interrupt interrupcionConversionAD8. void interrupcionConversionAD (void)9. // Rutina que atiende a la interrupción producida cuando finaliza una10. // conversión A/D11.
12. {13. resultado = (float) ADRES * 5 / 1024;14. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor15. // de 10 bits de resolución16.
17. finConversion = 1;18. // Indica que ya se dispone de la medida19.
20. PIR1bits. ADIF = 0; 21. // Hay que poner a cero el aviso de interrupción22. }23.
24.
25. #pragma code interruption = 0x826. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias27. {28. _asm29. GOTO interrupcionConversionAD 30. _endasm31. }
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 64
32. #pragma code // Vuelve a la sección de código normal33.
34.
35. void main (void)36.
37. {38. TRISAbits.TRISA0 = 1;39. // El bit menos significativo del puerto RA es una línea de entrada40.
41. ADCON0 = 0x41;42. // Activa el módulo de conversión analógica, selecciona el canal 0 y 43. // utiliza un tiempo de conversión igual 8 veces el período del oscilador44.
45. ADCON1 = 0x8E;46. // El resultado de la conversión se sitúa en los 10 bits menos significativos47. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN048.
49. IPR1bits.ADIP = 1; // Interrupciones de fin de conversión son de alta prioridad50. PIE1bits.ADIE = 1; // Permite interrupciones por conversión A/D51. INTCONbits.GIEH = 1; // Permite interrupciones de alta prioridad52. RCONbits.IPEN = 1; // Distingue entre interrupciones de alta y baja prioridad53.
54. while (1) // Ejecutar contínuamente ...55. {56. finConversion = 0; // Prepara a este booleano57. ADCON0bits. GO_DONE = 1; // Solicita una conversión58. while (! finConversion); // Espera mientras no finalice59.
60. Utilizar resultado de conversión61. }62. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 65
Unidad de captura
Interrupción
Selección deflanco
Entrada
Selección detemporizador Temporizador 1
Temporizador 3
Captura
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 66
1. #include <p18f452.h>2.
3. unsigned int duracion; 4. // Tiempo transcurrido entre dos flancos ascendentes de la línea RC2/CCP15.
6.
7. #pragma interrupt interrupcionComparacion8. void interrupcionComparacion (void)9. // Rutina que atiende a la interrupción producida cuando se detecta un flanco10. // ascendente en RC2/CCP111.
12. {13. unsigned static int anterior;14. // Recuerda el instante en el que se detectó el último flanco ascendente15.
16. if (PIR1bits. CCP1IF) // Si la interrupción se produjo debido a una captura ...17. {18. duracion = CCPR1 - anterior; // Intervalo entre este flanco y el anterior19. anterior = CCPR1; // Recuerda este instante para la siguiente vez20. }21.
22. PIR1bits. CCP1IF = 0; 23. // Hay que poner a cero el aviso de interrupción24. }
EjemploPrograma que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de tiempo entre dos flancos ascendentes en la línea RC2/CCP1
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 67
25. #pragma code interruption = 0x826. void interrupcionesPrioritarias (void) // Atiende a interrupciones prioritarias27. {28. _asm29. GOTO interrupcionComparacion 30. _endasm31. }32.
33. #pragma code // Vuelta a la sección de código normal34.
35. void main (void)36.
37. {38. TRSCbits. TRISC2 = 1; // Configura la línea RC2/CCP1 como entrada39.
40. // Configuración de TIMER1:41. T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits42. T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operación de 1/843. T1CONbits. T1CKPS0 = 1;44. T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno45. T1CONbits. T1SYNC = 1; // Sin sincronización con señal externa46. T1CONbits. TMR1ON = 1; // Activa TIMER147.
48. T3CONbits. T3CCP2 = 0; // La unidad de captura de la línea CCP1 utiliza TIMER149.
50. CCP1CON = 0x05; // La captura se realiza en los flancos ascendentes51.
52. PIE1bits. CCP1IE = 1; // Habilita interrupciones de captura en CCP153. RCONbits. IPEN = 1; // Habilita interrupciones prioritarias54. INTCONbits. GIE = 1; // Habilitación global de interrupciones55.
56. while (1); // Bucle indefinido de espera57. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 68
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 10 0
Dígitos de 4 bits: 10112
Paridad impar: 0
Bandamagnética
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 73
SS PAN
SS (Start Sentinel): delimitador de comienzo, valor 10112.
PAN (Primary Account Number): número de tarjeta, hasta 19 dígitos.
FS (Field Separator): separador de campos, valor 11012.
CC (Country Code): código de país, 3 dígitos
ED (Expiration Date): fecha de caducidad, 4 dígitos
ES (End Sentinel): delimitador de final de lectura, valor 11112.
LRC (Longitudinal Redundancy Check): para comprobación de errores, o-exclusiva de todo lo leído, desde SS hasta ES.
FS CC ED ES LRCMás dígitos ...
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 74
Fotodiodo Fototransistor
Superficieclara
220
4K7Vcc
GND
Salida
CNY70
Lectores fotoeléctricos
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 75
Codificadores incrementales rotativos (rotary encoders)
Disco codificado
Inserción sellada
LEDs
DiscoFotodiodo
Rodamientos
Eje
Cable
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 76
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 77
Emisor/receptor:
- Grandes distancias (20 m). - Sensible a fallos de alineación.
Reflexión mediante catadióptrico:
- Hasta 3 m. - Fácil instalación.
Reflexión difusa:
- Hasta 30 cm. - Sensible al color y tipo de superficie.
Células fotoeléctricas
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 78
Cambio de sentido
A
B
RA4/T0CKI
RC0/T1CKI
PIC18F452
Canal A
Canal B
A
B
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 79
1. void main (void)2.
3. {4. int posicion = 0;5. unsigned timer0, timer1;6.
7. T0CON = 0xA8;8. // Configura TIMER0: lo activa, contador de 16 bits de flancos ascendentes en 9. // entrada T0CKI 10.
11. T1CON = 0x83;12. // Configura TIMER1: lo activa como contador de 16 bits de flancos ascendentes en13. // entrada T1CKI14.
15. ...16.
17. timer0 = TMRL0; // Primero hay que leer la parte baja18. timer0 |= TMRH0 << 8; // y luego hay que combinarla con la parte alta19. timer1 = TMRL1;20. timer1 |= TMRH1 << 8;21. posicion = timer0 - timer1;22. // Calcula la posición del encóder como la diferencia entre el número de 23. // pulsos en uno y otro sentidos24. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 80
Alternativa: puerto en el que se produce una interrupción cuando cambia cualquier señal
A
B
A xor B
1. unsigned long posicion = 0; // Posición del encóder2. #define A PORTBbits.RB0 // El canal A conectado a RB03. #define B PORTBbits.RB1 // El canal B conectado a RB14.
5. void interrupcionCambioPuerto ()6. {7. int xor;8. static int primera = 0, Aanterior, Banterior;9.
10. if (! primera) // Si no es la primera interrupción ...11. {12. xor = A ^ B; // Calcula a o-exclusiva13. if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++;14. else posicion --; // actualiza la posición15. }16. else primera = 0; // La siguiente ya no es la primera interrupción17. Aanterior = A; // Recuerda el estado anterior en el canal A18. Banterior = B; // Lo mismo para el canal B19. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 81
Códigos de barras
- Ejemplo: formato Code 39 o "Código 3 de 9".
- Cada carácter se codifica con 9 barras (5 negras y 4 blancas), 3 de las cuales son más anchasque las demás.
- Entre caracteres consecutivos se inserta un pequeño espacio equivalente a una barra blanca.
- Se pueden codificar cadenas compuestas por caracteres 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.$/+% y espacio en blanco.
- El asterisco * se utiliza como delimitador de inicio y final de cadena.
- Ejemplo, para codificar la cadena PO-2537:
* P O - 2 5 3 7 G *
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 82
CodificaciónPatrón de barrasCarácter
1101 0101 0011K
1101 0100 1101H
1011 0100 1101I
1010 1100 1101J
1011 0010 11019
1010 0110 11010
1101 0100 1011A
1011 0100 1011B
1101 1010 0101C
1010 1100 1011D
1101 0110 0101E
1011 0110 0101F
1010 1001 1011G
1101 0010 11018
1011 0101 0011L
1010 0101 10117
1011 0011 01016
1101 0011 01015
1010 0110 10114
1101 1001 01013
1011 0010 10112
1101 0010 10111
CodificaciónPatrón de barrasCarácter
1001 0100 1001+
1001 0110 1101*
1001 0010 1001$
1001 0010 1001/
1100 1010 1011U
1001 1010 1011V
1100 1101 0101W
1001 0110 1011X
1100 1011 0101Y
1001 1011 0101Z
1001 0101 1011-
1100 1010 1101.
1001 1010 1101Espacio
1010 1101 1001T
1010 0100 1001%
1011 0101 1001S
1101 0101 1001R
1010 1011 0011Q
1011 0110 1001P
1101 0110 1001O
1010 1101 0011N
1101 1010 1001M
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 83
Checksum final
- Suma de todos los dígitos módulo 43
- Ejemplo: para PO-2537:
P = 25O = 24- = 362 = 25 = 53 = 37 = 7 +
102
Resto de la división 102/43 = 16
Checksum = carácter G
L
K
J
I
H
G
F
E
D
C
B
A
0
9
8
7
6
5
4
3
2
1
Carácter
21
20
19
18
17
16
15
14
13
12
11
10
0
9
8
7
6
5
4
3
2
1
Valor
%
+
/
$
*
Espacio
.
-
Z
Y
X
W
V
U
T
S
R
Q
P
O
N
M
Carácter
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
Valor
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 84
Transmisión serie síncrona- Todos los bytes que componen un mensaje se transmiten juntos.- Los bits que componen cada byte se representan eléctricamente en el mismo hilo conductor
sucesivamente, durante un pequeño intervalo de tiempo que depende de la velocidad de transmisión.
- Sincronización entre transmisor y receptor mediante una señal de reloj independiente (ejemplo, SPI)o modulada en la información enviada (ejemplo, Ethernet) a cada bit.
byte 1 byte 2 byte 3
Transmisión serie asíncrona- Canales frecuentes en aplicaciones industriales: RS-232, RS-485, RS-422.- Cada byte se transmite de forma independiente. - Los bits que componen cada byte se representan eléctricamente en el mismo hilo conductor
sucesivamente, durante un pequeño intervalo de tiempo que depende de la velocidad de transmisión.
- Bit de comienzo (start bit, nivel 0) inicial y período de reposo final (nivel 1) para sincronización entre transmisor y receptor a cada byte.
byte 1 byte 2 byte 3
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 85
Transmisión serie asíncrona
bit 0bit 1 bit 2 bit 3 bit 4bit 5bit 6 bit 7
Período dereposo
T+ T2
T T T T T T T T T
Instantes de lectura
Instantes de escritura
T T T T TTT
Bit decomienzo
Instante desincronización
Instante desincronización
1 1 0 1 0 0 0 1
- Bits transmitidos por byte: normalmente 7 u 8.- Bit de paridad: par, impar, ninguna.- Período de reposo (stop bits): 1, 1.5, 2- Velocidad de transmisión: 1/T en bits/s. (baud)
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 86
RS 485
Esclavos
RS 422
Maestro
Half-duplex
Full-duplex
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 87
Protocolos maestro/esclavo
Esclavo 1 Esclavo 2 Esclavo 3
Orden dirigida al esclavo 2
Respuesta
2 0 0 2 3 0Orden Respuesta
Tiempo mínimoentre ciclos
orden/respuesta
Otra orden
Maestro 0
Sincronización del diálogo
Dirección destinoDirección origen
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 88
Controlador Omron E5CK
- Control PID autoajustable (auto-tuning, self-tuning) mediante algoritmo borroso (fuzzy).
- Entrada: sensor de temperatura (termopar o resistencia de platino), tensión (0-10V) o bucle de corriente (4-20 mA).
- Salida analógica o modulada en ancho de pulso (PWM Pulse Width Modulation)
- Canal RS 485 para supervisión y control externos.
Calentamiento
Consigna
Sensor
Temperatura
Tiempo
Período de autoajuste
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 89
Ejemplo de aplicación: control de humedad de un recinto
Alimentación220 VAC
Humidificador
Sensor dehumedad
SalidaAlarma
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 90
Control on/off
ON
OFF
Zona muertaDead band
Histéresis
Punto de consignaSet point
Temperatura
Actuación
Zona decalentamiento
Zona deenfriamiento
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 91
Configuración de parámetros de comunicación
Velocidad: 1.2, 2.4, 4.8, 9.6, 19.2 Kbaud
Número de nodo: 0 a 99
Paridad: par, impar, ninguna
Bits por byte: 7, 8Bits parada: 1, 2
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 92
Protocolo de comunicación: operación de escritura
- Formato texto
@ 0 9 2 0 1 3 0 0 0
Comienzo
Direccióndestino
Operaciónde escritura
Parámetroa modificar
Valor
7 9 * Cr
- Ejemplo: modificar el valor de consigna (parámetro número 1) a 300.0 grados en el nodo 9.
Orden
Maestro esclavo
@ 0 9 2 0 1 3 0 0 0
Comienzo
Direcciónorigen
Operaciónde escritura
Valor
7 9 * CrRespuesta
Esclavo maestro0 0
XOR
Fin orden
Operacióncorrecta
Parámetromodificado
XOR
Fin respuesta
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 93
Cálculo de la XOR
30
30
30
33
31
30
32
39
30
40
ASCII
Hexadecimal
0011 0000480
0011 0000480
0011 0000480
0011 0011513
0011 0001491
0011 0000480
0011 0010502
0011 1001579
0011 0000480
0001 000064@
ASCII
Binario
ASCII
Decimal
Carácter
XOR = 121 79 0111 1001
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 94
@ 0 9 1 0 1 0 0 0 0
Comienzo
Nododestino
Operaciónde lectura
Parámetroa leer
ValorNo se utiliza
7 9 * Cr
- Ejemplo: obtener el valor actual de la variable controlada en el nodo 9.
Orden
Maestro esclavo
@ 0 9 1 0 1 2 0 0 0
Comienzo
Nodoorigen
Operaciónde lectura
Valor
7 A * CrRespuesta
Esclavo maestro0 0
XOR
Fin orden
Operacióncorrecta
Parámetroleído
XOR
Fin respuesta
Protocolo de comunicación: operación de lectura
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 95
Protocolo XON/XOFF
1. typedef struct2. {3. char datos [1000];4. unsigned carga, descarga, cargados;5. } COLA;6. // Cola circular donde almacenar hasta 1000 caracteres, disponiendo de una7. // posición de carga, de descarga y contabilizando el número de caracteres8. // cargados9.
10. COLA ColaRecepcion, ColaTransmision;11. // Colas circulares independientes para los datos recibidos y a transmitir12.
13. unsigned char * pCanal;14. // Se supone que los caracteres que se reciben o se transmiten se guardan15. // o se leen de un registro mapeado en memoria en la dirección apuntada por 16. // este puntero17.
18. int XOFFRecibido, XOFFEnviado;19. // Booleanos que indican si se ha transmitido el carácter XOFF y si a su vez20. // se ha recibido
- Quien recibe información solicita a quien le la envía que detenga temporalmente la transmisión, enviándole el carácter XOFF (código ASCII 17).
- Quien recibe información le indica al transmisor que puede continuar mediante el carácter XON
(código ASCII 19).
- En comunicaciones manejadas mediante interrupción suelen utilizarse colas circulares:
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 96
21. int Transmitiendo = 0;22. // Booleano que indica si hay alguna transmisión en curso23.
24. #define XON 1725. #define XOFF 1926. // Macroinstrucciones para representar a los códigos ASCII de los caracteres27. // XON y XOFF28.
29.
30. void interrupt IRecibe ()31. // Rutina que atiende a la interrupción que se produce cuando se recibe un 32. // nuevo carácter33.
34. {35. char recibido;36.
37. recibido = * pCanal;38. // Recoge el carácter recibido39.
40. if (recibido == XOFF) XOFFRecibido = 1;41. // Si se ha recibido un XOFF, indicarlo en este booleano42.
43. else if (recibido == XON) // Si se ha recibido un XON ...44. {45. if (XOFFRecibido && ColaTransmision. cargados > 0)46. Envia (descarga (& ColaTransmision));47. // Si previamente se ha recibido un XOFF y además hay aún caracteres en la48. // cola de envío, extraer un carácter de esa cola y enviarlo49.
50. XOFFRecibido = 0;51. // Indica que ya podemos transmitir caracteres52. }53.
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 97
54. else // Si no es XON ni XOFF ...55. {56. if (ColaRecepcion. cargados > 900)57. // Si en la cola de entrada ya hay 900 caracteres ...58. {59. Envia (XOFF); // Envía un XOFF60. XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF61. }62.
63. carga (recibido, & ColaRecepcion);64. // En cualquier caso carga en la cola de recepción el carácter recibido65. }66. }67.
68.
69. void interrupt IEnvia ()70. // Rutina que atiende a la interrupción que se produce cuando ha finalizado 71. // el envío de un carácter enviado anteriormente72.
73. {74. if (ColaTransmision. cargados == 0) Transmitiendo = 0;75. // Si la cola de transmisión está vacía, no hay que enviar nada más76.
77. if (! XOFFRecibido && ColaTransmision. cargados > 0)78. * pCanal = descarga (& ColaTransmision);79. // Si no se ha recibido XOFF y en la cola de transmisión hay algo, entonces80. // recoger un carácter de la misma y provocar su envío81. }82.
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 98
83. char RecibeCola ()84. // Recoge de la cola de recepción un carácter y lo devuelve. Si esta cola está85. // vacía, devuelve un 0.86.
87. {88. if (XOFFEnviado && ColaRecepcion. cuantos == 100) 89. // Si se ha enviado previamente un XOFF y ya hay suficiente espacio libre en 90. // la cola de recepción ...91.
92. {93. * pCanal = XON; // Envía un XON94. XOFFEnviado = 0; // Indica que se ha anulado el anterior envío de XOFF95. }96.
97. if (ColaRecepcion. cuantos > 0) // Si la cola de recepción no está vacía ...98. return descarga (& ColaRecepcion); // Devuelve un carácter de la misma99. else return 0; // Si no, devuelve un 0100. }101.
102.
103. void EnviaCola (char dato)104. // Envía el carácter pasado por parámetro. Si hay una transmisión en curso, 105. // lo guarda en la cola de transmisión106.
107. {108. if (! Transmitiendo) // Si en este momento no hay transmisión en curso ...109. {110. * pCanal = dato; // Envía el carácter111. Transmitiendo = 1; // Indica que hay una transmisión en curso112. }113. else carga (& ColaTransmision, dato); // Si no, cárgalo en la cola114. }115.
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 99
116.
117. main ()118.
119. {120. pCanal = (unsigned char *) 0x100;121. // Supongamos que el registro para recepción/transmisión está mapeado en la122. // dirección 0x100;123.
124. ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0;125. ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0;126. // Inicializa las colas de recepción y transmisión127.
128. Instala (IRecibe, 3);129. Instala (IEnvia, 4);130. // Instala las rutinas para atender a las interrupciones131.
132. Utiliza las funciones EnviaCola y RecibeCola para manejar el canal133.
134. }
X8X5 X6 X7X4X3X2X1
X0
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 100
Códigos de redundancia cíclica
- CRC (Cyclic Redundancy Check)
- Algoritmos más utilizados:
CRC-8 = X8 + X5 + X4 + 1CRC-12 = X12 + X11 + X3 + X2 + X + 1CRC-16 = X16 + X15 + X2 + 1CRC-CCITT = X16 + X12 + X5 + 1CRC-32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1
D
G
Q
Entradade bits
D
G
Q D
G
Q D
G
Q D
G
Q D
G
D
G
Q D
G
Disparo para desplazamientos
QQ- Ejemplo: CRC-8
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 101
1. unsigned char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Información a procesar2. unsigned n = 4; // Número de bytes en la matriz m3. unsigned i, j; // Contadores para bucles4. unsigned char CRC8 = 0; // Variable donde se va a calcular el CRC-85. unsigned auxiliar;6.
7.
8. for (i = 0; i < n; i ++) // Procesando todos los bytes guardados en m ...9. {10. auxiliar = m [i]; // Copia el siguiente byte a procesar11. for (unsigned j = 0; j < 8; j ++) // Recorriendo los 8 bits de ese byte ...12. {13. if ((auxiliar & 0x01) ^ (CRC8 & 0x01)) // Si la XOR de entrada genera un 1 ...14. {15. CRC8 ^= 0x18; // Realiza también la XOR con los puntos de realimentación16. CRC8 >>= 1; // Desplaza todos los biestables17. CRC8 |= 0x80; // Añade un 1 en el biestable más significativo18. }19. else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC20. auxiliar >>= 1; // Continúa con el siguiente bit21. }22. }
CRC-8 en lenguaje C
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 102
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 103
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 104
Velocidad de transmisión
- Registro SPBRG
- Si bit BRGH = 1, entonces velocidad = Foscilador / (16 * (SPBRG + 1))
- Si bit BRGH = 0, entonces velocidad = Foscilador / (64 * (SPBRG + 1))
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 105
IPENRCON
bit 0bit 1bit 2bit 3bit 4bit 5bit 6bit 7Registro
Velocidad de comunicaciónSPBRG
BRGHSYNCTXTA
Dato recibidoRCREG
RX9DOERRFERRADDENCRENRX9SPENRCSTA
RCIPIPR1
RCIEPIE1
RCIFPIR1
GIELGIEHINTCON
Habilitainterrupcionesalta prioridad
Habilitainterrupcionesbaja prioridad
Flag interrupciónpor recepción
Habilita interrupciónpor recepción
Prioridad de interrupciónpor recepción
Habilitacomunicación
Habilitabit 9
Habilitareceptor Habilita
detecciónde dirección
Bit 9recibido
Framing error
Error de trama de bits
Overrun error
Error de saturacióndel receptor
Configuración de la recepción
0 para modo
asíncrono
Selección develocidad
Permiteinterrupcionesde diferentesprioridades
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 106
IPENRCON
bit 0bit 1bit 2bit 3bit 4bit 5bit 6bit 7Registro
Velocidad de comunicaciónSPBRG
TX9DTRMTBRGHSYNCTXENTX9TXTA
Dato a transmitirTXREG
SPENRCSTA
TXIPIPR1
TXIEPIE1
TXIFPIR1
GIELGIEHINTCON
Habilitainterrupcionesalta prioridad
Habilitainterrupcionesbaja prioridad
Flag interrupciónpor transmisión
Habilita interrupciónpor transmisión
Prioridad de interrupciónpor transmisión
Habilitacomunicación
Habilitabit 9
Habilitatransmisor
Bit 9 atransmitir
1 cuando finalizó la serialización
Configuración de la transmisión
0 para modo
asíncrono
Selección develocidad
Permiteinterrupcionesde diferentesprioridades
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 107
1. #include <p18f452.h>2.
3. rom char mensaje[] = "\nHola\nEste programa hace eco de "4. "toda la información recibida\n";5. // Cadena de caracteres guardada en memoria de programa6.
7. void enviaCaracter (char caracter)8. // Envio de un carácter por consulta9. {10. while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carácter11. TXREG = caracter; // Suministra el carácter para serializarlo12. }13.
14. char recibeCaracter (void)15. // Recepción de un carácter por consulta16. {17. while (! PIR1bits. RCIF); // Espera mientras no se na recibido nada18. PIR1bits. RCIF = 0; // Este flag hay que ponerlo a cero en el programa19. return RCREG; // Devuelve el carácter recibido20. }21.
22. void inicializaCanalConsulta ()23. // Inicializa el canal serie para recepción/transmisión por consulta24. {25. TRISCbits. TRISC6 = 0; // Línea de transmisión en RC6 como salida26. TRISCbits. TRISC7 = 1; // Línea de recepción en RC7 como entrada27. SPBRG = 25; // Con un reloj de 4 MHz fija una velocidad de 9600 baud28. TXSTA = 0x24; // 8 bits y sin paridad, habilita transmisor29. RCSTA = 0x90; // Habilita receptor30. }31.
Recepción y envío por consulta
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 108
32. void enviaCadenaROM (rom char * cadena)33. // Envía por el canal serie una cadena de caracteres almacenada en ROM34. {35. rom char * p; 36. p = cadena; // Apunta al primer carácter37. while (* p) // Mientras no se haya llegado al final de la cadena ...38. {39. enviaCaracter (* p); // Envía un carácter40. p ++; // Para enviar luego el siguiente41. }42. }43.
44.
45. void main (void)46.
47. {48. char caracter;49.
50. inicializaCanalConsulta (); // Inicializa los parámetros del canal51. enviaCadenaROM (mensaje); // Envía ese mensaje52. while (1) // Repite contínuamente ...53. {54. caracter = recibeCaracter (); // Espera a recibir un carácter y recógelo55. enviaCaracter (caracter); // Lo envía por el mismo canal56. }57. }