Autor Tema: ensayo 3 PIC USART, problema con Retorno por recepcion  (Leído 2295 veces)

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

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
ensayo 3 PIC USART, problema con Retorno por recepcion
« en: 21 de Abril de 2009, 15:12:55 »
bueno resulta que me dio por empezar a probar la USART del 877A, y lo estoy haciendo de la siguiente manera, estoy simulando en proteus y tengo 3 pic asi:
                       
                                                  PIC1         PIC2

                                                  PIC3

el PIC1 esta configurado para TX/RX, siempre se encuentra enviando el contenido de una variable que se esta incrementando hacia el PIC3 que esta configurado como RX y mostrando por PORTB lo que recibe, el PIC2 lo tengo configurado solo TX, convierte  A/D y envia la conversion por la USART hacia el PIC1.

El problema que tengo es en el PIC1, este es el unico q envia y recibe, resulta que le tengo una condicion al recibir, si recibe un 5 debe mostrar en PORTB el 0xF0 por un segundo, si recibe un 10 debe mostrar en PORTB un 0X0F por un segundo y seguir con el curso normal del programa que es seguir enviando  hacia el PIC3 el registro que se incrementa y recibir la conversion A/D del PIC2 y mostrarla en PORTB

basicamente el problema esta en que cuando se cumple la condicion al recibir un  5 o un 10 el PIC no sigue con el curso normal..se queda mostrando lo que tiene la condicion

Código: [Seleccionar]
;ENVIA Y RECIBE SERIAL, CONDICIONES DE RECEPCION SEGUN DATO RECIBIDO


      List   p=16F877A   ;Tipo de procesador
      include   "P16F877A.INC"   ;Definiciones de registros internos

CBLOCK 0X20
INCRE
PDel0
PDel1
PDel2
W_TEMP
STATUS_TEMP
ENDC
     
org   0x00      ;Vector de Reset
      goto   Inicio

      org   0x04      ;Vector de interrupción
      goto   Inter

;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

TX_DATO   BCF   PIR1,TXIF   ;Restaura el flag del transmisor
               MOVWF   TXREG      ;Almacena el byte a transmitir
               BSF   STATUS,RP0
     
Tx_Dato_Wait   
BTFSS   TXSTA,TRMT   ;Byte transmitido ??
              GOTO   Tx_Dato_Wait   ;No, esperar
              BCF    STATUS,RP0 ;Si
              RETURN         

;******************************************************************************************
;Tratamiento de la interrupción


Inter clrf PORTB

PUSH MOVWF W_TEMP ;SALVO REGISTROS
SWAPF STATUS, W
MOVWF STATUS_TEMP   

btfss  PIR1,RCIF   ;Ha sido interrupción en la recepción ??
              GOTO   POP          ;No, falsa interrupción

              BCF    PIR1,RCIF    ;Si, restaurar el flag de interrupción
              MOVF   RCREG,W      ;Lee el dato recibido
     
              XORLW .5 ;pregunto
BTFSC STATUS,Z ;por medio de XOR si fue 5
GOTO CONDI1
MOVF RCREG,W
XORLW .10 ;pregunto
BTFSC STATUS,Z    ;por medio de XOR si fue 10
GOTO CONDI2

MOVF RCREG,W
MOVWF PORTB
GOTO POP

CONDI1 MOVLW 0XF0
MOVWF PORTB
CALL DEMORA
GOTO POP

CONDI2  MOVLW 0X0F
MOVWF PORTB
CALL DEMORA
GOTO POP

POP SWAPF STATUS_TEMP,W    ;REPONGO LOS REGISTROS
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
RETFIE
;*******************************************************************************************
;Programa principal

Inicio  clrf   PORTC     
      clrf   PORTB
      bsf    STATUS,RP0   ;Selecciona banco 1
      bcf    STATUS,RP1
clrf   PORTB      ;Puerta B salida
      movlw  b'10111111'
      movwf  TRISC      ;RC7/Rx entrada, RC6/Tx salida
     
      movlw   b'00100100'   
      movwf   TXSTA      ;TX en On, modo asíncrono con 8 bits y alta velocidad
      movlw   .25
      movwf   SPBRG      ;9600 baudios con Fosc=4MHz
      bsf     PIE1,RCIE   ;Habilita interrupción en la recepción
      bcf     STATUS,RP0   ;Selecciona banco 0
     
      movlw   b'10010000'
      movwf   RCSTA      ;USART en On, recepción contínua
      bsf     INTCON,PEIE   ;Activa interrupción de periféricos
      bsf     INTCON,GIE   ;Activa interrupciones
clrf    RCREG

;Loop   
     
;AQUI TU PROGRAMA
;para enviar datos sólo carga W con el valor a enviar y llama a la subrutina Tx_Dato
; Por ejemplo

INI INCF INCRE,1
MOVF INCRE,W
CALL TX_DATO
CALL DEMORA
GOTO INI



;Lo recibido te lo guarda automáticamente en el registro RCREG y te lo muestra por puerto B

;############################### 1 SEGUNDO #################################

DEMORA  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

      end         ;Fin del programa fuente
« Última modificación: 22 de Abril de 2009, 13:12:35 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: ensayo 3 PIC USART, problema con Retorno por recepcion
« Respuesta #1 en: 22 de Abril de 2009, 13:07:21 »
cabe anotar que no hay problemas con eso de stack underflow...lo que deberia hace el PIC1 al recibir dato de PIC2 seria:

1. ir al vector de interrupcion
2. guardad registros en variables temporales (PUSH)
3. pregunta si fue interrupcion por recepcion
    si>>repone el flag RCIF, se dirigie al paso 4
    no>> recuperar registros del paso 2 (POP) y luego retfie
4.mover RCREG a W
5. por medio de XORLW pregunto si es un 5
    si>>ejecuto CONDI1, luego goto POP y retfie
    no>>mover RCREG a W
6. por medio de XORLW pregunto si es un 10
    si>>ejecuto CONDI2, luego goto POP y retfie
    no>>como no fue ni 5 ni 10, mover RCREG a W y mostrarlo en portb, goto POP y retfie
7. al retornar de la interrupcion debe seguir enviando por la usart el valor del registro que se incrementa.
8. si recibe datos de PIC 2 , vaya a paso 1
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: ensayo 3 PIC USART, problema con Retorno por recepcion
« Respuesta #2 en: 22 de Abril de 2009, 13:11:29 »
me gustaria responder mejor pero hace 2 años que no toco el ASM (me mude al vecindario del C), lo bueno es que siempre hay gente que te apoya.

lo primero que debes hacer es eliminar ese bucle de 1 segundo DEMORA de la zona de interrupcion, utiliza banderines o flags ayudandote con bits para mencionar fuera del bucle de interrupcion cuando se produjo un 5 o un 10.

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com


 

anything