Autor Tema: informacion sobre rs232 en assembler  (Leído 2427 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado SJD2

  • PIC10
  • *
  • Mensajes: 27
informacion sobre rs232 en assembler
« 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 santanderFlash

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: informacion sobre rs232 en assembler
« Respuesta #1 en: 23 de Marzo de 2006, 05:39:00 »
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 santanderFlash


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.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado SJD2

  • PIC10
  • *
  • Mensajes: 27
RE: informacion sobre rs232 en assembler
« Respuesta #2 en: 23 de Marzo de 2006, 06:23:00 »
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 santanderFlash

Desconectado poi5on

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 127
RE: informacion sobre rs232 en assembler
« Respuesta #3 en: 23 de Marzo de 2006, 09:14:00 »
Hola amigo, el error debe estar en la rutina TxD pero no la anexaste.

Salu2

Desconectado SJD2

  • PIC10
  • *
  • Mensajes: 27
RE: informacion sobre rs232 en assembler
« Respuesta #4 en: 23 de Marzo de 2006, 10:47:00 »
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"Giño
            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 SANTANDERFlash

Desconectado Nelson_s

  • PIC10
  • *
  • Mensajes: 5
RE: informacion sobre rs232 en assembler
« Respuesta #5 en: 23 de Marzo de 2006, 11:47:00 »
Una Pregunta: Porque utilizas una rituna para enviar en serial si el 16F877 ya trae el hardware para la comunicacion serial?...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: informacion sobre rs232 en assembler
« Respuesta #6 en: 23 de Marzo de 2006, 17:16:00 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)