TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: SJD2 en 23 de Marzo de 2006, 05:00:00
-
hola, tengo que realizar una comunicacion rs232 en assembler a un pic 16f877 ya que es un ejercicio que me han mandado en clase. ya lo he hecho en c, pero no me quedan mas narices que hacerlo en assembler porque asi lo quiere mi profesor
alguien sabe como se hace o si tiene algun programa ya hexo me le puede mandar?
messiah desde santander
-
Escrito originalmente por SJD2
hola, tengo que realizar una comunicacion rs232 en assembler a un pic 16f877 ya que es un ejercicio que me han mandado en clase. ya lo he hecho en c, pero no me quedan mas narices que hacerlo en assembler porque asi lo quiere mi profesor
alguien sabe como se hace o si tiene algun programa ya hexo me le puede mandar?
messiah desde santander
A ver si nos entendemos.
Estas estudiando sobre la materia y quieres que te hagamos el código? Creo que debieras poner alguito de esfuerzo. Además es algo simple y está MUY BIEN explicado en las datasheet de los pics.
De hecho son los mismos pasos que haces en C solo que en assembly lo debes hacer todo más manualmente.
-
jeje.
lo estoy intentando pero no hay manera, ya tengo un programa hecho pero no me comunica y no se porque es. es programa es el siguiente:
;**********************************************************************************************************
;INTERMITENCIA DE NOMBRE Y APELLIDOS EN LA PRIMERA Y SEGUNDA LINEA RESPECTIVAMENTE
;**********************************************************************************************************
List p=16F877 ;Tipo de procesador
Include "P16F877.INC" ;Definiciones de registros internos
;**********************************************************************************************************
;DECLARACION DE VARIABLES
;**********************************************************************************************************
RECIBIDO equ 0x20 ;Guarda el carácter recibido por el serial
CLKIN equ .4000000 ;Frecuencia
BAUDIOS equ .9600 ;Velocidad de comunicación
T_MODO equ 1 ;Transmite primero bit LSB
R_MODO equ 1 ;Recibir primero bit LSB
T_Nbit equ 8 ;Transmite caracteres de 8 bits
R_Nbit equ 8 ;Recibe caracteres de 8 bits
Sbit equ 1 ;Transmite 2 bits de stop
Rs232_var equ 0x30
;**********************************************************************************************************
org 0x00 ;Vector de Reset
goto In
org 0x04 ;Salva vector de interrupción
include "p16lcd.inc"
include "rs232low.inc"
;**********************************************************************************************************
In: ;********Configuración de los BYTES de STATUS y OPTION
bsf STATUS,RP0 ;Pone el RP0 a 1 - Seleccionando BANCO 1 de datos
movlw b"11010000" ;Coloca el Byte de OPTION en W
;- Prescaler en 000
;- Prescaler al TMR0 - 0
;- Incremento TMR0 con flanco ascendente - 1
;- Pulsos por Fosc/4 - 0
;- Flanco ascendente para la interrupción - 1
;- Pull-up desactivadas - 1
movwf OPTION_REG ;Coloca el valor anterior de W en el literal OPTION_REG
movlw b"11111011" ;Establece en W, el Byte de configuración para PORTB
;RB0=Sensor (ENTRADA) - 1
;RB1= Recibir desde TX del serial(ENTRADA) – 1
;RB2= Enviar hacia RX del serial (SALIDA) - 0
movwf TRISB ;Se asignan los puertos RBi salvando W en TRISB
bcf STATUS,RP0 ;Pone el RP0 a 0 para regresar al BANCO 0 de datos.
;**********************************************************************************************************
; VISUALIZACION EN EL LCD
;***********************************************************************************************************
call LCDInit ;Secuencia de inicio del lcd
call LCDLine_1
movlw A"T"
movwf temp_wr
call d_write
movlw A"U"
movwf temp_wr
call d_write
movlw A" "
movwf temp_wr
call d_write
movlw A"N"
movwf temp_wr
call d_write
movlw A"O"
movwf temp_wr
call d_write
movlw A"M"
movwf temp_wr
call d_write
movlw A"B"
movwf temp_wr
call d_write
movlw A"R"
movwf temp_wr
call d_write
movlw A"E"
movwf temp_wr
call d_write
;********Inicialización pines de Rx y Tx ******************************************************************************************
bsf Txd_pin ;Línea de transmisión a "1" en RS232Low.Inc
bsf Rxd_pin ;Línea de recepción a "1" en RS232Low.Inc
bcf STATUS,RP0 ;Selecciona banco 0
;RECEPCION
;
;*************Apagamos todo
bcf PORTB,4 ;Apagamos pin RB4 de PORTB
bcf PORTB,5 ;Apagamos pin RB5 de PORTB
;***********************************************************************************************************
; TRANSMISION AL PC POR RS232
;***********************************************************************************************************
movlw 0x64 ;coloca el caracter
movwf Txdreg ;Carga W en Txdreg para transmitirlo
call TxD ;y lo transmite
;***********************************************************************************************************
; RECEPCION AL PIC POR RS232
;***********************************************************************************************************
; call RxD ;Llama la rutina de recepción en RS232Low.Inc
; movf Rxdreg,W ;Coloca el caracter recibido por Rxdreg en W
; movwf RECIBIDO ;y lo salva en RECIBIDO
NOP
END
;*********************************************************************************************
messiah desde santander
-
Hola amigo, el error debe estar en la rutina TxD pero no la anexaste.
Salu2
-
LA RUTINA DEL RS232 ES
;*******************************************************************************
; RS232LOW.ASM
;
;Conjunto de rutinas diseñadas para los dispositivos 16cxx que transmiten o reciben
;caracteres en serie. El programa principal que hace uso de estas rutinas tiene que
;cargar las siguientes variables:
;
;CLKIN: Frecuencia del oscilador expresada en ciclos/segundo
;BAUDIOS: Frecuencia a la que se desea comunicar
;T_MODO: Modo de transmisión, a "1" se transmite primero el bit LSB, a "0" el MSB
;R_MODO: Modo de recepción, a "1" se recibe primero el bit LSB, a "0" el MSB
;T_Nbit: Número de bits a transmitir, 7 u 8
;R_Nbit: Número de bits a recibir, 7 u 8
;Sbit: Número de bits de stop, 1 o 2
;
; Autor: Mikel Etxebarria
; (c) MICROSYSTEMS ENGINEERING
; c/ Gral. Concha Nº39 - 8º
; 48012 Bilbao Tfno. 4223263
;
;
CLKOUT equ CLKIN >> 2 ;Calcula duración del ciclo máquina
DELAY equ ((CLKOUT/BAUDIOS)/3)-.5 ;Calcula la duración del bit
DELAY_L equ low DELAY ;Calcula la parte baja de DELAY
DELAY_H equ high DELAY+1 ;Calcula la parte alta de DELAY
DELAY_START equ (DELAY/2)+DELAY ;Calcula duración del bit de inicio
DELAY_START_L equ low DELAY_START ;Calcula parte baja de DELAY_START
DELAY_START_H equ high DELAY_START+1 ;Calcula parte alta de DELAY_START
CBLOCK 0x30
Rs232_var ;Reserva de memoria. Se dará inicio en la primera
;posición libre disponibe según modelo
Rxdreg ;Registro de recepción
Txdreg ;Registro de transmisión
Cont ;Contador de bits transmitidos
Dlycnt_l ;Contador de delay parte baja
Dlycnt_h ;Contador de delay parte alta
ENDC
#define Txd_pin PORTC,6 ;Línea de transmisión
#define Rxd_pin PORTC,7 ;Línea de recepción
;*************************************************************************************
;RxD: Rutina de recepción. Trás detectar el bit de inicio, espera recibirse una
;palabra de 7 u 8 bits según la variable R_Nbit. Se recibe primero el bit de más peso
;o el de menos peso según la variable R_MODO
;*************************************************************************************
RxD clrf Rxdreg ;Borrar registro receptor
RxD_1 clrwdt ;Refresco del WDT
btfsc Rxd_pin
goto RxD_1 ;Espera el bit de inicio ("0"
call Delay_ini ;Tiempo de retraso del bit de inicio (1.5 del resto
;de los bits)
IF R_Nbit == 8
movlw 8 ;8 bits de datos
ELSE
movlw 7 ;7 bits de datos
ENDIF
movwf Cont
RxD_next bcf STATUS,C
IF R_MODO == 1
rrf Rxdreg,F ;Recibir primero el bit de menos peso
ELSE
rlf Rxdreg,F ;Recibir primero el bit de más peso
ENDIF
btfsc Rxd_pin ;Chequea bit de entrada y mira si es "1"
IF R_MODO == 1
IF R_Nbit == 8
bsf Rxdreg,7 ;Activa bit 7 de Rxdreg si nºbits=8 y 1º bit LSB
ELSE
bsf Rxdreg,6 ;Activa bit 6 de Rxdreg si nºbits=7 y 1º bit LSB
ENDIF
ELSE
bsf Rxdreg,0 ;Activa bit 0 de Rxdreg si 1º el bit MSB
ENDIF
call Delay_bit ;Espera entre bits
decfsz Cont,F ;Decrementa contador de nº de bits
goto RxD_next
call Delay_bit
IF Sbit == 2
call Delay_bit
ENDIF ;Espera 1 o 2 bits de stop
retlw 0
;**************************************************************************************
;TxD: Rutina de transmisión. Trás el bit de inicio se transmite la palabra contenida
;en el registro transmisor Txdreg seguido de uno o dos bits de stop según la variable
;Sbit
TxD
IF T_Nbit == 8
movlw 8 ;Transmisión de palabras de 8 bits
ELSE
movlw 7 ;Transmisión de palabras de 7 bits
ENDIF
movwf Cont
IF T_MODO == 1 ;Si se transmite 1º el LSB y la palabra es de
ELSE ;7 bits, el registro transmisor se desplaza
IF T_Nbit == 8 ;una posición a la izquierda para descartar
ELSE ;el 8º bit
rlf Txdreg,F
ENDIF
ENDIF
bcf Txd_pin ;Transmite el bit de inicio
call Delay_bit
TxD_next bcf STATUS,C
IF T_MODO == 1
rrf Txdreg,F ;Desplazamiento a dcha si 1º es el bit LSB
ELSE
rlf Txdreg,F ;Desplazamiento a izda. si 1º es el bit MSB
ENDIF
btfsc STATUS,C
bsf Txd_pin ;Si el carry es uno, se transmite un "1"
btfss STATUS,C
bcf Txd_pin ;Si el carry es cero se transmite un "0"
call Delay_bit
decfsz Cont,F ;Decrementa contador de bits
goto TxD_next
bsf Txd_pin ;Transmite un bit de stop
call Delay_bit
IF Sbit == 2
bsf Txd_pin ;Transmite segundo bit de stop si Sbit=2
call Delay_bit
ENDIF
retlw 0
;***************************************************************************************
;Delay_bit: Rutina de temporización para los intervalos entre bit y bit
Delay_bit clrwdt
movlw DELAY_H
movwf Dlycnt_h
Delay_bit_1 movlw DELAY_L
movwf Dlycnt_l
Delay_bit_2 decfsz Dlycnt_l,F
goto Delay_bit_2
decfsz Dlycnt_h,F
goto Delay_bit_1
retlw 0
;***************************************************************************************
;Delay_ini: Rutina de temprización para el bit de inicio en el modo de recepción. Esta
;temporización es de 1.5 con respecto a la del resto de bits. Así se consigue que el
;muestreo sea aproximadamente en el centro de cada bit recibido.
Delay_ini clrwdt
movlw DELAY_START_H
movwf Dlycnt_h
Delay_ini_1 movlw DELAY_START_L
movwf Dlycnt_l
Delay_ini_2 decfsz Dlycnt_l,F
goto Delay_ini_2
decfsz Dlycnt_h,F
goto Delay_ini_1
retlw 0
ME DA ERROR: Rs232_var
NO SE QUE ES LO QUE PASA
ALGUIEN ME PUEDE AYUDAR
MESSIAH DESDE SANTANDER
-
Una Pregunta: Porque utilizas una rituna para enviar en serial si el 16F877 ya trae el hardware para la comunicacion serial?...
-
Escrito originalmente por Nelson_s
Una Pregunta: Porque utilizas una rituna para enviar en serial si el 16F877 ya trae el hardware para la comunicacion serial?...
Las rutinas de usart por software son útiles cuando necesitas atender varios dispositivos diferentes entre sí y que sean todos con interfaz USART.
Por supuesto que si necesitas 1 conexion serie USART y tienes los pines de USART disponibles y no te complican tu diseño del circuito, entonces terminarás usando la USART por Hardware, pero hay casos en que como te dije atnes debes comunicarte con varios dispositivos a la vez y las usart por software solucionan muy bien este tema.
Saludos