Manejo de Periféricos

Anuncio
Manejo de Periféricos
Lenguaje de Programación C
Envío y lectura de datos de un puerto de E/S.
Operaciones a nivel de bits (máscaras).
Manejo de Interrupciones.
Envío y lectura de datos de un puerto de E/S
„
Directiva del preprocesador
#include <dos.h>
„
Funciones de envío de datos
void outport (unsigned portid, unsigned value);
void outportb (unsigned portid, unsigned char value);
„
//envío de 2 bytes
//envío de 1 byte
Funciones de lectura de datos
unsigned inport (unsigned portid);
unsigned char inportb (unsigned portid);
//lectura de 2 bytes
//lectura de 1 byte
portid: dirección del puerto de E/S
1. Envío y Lectura de datos de un puerto de E/S
1
Operaciones a nivel de bits
Máscaras
„
Dada una secuencia de bits, a veces, es necesario leer o modificar
el valor de un bit en concreto (o varios bits).
„
Para esta tarea, se utilizan operaciones lógicas adecuadas que
toman como primer operando la secuencia de bits y como segundo
una secuencia predeterminada, denominada “máscara”.
2. Operaciones a nivel de bits. MASCARAS
Ejemplos de máscara
Ejemplo 1.
Ejemplo 2.
Dada una secuencia de 4 bits,
Dada una secuencia de 4 bits,
forzar el 1er bit a cero,
forzar el 2º bit a uno,
dejando el resto sin modificar.
dejando el resto sin modificar.
b3 b2 b1 b0
&
(AND)
1 1 1 0 (máscara)
b3 b2 b1 0
Para leer el valor de un bit en
concreto, se puede usar la
operación AND y una máscara
con todos sus bits a 0,
excepto el bit que ocupa la
posicion que quiero leer.
b3 b2 b1 b0
|
(OR)
0 0 1 0 (máscara)
b3 b2 1 b0
Para leer el valor de un bit en
concreto, se puede usar la
operación OR y una máscara
con todos sus bits a 1,
excepto el bit que ocupa la
posicion que quiero leer.
2. Operaciones a nivel de bits. MASCARAS
2
Manejo de Interrupciones (I)
Definir la estructura básica de una función en “C” que trabaja como ISR
(Rutina de Servicio de Interrupción). (Paso 1)
Instalación de la ISR al iniciar el programa principal:
„
„
‰
‰
„
Paso 2: Instalar el puntero a la función, que hará la atención de interrupción, en
el vector correspondiente.
Paso 3: Habilitar la línea de IRQ correspondiente.
Desinstalación de la ISR antes de finalizar el programa principal (Paso 4)
#include <dos.h>
void interrupt rutina_interrupcion(){
//acciones a realizar
}
// Paso 1
void main (void){
setvect (num_vector, rutina_interrupcion);
// Paso 2
// en este punto se activa la línea de interrupción. Paso 3
// Cuerpo del programa principal
setvect (num_vector, 0);
// Paso 4
}
3. Manejo de Interrupciones
Manejo de Interrupciones (II)
„
Para interceptar una rutina de interrupción ya existente:
‰
‰
‰
‰
‰
‰
Paso 1: Declarar un puntero para guardar el vector original.
Paso 2: Definir el prototipo de la nueva ISR.
Paso 3: Guardar el contenido original del vector.
Paso 4: Instalar la nueva ISR.
Paso 5: Restaurar el contenido original del vector.
Paso 6: En el cuerpo de la función de la nueva ISR invocar a la ISR original.
#include <dos.h>
void interrupt (*original_isr)(void);
void interrupt nueva_isr(void);
void main(void){
original_isr = getvect(num_vector);
setvect (num_vector, nueva_isr);
//Cuerpo del programa principal.
setvect (num_vector, original_isr);
}
// Paso 1
// Paso 2
// Paso 3
// Paso 4
// Paso 5
3. Manejo de Interrupciones
3
Manejo de Interrupciones (III)
void interrupt nueva_isr(){
//Cuerpo de la nueva ISR.
original_isr();
}
// Paso 6
nueva_isr(){
….
original_isr();
Num_vector
*nueva_isr
…..
}
original_isr(){
Tabla vectores
Interrupción
….
}
3. Manejo de Interrupciones
4
Descargar