Beruflich Dokumente
Kultur Dokumente
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. }