[P7] [EJ 5] [bosquejo sol]

[P7] [EJ 5] [bosquejo sol]

de Valentina Pereira Ciaffone -
Número de respuestas: 1

Hola, pensé una solución con un compañero, la adjunto a continuación.

Pero planteo la idea general de lo que pensamos por si no se entiende:

Utilizamos el buffer para ir guardando los datos si es que estaba ocupada la salida (transmitiendose un dato por la misma).

Si no estaba ocupada, habilitamos las interrupciones y transmitimos la dirección del controlador. Ese out va a llamar a intsalida() y es en dicha interrupción que culminamos mandando el dato, y luego de eso mandamos todo lo que haya quedado en el buffer. Utilizamos dato como auxiliar, pero creemos que podemos ahorrar esa memoria usando los 7 bits disponibles de estado.

No sabemos si las habilitaciones y deshabilitaciones son correctas, lo que queríamos era habilitar para que se llame a intsalida, envie lo datos, y luego de eso habilitarlas las interrupciones para que se sigan recibiendo los datos.

Otra duda:

Se pueden utilizar funciones auxiliares, por ejemplo para no repetir el mismo codigo en cada caso? Gracias



En respuesta a Valentina Pereira Ciaffone

Re: [P7] [EJ 5] [bosquejo sol]

de Gustavo Brown -

Hola,

  Creo que entendiste mal el funcionamiento del sistema.

Al hacer un OUT al puerto 0x20 eso inicia la transmisión del dato. La finalización de dicha transmisión está señalada por la generación de la interrupción intSalida. Una vez recibida dicha interrupción es que podés iniciar el envío de un nuevo dato.

En tu solución dentro de intSalida ya realizas el OUT de todos los datos pendientes del buffer, cuando hay que esperar luego de cada OUT que se genere una interrupción que indique que el dato fue enviado.

Por otro lado el buffer lo estás "descargando" en el orden inverso al que fueron llegando los datos (como si fuese una pila y no una cola). Los datos se deberían enviar en el órden en que llegaron.

Luego sobre la rutina que atiende intEntrada, no es necesario llamar a disable() porque cuando se entra en la rutina las interrupciones están deshabilitadas. No importa que las habilites en el medio, cuando se genere una nueva interrupción igualmente la rutina va a arrancar con las interrupciones deshabilitadas.

Tampoco deberías habilitarlas en tu caso. Luego de habilitarlas lo único que hacés es actualizar algunas variables, realizar un OUT y terminar la rutina. Incluso al habilitarlas podría pasar que te interrumpan en ese momento antes de haber actualizado tu estado que es justamente lo que deberías tratar de evitar.

Sobre tu duda de utilizar funciones auxiliares, se pueden utilizar sin problemas.

Saludos,
  Gustavo