Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutorial Español C18
Tutorial Español C18
Sistemas embebidos
Sistemas embebidos
Encapsulados PIC18F452:
DIP PLCC
Sistemas embebidos
Ciclos de reloj
carga el valor 0x55 en el acumulador copia el acumulador en el puerto B salto a la rutina SUB_1 pone a 1 el bit 3 del puerto A
Sistemas embebidos
Memoria de propsito general GPR (General Purpose Registers) Registros de configuracin y operacin SFR (Special Function Registers)
Sistemas embebidos
SFRs
- Direcciones 0xF80 a 0xFFF
Sistemas embebidos
Sistemas embebidos
Sistemas embebidos
15: Pantalla de cristal lquido LCD 16: Zumbador 17: rea de prototipos 18: Sensor de temperatura
Sistemas embebidos
USB al computador
Sistemas embebidos
10
Potencimetro
EEPROM Pulsador S2
PIC 18F452
Contina
Sistemas embebidos
11
Zumbador Pulsador S3
Sensor de temperatura
Sistemas embebidos
12
RS 232
Sistemas embebidos
13
Sistemas embebidos
14
Sistemas embebidos
15
#include <p18f452.h> int contador; void main () { contador = 1; TRISB = 0; while (contador <= 15) { PORTB = contador; contador ++; } }
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
Sistemas embebidos
16
- 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.
Sistemas embebidos
17
Sistemas embebidos
18
En la ventana de proyecto aadir: - Fichero fuente ejemplo.c - Script de enlazado: 18f452i.lkr para simulacin 18f452.lkr para MPLAB ICD2
Sistemas embebidos
19
Sistemas embebidos
20
Sistemas embebidos
21
Direccin programa
Cdigo mqina
Cdigo ensamblador
0000e2 0000e4 0000e6 0000e8 0000ea 0000ec 0000ee 0000f0 0000f2 0000f4 0000f6 0000f8 0000fa 0000fc 0000fe 000100 000102 00010e 000104 000106 000108 00010a 00010c 000110
0e01 0100 6f8a 6b8b 6a93 518b 0a00 aee8 d002 358b d005 0e0f 80d8 558a 0e00 558b e306 d7ee c08a ff81 2b8a 0e00 238b 0012
MOVLW MOVLB MOVWF CLRF CLRF MOVF XORLW BTFSS BRA RLCF BRA MOVLW BSF SUBFWB MOVLW SUBFWB BNC BRA MOVFF INCF MOVLW ADDWFC RETURN
0x1 0x0 0x8a,0x1 0x8b,0x1 0x93,0x0 0x8b,0x0,0x1 0x0 0xe8,0x7,0x0 0xf8 0x8b,0x0,0x1 0x102 0xf 0xd8,0x0,0x0 0x8a,0x0,0x1 0x0 0x8b,0x0,0x1 0x110 0xec 0x8a,0xf81 0x8a,0x1,0x1 0x0 0x8b,0x1,0x1 0x0
} }
Sistemas embebidos
22
:020000040000FA :0600000089EF00F0120080 :02002A000000D4 :0C0044002A0EF66E000EF76E000EF86E2D :1000500000010900F550856F0900F550866F03E136 :10006000856701D03DD00900F550806F0900F5503B :10007000816F0900F550826F09000900F550E96EA3 :100080000900F550EA6E090009000900F550836F78 :100090000900F550846F09000900F6CF87F0F7CF0B :1000A00088F0F8CF89F080C0F6FF81C0F7FF82C0EA :1000B000F8FF0001835302E1845307E00900F55083 :1000C000EE6E8307F8E28407F9D787C0F6FF88C091 :1000D000F7FF89C0F8FF00018507000E865BBFD7D8 :0200E00012000C :0E00E200010E00018A6F8B6B936A8B51000A2E :1000F000E8AE02D08B3505D00F0ED8808A55000EA1 :100100008B5506E38AC081FF8A2B000E8B23EED726 :020110001200DB :0E01120015EE00F025EE00F0F86A019CA68EB6 :0E012000A69C22EC00F071EC00F0FDD712005E :00000001FF
0E 01 01 00 6F
8A 6B 8B 6A 93 51 8B 00 0A
Se indican 14 bytes
Informacin a almacenar
Suma de comprobacin
Sistemas embebidos
23
Activar casilla
Sistemas embebidos
24
Program Memory Usage Start End ----------------0x000000 0x000005 0x000044 0x00012d 242 out of 33048 program addresses used
Sistemas embebidos
25
Select Tool
MPLAB SIM
MPLAB IDC2, ICE 4000, ICD 2000: depuradores hardware MPLAB SIM: simulador
Sistemas embebidos
26
Sistemas embebidos
27
Ejemplos:
a y b se guardan en a y b comparten memoria
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
posiciones diferentes:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
int f () { overlay int a = 3; return a; } int g () { overlay int b = 7; return b; } int main () { f (); g (); }
int f () { overlay int a = 3; return a; } int g () { overlay int b = 7; b = f (); return b; } int main () { f (); g (); }
Sistemas embebidos
28
en funciones
Ejemplo:
1. 2. 3. 4. 5. 6. 7. 8. 9.
Sistemas embebidos
29
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.
Sistemas embebidos
30
Sistemas embebidos
31
- Clase de almacenamiento far para variables que pueden residir en cualquier banco. - Clase de almacenamiento near para variables que tienen que residir en el banco especial. - Ejemplo:
1. 2. 3. 4. 5. 6. 7. 8.
Compilacin
1. 2. 3. 4. 5. 6. 7. 8.
; ; ; ; ; ; ; ;
BSR=0 para seleccionar el banco 0 Carga 0x3 en acumulador Copia acumulador en 0x8A seleccionando banco con BSR Pone a cero la direccin 0x8B, seleccionando banco con BSR
Sistemas embebidos
32
Sistemas embebidos
33
Pila Comienzo despus de una inicializacin (reset) Dos tipos de interrupciones: de alta y baja prioridad Memoria de programa interna
Pila independiente:
- Hasta 31 direcciones de retorno desde rutina o interrupcin Posible memoria de programa externa
Sistemas embebidos
34
Sistemas embebidos
35
Compilacin
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
MOVLW 0x12 MOVWF TBLPTRL, 0 MOVLW 0x1 MOVWF TBLPTRH, 0 MOVLW 0x0 MOVWF TBLPTRU, 0 MOVLW 0x3 MOVWF TABLAT, 0 TBLWT
; Carga 0x12 en el acumulador ; Copia el acumulador en TBLPTRL ; Carga 0x1 en el acumulador ; Copia el acumulador en TBLPTRH ; Carga 0x0 en el acumulador ; Copia el acumulador en TBLPTRU ; Carga 0x3 en el acumulador ; Copia el acumulador en TABLAT ; Escribe en memoria FLASH
Sistemas embebidos
36
#include <p18f452.h> int x, * px; rom int y, * py; int main () { px = & x; py = & y; px = py; }
Error
Sistemas embebidos
37
char * strcpy (auto char * destino, auto const char * origen); char * strcpypgm2ram (auto char * destino, auto const rom char * origen); rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen); rom char * strcpypgm2pgm (auto rom char * destino, auto const rom char * origen);
const: la cadena de caracteres origen no se modifica auto: los parmetros de estas funciones se manejan en la pila
Ejemplo
1. 2. 3. 4.
rom far const char cadenaROM [] = "Hola"; char cadenaRAM [20]; strcpypgm2ram (cadenaRAM, cadenaROM);
Sistemas embebidos
38
#pragma config OSC = HS // Se utiliza un cristal de cuarzo de frecuencia alta #pragma config WDT = OFF // Se desactiva el perro guardin (WatchDog Timer) #pragma config LVP = OFF // La memoria FLASH interna no se programa con tension baja (Low Voltage Programming)
Sistemas embebidos
39
union { struct { unsigned RD0:1; unsigned RD1:1; unsigned RD2:1; unsigned RD3:1; unsigned RD4:1; unsigned RD5:1; unsigned RD6:1; unsigned RD7:1; }; struct { unsigned AD0:1; unsigned AD1:1; unsigned AD2:1; unsigned AD3:1; unsigned AD4:1; unsigned AD5:1; unsigned AD6:1; unsigned AD7:1; }; } PORTDbits ;
Utilizacin en un programa
1. 2. 3. 4. 5. 6. 7. 8.
Sistemas embebidos
40
1. 2. 3. 4. 5.
#include <p18f452.h>
int main () {
6.
7. 8. 9.
Instrucciones
_asm NOP _endasm
10.
11.
Instrucciones
}
Sistemas embebidos
41
#include <p18f452.h> #pragma code bajaPrioridad = 0x18 void saltoBajaPrioridad (void) { _asm GOTO rutinaBajaPrioridad _endasm } #pragma code #pragma interruptlow rutinaBajaPrioridad void rutinaBajaPrioridad (void) {
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
Abre una seccin de cdigo Permite indicar cul es la rutina que atiende a las interrupciones de baja prioridad Permite indicar cul es la rutina que atiende a las interrupciones de alta prioridad
#pragma interrupt
Sistemas embebidos
42
#include <p18f452.h> // Definicin de la funcin rutinaInterrupcin que va a atender interrupciones #pragma interrupt rutinaInterrupcion void rutinaInterrupcion () { if (INTCONbits.TMR0IF) // Si la interrupcin la produjo TMR0 { INTCONbits.TMR0IF = 0; // Poner a 0 ese indicador PORTBbits.PORTB0 = ! PORTBbits.PORTB0; // Cambia la salida 0 del puerto B } } #pragma code seccionAltaPrioridad = 0x08 // Abre una seccin de cdigo en 0x08 void rutinaAltaPrioridad (void) { _asm GOTO rutinaInterrupcion // Salto a la rutina que atiende a las // interrupciones de alta prioridad _endasm } #pragma code // Vuelve a la seccin de cdigo normal
Contina
Sistemas embebidos
43
25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
// Habilita interrupcin del temporizador 0, pero // deshabilitndolas globalmente // La configura como interrupcin de alta prioridad // Habilita interrupciones de diferentes prioridades // Pone temporizador a cero
INTCON2 = 0x84;
RCONbits.IPEN = 1; TMR0H = 0;
TMR0L = 0;
T0CON = 0x82;
// Configura a TMR0 como temporizador con contaje ascendente // de 16 bits, frecuencia de incremento = reloj/8 y lo activa, // genera una interrupcin a cada transicin 0xFFFF->0x0000 // Habilita interrupciones globalmente
Sistemas embebidos
44
Sistemas embebidos
45
Sistemas embebidos
46
Sistemas embebidos
47
Sistemas embebidos
48
#include <p18f452.h> #pragma udata zona1 = 0x100; // Define una nueva seccin en la memoria de datos que comienza // en la direccin 0x100. A esta nueva seccin se le asigna // el identificador zona1 int x, y, z; // Dentro de esta seccin se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma idata zona2 = 0x200; // Seccin zona2 de datos inicializados a partir de 0x200 int a, b; // Variables a y b que se guardan a partir de 0x200 y 0x202
Sistemas embebidos
49
#include <p18f452.h> #pragma udata overlay seccionCompartida1 = 0x100; // Define una nueva seccin en la memoria de datos que comienza // en la direccin 0x100. La memoria utilizada en esta seccin se // puede compartir para otra seccin. int x, y, z; // Dentro de esta seccin se declaran las variables x, y, z que se // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente #pragma udata overlay seccionCompartida2 = 0x100; // Seccin de datos almacenados a partir de 0x100 long a, b; // Variables a y b que se guardan a partir de 0x100 y 0x104
Sistemas embebidos
50
Visualizadores de 7 segmentos
abcdefg 1111110 0110000 1101101 1111001 0110011 1011011 1011111 1110000 1111111 1111011 1110111 0011111 1001110 0111101 1001111 1000111 Ver 0 1 2 3 4 5 6 7 8 9 A b C d E F
Ctodo comn
nodo comn
Sistemas embebidos
51
Sistemas embebidos
52
LCD DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 E R/W RS
4 bits
LCD DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 E R/W RS
DB0-DB7 R/W E
dato
DB4-DB7 R/W E
bits 4-7
bits 0-3
Sistemas embebidos
53
#include <p18f452.h> // Macros para #define E_LCD #define RW_LCD #define RS_LCD dar nombre a las lneas del puerto PORTB utilizadas PORTAbits.RA1 PORTAbits.RA2 PORTAbits.RA3
void instruccionLCD (unsigned char instruccion) // Enva al LCD la instruccin codificada en el parmetro { RS_LCD = 0; // Se va a enviar una instruccin RW_LCD = 0; // En una operacin de escritura PORTD &= 0xF0; // Pone a cero los 4 bits menos significativos de PORTD PORTD |= instruccion >> 4; // Pone en PORTD(0-3) los 4 bits ms significativos E_LCD = 1; E_LCD = 0; // Pulso de activacin de transferencia PORTD &= 0xF0; PORTD |= instruccion & 0x0F; // Pone en PORTD(0-3) los 4 bits menos significativos E_LCD = 1; E_LCD = 0; // Otro pulso de transferencia }
Sistemas embebidos
54
Bus de datos en dos transferencias de 4 bits DB4-DB7 Instruccin Borrar pantalla Cursor a origen Modo introduccin Activacin pantalla Desplazamiento Funcin Direccin CGRAM Direccin DDRAM Lee estado Escritura en RAM Lectura en RAM RS 0 0 0 0 0 0 0 0 0 1 1 R/W DB7 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 BF DB6 0 0 0 0 0 0 1 DB5 0 0 0 0 0 1 DB4 0 0 0 0 1 DL DB3 0 0 0 1 S/C N DB2 0 0 1 D R/L F DB1 0 1 I/D C * * DB0 1 * S B * *
Sistemas embebidos
55
Significado Decrementa (0) o incrementa (1) la posicin del cursor con cada escritura Sin desplazamiento (0) o con desplazamiento (1) Pantalla apagada (0) o en funcionamiento (1) Cursor invisible (0) o visible (1) Cursor fijo (0) o con parpadeo (1) Se desplaza el cursor (0) o toda la informacin (1) con cada escritura Desplazamiento a la izquierda (0) o a la derecha (1) Bus de 4 bits (0) o de 8 bits (1) LCD de una fila (0) o de ms filas (1) Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1) La pantalla est ocupada (1) o puede aceptar otra instruccin (0)
Sistemas embebidos
56
Inicializacin
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.
Sistemas embebidos
58
Contina
Sistemas embebidos
59
Sistemas embebidos
60
Contina
Sistemas embebidos
61
Sistemas embebidos
62
TRISAbits.TRISA0 = 1; // El bit menos significativo del puerto RA es una lnea de entrada ADCON0 = 0x41; // Activa el mdulo de conversin analgica, selecciona el canal 0 y // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador ADCON1 = 0x8E; // El resultado de la conversin se sita en los 10 bits menos significativos // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0 while (1) // Ejecutar contnuamente ... { ADCON0bits.GO_DONE = 1; // Solicita una conversin while (ADCON0bits.GO_DONE); // Espera mientras no finalice resultado = (float) ADRES * 5 / 1024; // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolucin
Sistemas embebidos
63
#include <p18f452.h> float resultado; // Para recoger la medida expresada en voltios int finConversion; // Booleano cierto si termin la conversin
#pragma interrupt interrupcionConversionAD void interrupcionConversionAD (void) // Rutina que atiende a la interrupcin producida cuando finaliza una // conversin A/D { resultado = (float) ADRES * 5 / 1024; // Medicin de una seal unipolar entre 0 y 5V, utilizando un conversor // de 10 bits de resolucin finConversion = 1; // Indica que ya se dispone de la medida PIR1bits. ADIF = 0; // Hay que poner a cero el aviso de interrupcin }
#pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionConversionAD _endasm }
Contina
Sistemas embebidos
64
32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
#pragma code
void main (void) { TRISAbits.TRISA0 = 1; // El bit menos significativo del puerto RA es una lnea de entrada ADCON0 = 0x41; // Activa el mdulo de conversin analgica, selecciona el canal 0 y // utiliza un tiempo de conversin igual 8 veces el perodo del oscilador ADCON1 = 0x8E; // El resultado de la conversin se sita en los 10 bits menos significativos // de ADRESH:ADRESL y slo se utiliza la entrada analgica AN0 IPR1bits.ADIP = PIE1bits.ADIE = INTCONbits.GIEH RCONbits.IPEN = 1; // Interrupciones de fin de conversin son de alta prioridad 1; // Permite interrupciones por conversin A/D = 1; // Permite interrupciones de alta prioridad 1; // Distingue entre interrupciones de alta y baja prioridad
while (1) // Ejecutar contnuamente ... { finConversion = 0; // Prepara a este booleano ADCON0bits. GO_DONE = 1; // Solicita una conversin while (! finConversion); // Espera mientras no finalice
Sistemas embebidos
65
Unidad de captura
Temporizador 3 Interrupcin
Entrada Captura
Temporizador 1
Sistemas embebidos
66
Ejemplo
Programa que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de tiempo entre dos flancos ascendentes en la lnea RC2/CCP1
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
#include <p18f452.h> unsigned int duracion; // Tiempo transcurrido entre dos flancos ascendentes de la lnea RC2/CCP1
#pragma interrupt interrupcionComparacion void interrupcionComparacion (void) // Rutina que atiende a la interrupcin producida cuando se detecta un flanco // ascendente en RC2/CCP1 { unsigned static int anterior; // Recuerda el instante en el que se detect el ltimo flanco ascendente if (PIR1bits. CCP1IF) // Si la interrupcin se produjo debido a una captura ... { duracion = CCPR1 - anterior; // Intervalo entre este flanco y el anterior anterior = CCPR1; // Recuerda este instante para la siguiente vez } PIR1bits. CCP1IF = 0; // Hay que poner a cero el aviso de interrupcin }
Contina
Universidade de Vigo EUITI 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
Sistemas embebidos
67
#pragma code interruption = 0x8 void interrupcionesPrioritarias (void) { _asm GOTO interrupcionComparacion _endasm } #pragma code
// Configuracin de TIMER1: T1CONbits. RD16 = 0; // No se van a raealizar lecturas/escrituras de 16 bits T1CONbits. T1CKPS1 = 1; // Preescalado de frecuencia de de operacin de 1/8 T1CONbits. T1CKPS0 = 1; T1CONbits. TMR1CS = 0; // La fuente de pulsos es el reloj interno T1CONbits. T1SYNC = 1; // Sin sincronizacin con seal externa T1CONbits. TMR1ON = 1; // Activa TIMER1 T3CONbits. T3CCP2 = 0; CCP1CON = 0x05; // La unidad de captura de la lnea CCP1 utiliza TIMER1
PIE1bits. CCP1IE = 1; // Habilita interrupciones de captura en CCP1 RCONbits. IPEN = 1; // Habilita interrupciones prioritarias INTCONbits. GIE = 1; // Habilitacin global de interrupciones while (1); } // Bucle indefinido de espera
Sistemas embebidos
68
Sistemas embebidos
69
Sistemas embebidos
70
Sistemas embebidos
71
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 0 1 0 Paridad impar: 0
Banda magntica
Sistemas embebidos
73
SS
PAN
FS
CC
ED
Ms dgitos ...
ES
LRC
SS (Start Sentinel): delimitador de comienzo, valor 10112. PAN (Primary Account Number): nmero de tarjeta, hasta 19 dgitos. FS (Field Separator): separador de campos, valor 11012. 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 11112. LRC (Longitudinal Redundancy Check): para comprobacin de errores, o-exclusiva de todo lo ledo, desde SS hasta ES.
Sistemas embebidos
74
Lectores fotoelctricos
Superficie clara
Fotodiodo
Fototransistor
CNY70
GND
Sistemas embebidos
75
Fotodiodo
Disco LEDs
Eje
Rodamientos
Cable
Sistemas embebidos
76
Sistemas embebidos
77
Clulas fotoelctricas
Sistemas embebidos
78
Canal A
PIC18F452 Canal B B
Cambio de sentido A
B RA4/T0CKI RC0/T1CKI
Sistemas embebidos
79
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
void main (void) { int posicion = 0; unsigned timer0, timer1; T0CON = 0xA8; // Configura TIMER0: lo activa, contador de 16 bits de flancos ascendentes en // entrada T0CKI T1CON = 0x83; // Configura TIMER1: lo activa como contador de 16 bits de flancos ascendentes en // entrada T1CKI ... timer0 = TMRL0; // Primero hay que leer la parte baja timer0 |= TMRH0 << 8; // y luego hay que combinarla con la parte alta timer1 = TMRL1; timer1 |= TMRH1 << 8; posicion = timer0 - timer1; // Calcula la posicin del encder como la diferencia entre el nmero de // pulsos en uno y otro sentidos }
Sistemas embebidos
80
Alternativa: puerto en el que se produce una interrupcin cuando cambia cualquier seal
A B A xor B
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
unsigned long posicion = 0; // Posicin del encder #define A PORTBbits.RB0 // El canal A conectado a RB0 #define B PORTBbits.RB1 // El canal B conectado a RB1 void interrupcionCambioPuerto () { int xor; static int primera = 0, Aanterior, Banterior; if (! primera) // Si no es la primera interrupcin ... { xor = A ^ B; // Calcula a o-exclusiva if ((xor && B == Banterior) || ((! xor) && A == Aanterior)) posicion ++; else posicion --; // actualiza la posicin } else primera = 0; // La siguiente ya no es la primera interrupcin Aanterior = A; // Recuerda el estado anterior en el canal A Banterior = B; // Lo mismo para el canal B }
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:
Sistemas embebidos
82
Carcter
1 2 3 4 5 6 7 8 9 0 A B C D E F G H I J K L
Patrn de barras
Codificacin
1101 0010 1011 1011 0010 1011 1101 1001 0101 1010 0110 1011 1101 0011 0101 1011 0011 0101 1010 0101 1011 1101 0010 1101 1011 0010 1101 1010 0110 1101 1101 0100 1011 1011 0100 1011 1101 1010 0101 1010 1100 1011 1101 0110 0101 1011 0110 0101 1010 1001 1011 1101 0100 1101 1011 0100 1101 1010 1100 1101 1101 0101 0011 1011 0101 0011
Carcter
M N O P Q R S T U V W X Y Z . Espacio * $ / + %
Patrn de barras
Codificacin
1101 1010 1001 1010 1101 0011 1101 0110 1001 1011 0110 1001 1010 1011 0011 1101 0101 1001 1011 0101 1001 1010 1101 1001 1100 1010 1011 1001 1010 1011 1100 1101 0101 1001 0110 1011 1100 1011 0101 1001 1011 0101 1001 0101 1011 1100 1010 1101 1001 1010 1101 1001 0110 1101 1001 0010 1001 1001 0010 1001 1001 0100 1001 1010 0100 1001
Sistemas embebidos
83
Carcter Checksum final - Suma de todos los dgitos mdulo 43 - Ejemplo: para PO-2537:
P O 2 5 3 7 = = = = = = = 25 24 36 2 5 3 7 + 102 1 2 3 4 5 6 7 8 9 0 A B C D E F G H I J K L
Valor
1 2 3 4 5 6 7 8 9 0 10 11 12 13 14 15 16 17 18 19 20 21
Carcter
M N O P Q R S T U V W X Y Z . Espacio * $ / + %
Valor
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
39 40 41 42
Sistemas embebidos
84
Sistemas embebidos
85
Instantes de escritura T 1 T 0 T 1 T 0 T 0
T 1
T+ T 2
Instante de sincronizacin
- 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)
Sistemas embebidos
86
RS 485
Half-duplex
RS 422
Full-duplex
Maestro
Esclavos
Sistemas embebidos
87
Protocolos maestro/esclavo
Maestro 0
Sistemas embebidos
88
Temperatura
Consigna
Sensor
Sistemas embebidos
89
Salida Alarma
Sistemas embebidos
90
Control on/off
Histresis Actuacin Zona muerta Dead band ON Zona de calentamiento OFF Punto de consigna Set point Temperatura Zona de enfriamiento
Sistemas embebidos
91
Nmero de nodo: 0 a 99
Bits parada: 1, 2
Sistemas embebidos
92
XOR
@ 0
* Cr
Fin orden
Comienzo
Valor
Direccin origen
Valor
Fin respuesta
@ 0
* Cr
Comienzo
Operacin de escritura
Operacin correcta
XOR
Sistemas embebidos
93
Clculo de la XOR
Carcter @ 0 9 2 0 1 3 0 0 0 XOR =
ASCII Hexadecimal 40 30 39 32 30 31 33 30 30 30 79
ASCII Binario 0001 0000 0011 0000 0011 1001 0011 0010 0011 0000 0011 0001 0011 0011 0011 0000 0011 0000 0011 0000 0111 1001
Sistemas embebidos
94
XOR
@ 0
* Cr
Fin orden
Comienzo
Nodo origen
Fin respuesta
@ 0
7 A
XOR
* Cr
Comienzo
Operacin de lectura
Operacin correcta
Sistemas embebidos
95
Protocolo XON/XOFF
- 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:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
typedef struct { char datos [1000]; unsigned carga, descarga, cargados; } COLA; // Cola circular donde almacenar hasta 1000 caracteres, disponiendo de una // posicin de carga, de descarga y contabilizando el nmero de caracteres // cargados COLA ColaRecepcion, ColaTransmision; // Colas circulares independientes para los datos recibidos y a transmitir unsigned char * pCanal; // Se supone que los caracteres que se reciben o se transmiten se guardan // o se leen de un registro mapeado en memoria en la direccin apuntada por // este puntero int XOFFRecibido, XOFFEnviado; // Booleanos que indican si se ha transmitido el carcter XOFF y si a su vez // se ha recibido
Contina
Universidade de Vigo EUITI 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Sistemas embebidos
96
int Transmitiendo = 0; // Booleano que indica si hay alguna transmisin en curso #define XON 17 #define XOFF 19 // Macroinstrucciones para representar a los cdigos ASCII de los caracteres // XON y XOFF
void interrupt IRecibe () // Rutina que atiende a la interrupcin que se produce cuando se recibe un // nuevo carcter { char recibido; recibido = * pCanal; // Recoge el carcter recibido if (recibido == XOFF) XOFFRecibido = 1; // Si se ha recibido un XOFF, indicarlo en este booleano else if (recibido == XON) // Si se ha recibido un XON ... { if (XOFFRecibido && ColaTransmision. cargados > 0) Envia (descarga (& ColaTransmision)); // Si previamente se ha recibido un XOFF y adems hay an caracteres en la // cola de envo, extraer un carcter de esa cola y enviarlo XOFFRecibido = 0; // Indica que ya podemos transmitir caracteres }
Contina
Sistemas embebidos
97
54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
else
// Si no es XON ni XOFF ... { if (ColaRecepcion. cargados > 900) // Si en la cola de entrada ya hay 900 caracteres ... { Envia (XOFF); // Enva un XOFF XOFFEnviado = 1; // Recuerda que se ha enviado un XOFF } carga (recibido, & ColaRecepcion); // En cualquier caso carga en la cola de recepcin el carcter recibido }
void interrupt IEnvia () // Rutina que atiende a la interrupcin que se produce cuando ha finalizado // el envo de un carcter enviado anteriormente { if (ColaTransmision. cargados == 0) Transmitiendo = 0; // Si la cola de transmisin est vaca, no hay que enviar nada ms if (! XOFFRecibido && ColaTransmision. cargados > 0) * pCanal = descarga (& ColaTransmision); // Si no se ha recibido XOFF y en la cola de transmisin hay algo, entonces // recoger un carcter de la misma y provocar su envo }
Contina
Universidade de Vigo EUITI 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
Sistemas embebidos
98
char RecibeCola () // Recoge de la cola de recepcin un carcter y lo devuelve. Si esta cola est // vaca, devuelve un 0. { if (XOFFEnviado && ColaRecepcion. cuantos == 100) // Si se ha enviado previamente un XOFF y ya hay suficiente espacio libre en // la cola de recepcin ... { * pCanal = XON; XOFFEnviado = 0; }
if (ColaRecepcion. cuantos > 0) // Si la cola de recepcin no est vaca ... return descarga (& ColaRecepcion); // Devuelve un carcter de la misma else return 0; // Si no, devuelve un 0 }
void EnviaCola (char dato) // Enva el carcter pasado por parmetro. Si hay una transmisin en curso, // lo guarda en la cola de transmisin { if (! Transmitiendo) // Si en este momento no hay transmisin en curso ... { * pCanal = dato; // Enva el carcter Transmitiendo = 1; // Indica que hay una transmisin en curso } else carga (& ColaTransmision, dato); // Si no, crgalo en la cola }
Contina
Sistemas embebidos
99
116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134.
main () { pCanal = (unsigned char *) 0x100; // Supongamos que el registro para recepcin/transmisin est mapeado en la // direccin 0x100; ColaRecepcion. cuantos = ColaRecepcion. carga = ColaRecepcion. descarga = 0; ColaTransmision. cuantos = ColaTransmision. carga = ColaTransmision. descarga = 0; // Inicializa las colas de recepcin y transmisin Instala (IRecibe, 3); Instala (IEnvia, 4); // Instala las rutinas para atender a las interrupciones
Sistemas embebidos
100
X0 D Q
X1 X2 X3 D Q D Q D Q G G G
X4 D Q G
X5 X6 X7 X8 Q D Q D Q D G G G
- Ejemplo: CRC-8
Sistemas embebidos
101
CRC-8 en lenguaje C
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
char m [] = {0x02, 0x1C, 0xB8, 0x01}; // Informacin a procesar n = 4; // Nmero de bytes en la matriz m i, j; // Contadores para bucles char CRC8 = 0; // Variable donde se va a calcular el CRC-8 auxiliar;
for (i = 0; i < n; i ++) // Procesando todos los bytes guardados en m ... { auxiliar = m [i]; // Copia el siguiente byte a procesar for (unsigned j = 0; j < 8; j ++) // Recorriendo los 8 bits de ese byte ... { if ((auxiliar & 0x01) ^ (CRC8 & 0x01)) // Si la XOR de entrada genera un 1 ... { CRC8 ^= 0x18; // Realiza tambin la XOR con los puntos de realimentacin CRC8 >>= 1; // Desplaza todos los biestables CRC8 |= 0x80; // Aade un 1 en el biestable ms significativo } else CRC8 >>= 1; // Si genera un 0, hay que desplazar el CRC auxiliar >>= 1; // Contina con el siguiente bit } }
Sistemas embebidos
102
Sistemas embebidos
103
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))
Sistemas embebidos
105
Configuracin de la recepcin
Habilita interrupciones alta prioridad Habilita interrupciones baja prioridad Flag interrupcin por recepcin Habilita interrupcin por recepcin Prioridad de interrupcin por recepcin Permite interrupciones de diferentes prioridades Habilita comunicacin Registro INTCON RCON PIR1 PIE1 IPR1 RCSTA RCREG Habilita bit 9 TXTA SPBRG Habilita receptor SPEN RX9 bit 7 GIEH IPEN RCIF RCIE RCIP CREN ADDEN FERR OERR RX9D Dato recibido SYNC BRGH Bit 9 recibido bit 6 GIEL bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Velocidad de comunicacin Overrun error Error de saturacin del receptor Framing error Error de trama de bits
Seleccin de velocidad
Sistemas embebidos
106
Configuracin de la transmisin
Habilita interrupciones alta prioridad Habilita interrupciones baja prioridad Flag interrupcin por transmisin Habilita interrupcin por transmisin Prioridad de interrupcin por transmisin Permite interrupciones de diferentes prioridades Habilita comunicacin Registro INTCON RCON PIR1 PIE1 IPR1 RCSTA TXREG TXTA Habilita bit 9 SPBRG Habilita transmisor TX9 SPEN Dato a transmitir TXEN SYNC BRGH TRMT TX9D Bit 9 a transmitir bit 7 GIEH IPEN TXIF TXIE TXIP bit 6 GIEL bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Velocidad de comunicacin
Seleccin de velocidad
Sistemas embebidos
107
#include <p18f452.h> rom char mensaje[] = "\nHola\nEste programa hace eco de " "toda la informacin recibida\n"; // Cadena de caracteres guardada en memoria de programa void enviaCaracter (char caracter) // Envio de un carcter por consulta { while (! PIR1bits. TXIF); // Espera mientras no podamos enviar otro carcter TXREG = caracter; // Suministra el carcter para serializarlo } char recibeCaracter (void) // Recepcin de un carcter por consulta { while (! PIR1bits. RCIF); // Espera mientras no se na recibido nada PIR1bits. RCIF = 0; // Este flag hay que ponerlo a cero en el programa return RCREG; // Devuelve el carcter recibido } void inicializaCanalConsulta () // Inicializa el canal serie para recepcin/transmisin por consulta { TRISCbits. TRISC6 = 0; // Lnea de transmisin en RC6 como salida TRISCbits. TRISC7 = 1; // Lnea de recepcin en RC7 como entrada SPBRG = 25; // Con un reloj de 4 MHz fija una velocidad de 9600 baud TXSTA = 0x24; // 8 bits y sin paridad, habilita transmisor RCSTA = 0x90; // Habilita receptor }
Contina
Sistemas embebidos
108
32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
void enviaCadenaROM (rom char * cadena) // Enva por el canal serie una cadena de caracteres almacenada en ROM { rom char * p; p = cadena; // Apunta al primer carcter while (* p) // Mientras no se haya llegado al final de la cadena ... { enviaCaracter (* p); // Enva un carcter p ++; // Para enviar luego el siguiente } }
void main (void) { char caracter; inicializaCanalConsulta (); // Inicializa los parmetros del canal enviaCadenaROM (mensaje); // Enva ese mensaje while (1) // Repite contnuamente ... { caracter = recibeCaracter (); // Espera a recibir un carcter y recgelo enviaCaracter (caracter); // Lo enva por el mismo canal } }