Está en la página 1de 4

Manejo de Perifricos

Lenguaje de Programacin C
Envo y lectura de datos de un puerto de E/S. Operaciones a nivel de bits (mscaras). Manejo de Interrupciones.

Envo y lectura de datos de un puerto de E/S


Directiva del preprocesador
#include <dos.h>

Funciones de envo de datos


void outport (unsigned portid, unsigned value); void outportb (unsigned portid, unsigned char value);
//envo de 2 bytes //envo 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: direccin del puerto de E/S

1. Envo y Lectura de datos de un puerto de E/S

Operaciones a nivel de bits


Mscaras

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 lgicas adecuadas que toman como primer operando la secuencia de bits y como segundo una secuencia predeterminada, denominada mscara.

2. Operaciones a nivel de bits. MASCARAS

Ejemplos de mscara
Ejemplo 1. Dada una secuencia de 4 bits, forzar el 1er bit a cero, dejando el resto sin modificar. Ejemplo 2. Dada una secuencia de 4 bits, forzar el 2 bit a uno, dejando el resto sin modificar.

b3 b2 b1 b0 & (AND) 1 1 1 0 (mscara) b3 b2 b1 0 |

b3 b2 b1 b0 (OR) 0 0 1 0 (mscara) b3 b2 1 b0

Para leer el valor de un bit en concreto, se puede usar la operacin AND y una mscara con todos sus bits a 0, excepto el bit que ocupa la posicion que quiero leer.

Para leer el valor de un bit en concreto, se puede usar la operacin OR y una mscara con todos sus bits a 1, excepto el bit que ocupa la posicion que quiero leer.

2. Operaciones a nivel de bits. MASCARAS

Manejo de Interrupciones (I)


Definir la estructura bsica de una funcin en C que trabaja como ISR (Rutina de Servicio de Interrupcin). (Paso 1) Instalacin de la ISR al iniciar el programa principal:
Paso 2: Instalar el puntero a la funcin, que har la atencin de interrupcin, en el vector correspondiente. Paso 3: Habilitar la lnea de IRQ correspondiente. Desinstalacin 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 lnea de interrupcin. 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 interrupcin 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 funcin 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

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 Interrupcin

. }

3. Manejo de Interrupciones

También podría gustarte