Professional Documents
Culture Documents
- 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).
Encapsulados
PIC18F452: QFN (Quad Flat No lead)
DIP
PLCC
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 3
Ciclos de reloj
SFRs
- Direcciones
0xF80 a 0xFFF
- Conexión USB o RS 232 con el computador de desarrollo, en el que se utiliza MPLAB IDE
(gratuito http://www.microchip.com).
USB al computador
Poten-
ciómetro
EEPROM
Pulsador S2
PIC 18F452
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 11
LEDs
Pantalla de cristal líquido Continúa
RS 232
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 13
Compilación, enlazado
con MPLAB C18
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 15
File ĺ New
Editar y guardar en ejemplo.c
Bibliotecas en c:\mcc18\lib
1. #include <p18f452.h>
2. Dirección Código Código int contador;
3. programa máqina ensamblador
4. int main ()
5. {
6. 0000e2 0e01 MOVLW 0x1 contador = 1;
7. 0000e4 0100 MOVLB 0x0
8. 0000e6 6f8a MOVWF 0x8a,0x1
9. 0000e8 6b8b CLRF 0x8b,0x1
10. 0000ea 6a93 CLRF 0x93,0x0 TRISB = 0;
11. 0000ec 518b MOVF 0x8b,0x0,0x1 while (contador <= 15)
12. 0000ee 0a00 XORLW 0x0
13. 0000f0 aee8 BTFSS 0xe8,0x7,0x0
14. 0000f2 d002 BRA 0xf8
15. 0000f4 358b RLCF 0x8b,0x0,0x1
16. 0000f6 d005 BRA 0x102
17. 0000f8 0e0f MOVLW 0xf
18. 0000fa 80d8 BSF 0xd8,0x0,0x0
19. 0000fc 558a SUBFWB 0x8a,0x0,0x1
20. 0000fe 0e00 MOVLW 0x0
21. 000100 558b SUBFWB 0x8b,0x0,0x1
22. 000102 e306 BNC 0x110
23. 00010e d7ee BRA 0xec
24. {
25. 000104 c08a MOVFF 0x8a,0xf81 PORTB = contador;
26. 000106 ff81
27. 000108 2b8a INCF 0x8a,0x1,0x1 contador ++;
28. 00010a 0e00 MOVLW 0x0
29. 00010c 238b ADDWFC 0x8b,0x1,0x1
30. }
31. 000110 0012 RETURN 0x0 }
Se
Se indican
guardan Información a Suma de
Se datos a
a partir de almacenar comprobación
indican almacenar
00E2
14 bytes
Activar casilla
Punto de ruptura
Siguiente instrucción
a ejecutar
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 27
Ejemplos:
a y b se guardan en
a y b comparten memoria posiciones diferentes:
1. int f () 1. int f ()
2. { 2. {
3. overlay int a = 3; 3. overlay int a = 3;
4. return a; 4. return a;
5. } 5. }
6. 6.
7. int g () 7. int g ()
8. { 8. {
9. overlay int b = 7; 9. overlay int b = 7;
10. return b; 10. b = f ();
11. } 11. return b;
12. 12. }
13. int main () 13.
14. { 14. int main ()
15. f (); 15. {
16. g (); 16. f ();
17. } 17. g ();
18. }
Ejemplo:
1. int doblePila (int x)
2. {
3. return 2 * x;
4. }
5.
6. int dobleEstatico (static int x)
7. {
8. return 2 * x;
9. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 29
Memoria de datos
Memoria interna organizada en bancos de 256 bytes
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 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. far int f;
2.
3. int main ()
4. { 1. MOVLB 0x0 ; BSR=0 para seleccionar
5. near int n; Compilación 2. ; el banco 0
6. f = 3; 3. MOVLW 0x3 ; Carga 0x3 en acumulador
7. n = 5; 4. MOVWF 0x8A,0x1 ; Copia acumulador en 0x8A
8. } 5. ; seleccionando banco con BSR
6. CLRF 0x8B,0x1 ; Pone a cero la dirección
7. ; 0x8B, seleccionando banco
8. ; con BSR
Project
Ļ
Build Options
Ļ
Project
Ļ
MPLAB C18
Ļ
Categories
Ļ
Memory Model
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 33
Mapa de memoria
de programa Pila
Comienzo después de
una inicialización (reset)
Dos tipos de
interrupciones:
de alta y baja prioridad
Memoria de
programa interna
Capacidad de direccionamiento
de hasta 2 Mb
Pila independiente:
- Hasta 31 direcciones de retorno
desde rutina o interrupción
Posible memoria de
programa externa
- Ejemplo:
1. #include <p18f452.h>
Según el fichero de mapa de memoria,
2. rom far char f;
la variable f se almacena en la dirección 0x000112
3. int main ()
4. {
TBLPTRU:TBLPTRH:TBLPTRL = 0x000112
5. f = 3;
6. }
Compilación
- 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; Error
9. }
ram ĺ ram char * strcpy (auto char * destino, auto const char * origen);
rom ĺ ram char * strcpypgm2ram (auto char * destino, auto const rom char * origen);
ram ĺ rom rom char * strcpyram2pgm (auto rom char * destino, auto const char * origen);
Ejemplo
1. rom far const char cadenaROM [] = "Hola";
2. char cadenaRAM [20];
3.
4. strcpypgm2ram (cadenaRAM, cadenaROM);
- También se pueden establecer en el MPLAB IDE, bajo Configure ĺ Configuration bits ...
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 39
1. union
2. {
3. struct
4. {
5. unsigned RD0:1;
6. unsigned RD1:1; Utilización en
7. unsigned RD2:1; un programa
8. unsigned RD3:1; Manejo como 8
9. unsigned RD4:1; 1. #include <p18f452.h>
señales digitales 2.
10. unsigned RD5:1;
11. unsigned RD6:1; 3. int main ()
12. unsigned RD7:1; 4. {
13. }; 5. int x;
14. struct 6. PORTDbits.RD0 = 1;
15. { 7. x = PORTDbits.RD2;
16. unsigned AD0:1; 8. }
17. unsigned AD1:1;
18. unsigned AD2:1;
19. unsigned AD3:1; Manejo como 8
20. unsigned AD4:1;
entradas analógicas
21. unsigned AD5:1;
22. unsigned AD6:1;
23. unsigned AD7:1;
24. };
25. } PORTDbits ;
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 Informática Industrial 2004-2005 Sistemas embebidos 41
1. #include <p18f452.h>
2.
3. // Definición de la función rutinaInterrupción que va a atender interrupciones
4. #pragma interrupt rutinaInterrupcion
5. void rutinaInterrupcion ()
6. {
7. if (INTCONbits.TMR0IF) // Si la interrupción 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 sección de código 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 sección de código normal
24.
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 43
1. #include <p18f452.h>
2.
3. #pragma udata zona1 = 0x100;
4. // Define una nueva sección en la memoria de datos que comienza
5. // en la dirección 0x100. A esta nueva sección se le asigna
6. // el identificador zona1
7.
8. int x, y, z;
9. // Dentro de esta sección 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. // Sección 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 Informática Industrial 2004-2005 Sistemas embebidos 49
1. #include <p18f452.h>
2.
3. #pragma udata overlay seccionCompartida1 = 0x100;
4. // Define una nueva sección en la memoria de datos que comienza
5. // 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 se
10. // almacenan a partir de 0x100, 0x102 y 0x104, respectivamente
11.
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
Visualizadores de 7 segmentos
abcdefg Ver
1111110 0
0110000 1
1101101 2
1111001 3
0110011 4
1011011 5
1011111 6
1110000 7
1111111 8 Cátodo común
1111011 9
1110111 A
0011111 b
Ánodo común
1001110 C
0111101 d
1001111 E
1000111 F
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 51
8 bits 4 bits
µC LCD µC LCD
DB0 DB0
DB1 DB1
DB2 DB2
DB3 DB3
DB4 RD0 DB4
DB5 RD1 DB5
DB6 RD2 DB6
DB7 RD3 DB7
E RA1 E
R/W RA2 R/W
RS RA3 RS
R/W R/W
E E
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 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. // Envía al LCD la instrucción codificada en el parámetro
11.
12. {
13. RS_LCD = 0; // Se va a enviar una instrucción
14. RW_LCD = 0; // En una operación 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 más significativos
17. E_LCD = 1;
18. E_LCD = 0; // Pulso de activación 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. }
Bit Significado
I/D Decrementa (0) o incrementa (1) la posición del cursor con cada escritura
S Sin desplazamiento (0) o con desplazamiento (1)
D Pantalla apagada (0) o en funcionamiento (1)
C Cursor invisible (0) o visible (1)
B Cursor fijo (0) o con parpadeo (1)
S/C Se desplaza el cursor (0) o toda la información (1) con cada escritura
R/L Desplazamiento a la izquierda (0) o a la derecha (1)
DL Bus de 4 bits (0) o de 8 bits (1)
N LCD de una fila (0) o de más filas (1)
F Juego de caracteres de 5x7 puntos (0) o de 5x10 puntos (1)
BF La pantalla está ocupada (1) o puede aceptar otra instrucción (0)
Inicialización
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 57
Conversión analógico/digital
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 59
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 61
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 línea de entrada
10.
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 oscilador
14.
15. ADCON1 = 0x8E;
16. // El resultado de la conversión se sitúa en los 10 bits menos significativos
17. // de ADRESH:ADRESL y sólo se utiliza la entrada analógica AN0
18.
19. while (1) // Ejecutar contínuamente ...
20. {
21. ADCON0bits.GO_DONE = 1; // Solicita una conversión
22. while (ADCON0bits.GO_DONE); // Espera mientras no finalice
23.
24. resultado = (float) ADRES * 5 / 1024;
25. // Medición de una señal unipolar entre 0 y 5V, utilizando un conversor
26. // de 10 bits de resolución
27.
28. Utilizar el resultado de la conversión
29. }
30. }
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 63
Continúa
Unidad de captura
Temporizador 3
Interrupción
Entrada
Captura
Selección de
temporizador Temporizador 1
Selección de
flanco
Ejemplo
Programa que utiliza la unidad de captura para reflejar en una variable duracion el intervalo de
tiempo entre dos flancos ascendentes en la línea RC2/CCP1
1. #include <p18f452.h>
2.
3. unsigned int duracion;
4. // Tiempo transcurrido entre dos flancos ascendentes de la línea RC2/CCP1
5.
6.
7. #pragma interrupt interrupcionComparacion
8. void interrupcionComparacion (void)
9. // Rutina que atiende a la interrupción 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 interrupción 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 interrupción
24. }
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 67
Tarjetas magnéticas
- Codificación estandarizada:
- Pista 2: número de tarjeta y fecha de caducidad, según ISO 7811/2-1985.
CLD
RCL
RDT 1 1 0 1 0
Paridad impar: 0
Dígitos de 4 bits: 10112
Banda
magnética
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 73
LRC (Longitudinal Redundancy Check): para comprobación de errores, o-exclusiva de todo lo leído,
desde SS hasta ES.
Lectores fotoeléctricos
Superficie
clara
Fotodiodo Fototransistor
CNY70
4K7
Vcc Salida
220
GND
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 75
Fotodiodo Disco
LEDs
Eje
Rodamientos
Disco codificado
Inserción sellada
Cable
Células fotoeléctricas
Emisor/receptor:
- Grandes distancias (20 m).
- Sensible a fallos de alineación.
Reflexión difusa:
- Hasta 30 cm.
- Sensible al color y tipo de superficie.
Canal A A
PIC18F452
Canal B B
Cambio de sentido
A
RA4/T0CKI
RC0/T1CKI
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 79
Alternativa: puerto en el que se produce una interrupción cuando cambia cualquier señal
A xor B
Códigos de barras
- Ejemplo: formato Code 39 o "Código 3 de 9".
- Cada carácter se codifica con 9 barras (5 negras y 4 blancas), 3 de las cuales son más anchas
que las demás.
- Entre caracteres consecutivos se inserta un pequeño espacio equivalente a una barra blanca.
* P O - 2 5 3 7 G *
Bit de
Período de
comienzo
Instantes de escritura reposo
T T T T T T T T T
T+ T T T T T T T T
2
Instantes de lectura
Instante de Instante de
sincronización sincronización
RS 485
Half-duplex
RS 422
Maestro Full-duplex
Esclavos
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 87
Protocolos maestro/esclavo
Respuesta
Esclavo 1 Esclavo 2 Esclavo 3
Calentamiento
Temperatura
Consigna
Sensor
Tiempo
Período de
autoajuste
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 89
Sensor de
humedad
Humidificador
Alimentación Salida
220 VAC Alarma
Control on/off
Histéresis
Actuación
Zona muerta
Dead band
ON
Zona de Zona de
calentamiento enfriamiento
OFF
Punto de consigna
Set point
Temperatura
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 91
Paridad: par, impar, ninguna Velocidad: 1.2, 2.4, 4.8, 9.6, 19.2 Kbaud
Dirección Parámetro
destino a modificar XOR
Orden
Maestro esclavo @ 0 9 2 0 1 3 0 0 0 7 9 * Cr
Comienzo
Operación Valor Fin orden
de escritura
Dirección Parámetro
origen modificado Valor Fin respuesta
Respuesta
Esclavo maestro @ 0 9 2 0 1 0 0 3 0 0 0 7 9 * Cr
Comienzo
Operación Operación XOR
de escritura correcta
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 93
Cálculo de la XOR
Nodo Parámetro
destino a leer XOR
Orden
Maestro esclavo @ 0 9 1 0 1 0 0 0 0 7 9 * Cr
Comienzo
Operación Valor Fin orden
de lectura No se utiliza
Nodo Parámetro
origen leído Valor Fin respuesta
Respuesta
Esclavo maestro @ 0 9 1 0 1 0 0 2 0 0 0 7 A * Cr
Comienzo
Operación Operación XOR
de lectura correcta
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 95
Protocolo XON/XOFF
- Quien recibe información solicita a quien le la envía que detenga temporalmente la transmisión,
enviándole el carácter XOFF (código ASCII 17).
- Quien recibe información le indica al transmisor que puede continuar mediante el carácter XON
(código ASCII 19).
Continúa
Continúa
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 97
Continúa
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 la
122. // 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ón
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. }
CRC-8 = X8 + X5 + X4 + 1
CRC-12 = X12 + X11 + X3 + X2 + X + 1
CRC-16 = X16 + X15 + X2 + 1
CRC-CCITT = X16 + X12 + X5 + 1
CRC-32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1
X1 X2 X3 X4 X5 X6 X7 X8
X0 D Q D Q D Q D Q D Q D Q D Q D Q
- Ejemplo: CRC-8
G G G G G G G G
Disparo para
desplazamientos
Entrada
de bits
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 101
CRC-8 en lenguaje C
Velocidad de transmisión
- Registro SPBRG
Configuración de la recepción
Habilita
Habilita interrupciones Flag interrupción
interrupciones baja prioridad Habilita interrupción
por recepción por recepción
alta prioridad
Prioridad de interrupción
por recepción
Permite Registro bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
interrupciones
INTCON GIEH GIEL
de diferentes
prioridades RCON IPEN
PIR1 RCIF
Habilita
comunicación PIE1 RCIE
Bit 9
IPR1 RCIP
recibido
RCSTA SPEN RX9 CREN ADDEN FERR OERR RX9D
RCREG Dato recibido
Habilita TXTA SYNC BRGH
bit 9
SPBRG Velocidad de comunicación
Configuración de la transmisión
Habilita
Habilita interrupciones Flag interrupción
interrupciones baja prioridad Habilita interrupción
por transmisión por transmisión
alta prioridad
Prioridad de interrupción
por transmisión
Permite Registro bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
interrupciones
de diferentes INTCON GIEH GIEL
prioridades RCON IPEN
PIR1 TXIF
Habilita
comunicación PIE1 TXIE
IPR1 TXIP
RCSTA SPEN
TXREG Dato a transmitir Bit 9 a
transmitir
TXTA TX9 TXEN SYNC BRGH TRMT TX9D
SPBRG Velocidad de comunicación
Habilita
bit 9
Habilita
transmisor 0 para Selección de 1 cuando finalizó
modo velocidad la serialización
asíncrono
Universidade de Vigo – EUITI Informática Industrial 2004-2005 Sistemas embebidos 107
Continúa