4.3 - Programación del puerto serial
Carlos Ivan Hernández Sánchez | 18112361
Carlos Ivan Hernández Sánchez | 18112361
La función de los puertos seriales es la de descifrar y procesar paquetes de datos binarios seriales. A través del lenguaje ensamblador tenemos que manipular las instrucciones necesarias para poder manejar y controlar la función de este puerto serial para los fines necesarios de nuestro programa.
En lenguaje ensamblador antiguamente se utilizaba de la siguiente manera:
Para hacer uso de este puerto en lenguaje ensamblador se puede utilizar la interrupción 14H para poder consultar el estado del puerto, leer o escribir a través del registro AH. Estas instrucciones se utilizaban para el antiguo procesador Intel 8086.
Los parámetros disponibles para el registro AH son los siguientes:
Se puede observar de manera mas detallada las opciones de entrada en la siguiente tabla:
Para inicializar este puerto desde el lenguaje ensamblador, se utilizan los siguientes parámetros de bits, dependiendo el tipo de datos ingresar. En todos los casos el registro DX debe contener el numero del puerto serie. El primero de todos ellos es el COM1, y se especifica en el registro como 00h.
Los parámetros de inicialización son codificados en una palabra de 8 bits:
Este tipo de puertos, junto con el puerto paralelo, son puertos que actualmente ya no se utilizan para fines prácticos, solo para fines didácticos. Uno de los tipos de puertos serial que mas fue utilizado fue el estándar RS-232. El estándar RS232 describe la conexión en serie entre un dispositivo terminal de datos (DTE) y un dispositivo de comunicación de datos (DCE) con sus propiedades eléctricas y mecánicas. Aunque el estándar solo define este tipo de conexión, la interfaz RS232 se ha establecido como un estándar general para la transmisión de datos en serie a distancias cortas. Se ha usado y sigue usándose para conectar las computadoras a dispositivos como terminales o módems.
El estándar RS232 soporta la trasmisión Full-Duplex.
En la actualidad , la simulación de este tipo de puertos se realiza a través de tarjetas de desarrollo como Arduino, Miuva o Raspberry en casos mas avanzados.
La placa de desarrollo Arduino se programa con lenguaje C, esto permite una mayor facilidad de comunicación y programación al utilizar un lenguaje de alto nivel.
PUERTO SERIAL PROGRAMADO EN ENSAMBLADOR CON TARJETA DE DESARROLLO MIUVA
;CARLOS IVAN HERNANDEZ SANCHEZ
LIST P = 18F4550 ;PIC a utilizar
INCLUDE <P18F4550.INC>
;************************************************************
;Configuración de fusibles
CONFIG FOSC = HS
CONFIG PWRT = ON
CONFIG BOR = OFF
CONFIG WDT = OFF
CONFIG MCLRE = ON
CONFIG PBADEN = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
CONFIG XINST = OFF
;***********************************************************
;Código
CBLOCK 0x080
recibido
ENDC
ORG 0x00 ;Iniciar el programa en el registro 0x00
movlw 0x00
movwf TRISB ;Puerto B como salida
movlw 0xFF
movwf TRISC ;CONF. PARA HABILITAR EUSART
;CONFIGURACIÓN PARA LA RECEPCIÓN DE DATOS
movlw D'12'
movwf SPBRG ;Configuración de baudios adecuada (9600)
bcf TXSTA,BRGH ;Low speed
bcf BAUDCON,BRG16 ;Selección de velocidad adecuada (8 bit) Solo SPBRG
bcf TXSTA,SYNC ;Puerto serial asíncrono
bsf RCSTA,SPEN ;Habilita puerto serial
bsf RCSTA,CREN ;Habilitamos la recepción
;CONFIGURACIÓN PARA EL ENVÍO DE DATOS
movlw D'12'
movwf SPBRG ;Configuración de baudios adecuada (9600)
bcf TXSTA,BRGH ;Low speed
bcf BAUDCON,BRG16 ;Selección de velocidad adecuada (8 bit) Solo SPBRG
bcf TXSTA,SYNC ;Puerto serial asíncrono
bsf RCSTA,SPEN ;Habilita puerto serial
bsf TXSTA,TXEN ;Habilitamos el envío
ESPERA
btfss PIR1,RCIF ;Esperamos a que esté lista la conversión
goto ESPERA ;Regresamos a espera
movff RCREG,recibido ;Almacenamos el dato recibido
movff recibido,PORTB ;Mostramos el dato recibido en el puerto B
movff recibido,TXREG ;Enviamos por TX el mismo dato recibido
bsf RCSTA,CREN ;Habilitamos la recepción de datos
goto ESPERA ;Regresamos a esperar la recepción de un dato
end
Sin embargo, la utilización de la tarjeta de desarrollo Miuva no es posible ser simulada, por lo cual para la demostración practica se utilizara el software de simulación Proteus, con el cual utilizaremos el PIC ATMEGA329P de Arduino para simular la conexión con el puerto serial RS232 a través de la programación en alto nivel y también en Ensamblador.
También se mostrara la simulación o ejecución física del uso de la entrada/salida serial del la placa Arduino.
UTILIZANDO EL PROGRAMA VIRTUAL SERIAL PORT
Para simular el puerto serial, es conveniente utilizar un programa simulador, ya que el puerto DB9 equivalente al puerto serial ya no existe y no es útil en las computadoras modernas.
Se utilizo el programa Virtual Serial Port para la simulación de dos puertos COM1 y COM2 para el puerto serial:
También utilizaremos una terminal de comunicaciones entre puertos COM. Para este ejemplo utilizaremos Termite. Con la cual controlaremos el puerto COM2 a 9600 baudios.
PUERTO SERIAL PROGRAMADO EN TARJETA DE DESARROLLO ARDUINO
//PROGRAMACION DEL PUERTO SERIAL CON ARDUINO
//CARLOS IVAN HERNANDEZ SANCHEZ
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
while(Serial.available() > 0)
{
String cadena = Serial.readStringUntil('\n');
cadena = cadena.substring(0, cadena.length());
Serial.println("Cadena: " + cadena);
if(cadena == "encender")
{
digitalWrite(13, HIGH);
Serial.println("Led Encendido");
}
else if(cadena == "apagar")
{
digitalWrite(13, LOW);
Serial.println("Led Apagado");
}
Serial.println();
cadena = "";
}
}
El siguiente programa fue simulado en Proteus de la siguiente manera:
Con este programa podemos encender y apagar el LED utilizando las palabras "encender" y "apagar" de la terminal serial.
La terminal nos muestra a través de mensajes el estado del led.
PUERTO SERIAL EN LENGUAJE ENSAMBLADOR CON ATMEGA328P
;----------------------------------------------------------------
;4.3 - PROGRAMACION DEL PUERTO SERIAL CON PIC ATMEGA328P
;CARLOS IVAN HERNANDEZ SANCHEZ
;--------------------------------------------------------------
.INCLUDE <m328pdef.inc>
.ORG 0X0000
LDI R16, 0B11111111 ;CARGA INMEDIATA DE UNA CONSTANTE DE 8BITS A R16
OUT DDRD,R16 ;ALMACENA A UN REGISTRO DE E/S
LDI R16, 0B11111111 ;CARGAMOS UNOS AL R16
OUT DDRB,R16 ; PASAMOS LA INFORMACION A DDRB QUE ES OTRO REGISTRO DE E/S
PROCESO: SBI PORTD,PD6 ;COLOCAMOS UN VALOR LOGICO 1 AL PIN PD6 DEL PUERTO D
CALL RETARDO ;LLAMA A UN RETARDO
CBI PORTD,PD6 ;COLOCA UN VALOR LOGICO 0 AL PIN PD6 DEL PUERTO D
CALL RETARDO ; SE LLAMA EL RETARD0
SBI PORTD,PD7
CALL RETARDO
CBI PORTD,PD7
CALL RETARDO
SBI PORTB,PB0
CALL RETARDO
CBI PORTB,PB0
CALL RETARDO
SBI PORTB,PB1
CALL RETARDO
CBI PORTB,PB1
CALL RETARDO
SBI PORTB,PB2
CALL RETARDO
CBI PORTB,PB2
CALL RETARDO
SBI PORTB,PB3
CALL RETARDO
CBI PORTB,PB3
CALL RETARDO
SBI PORTB,PB4
CALL RETARDO
CBI PORTB,PB4
CALL RETARDO
SBI PORTB,PB5
CALL RETARDO
CBI PORTB,PB5
CALL RETARDO
RJMP PROCESO
RETARDO: LDI R17,20
LOOP3: LDI R18,202
LOOP2: LDI R19,240
LOOP1: DEC R19
BRNE LOOP1
DEC R18
BRNE LOOP2
DEC R17
BRNE LOOP3
RET
El digrama del circuito queda de la siguiente manera: