Autor Tema: problemas en la RX por interrupcion con 16f877A  (Leído 2588 veces)

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

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
problemas en la RX por interrupcion con 16f877A
« en: 13 de Enero de 2008, 19:38:57 »
Hola que tal, aca de nuevo con un problema extraño. estoy tratando de hacer la RX de datos de la PC hacia el PIC por interrupcion, pero sucede que en en el proteus funciona bien pero al momento de grabar en el pic no responde el programa, cosa rara. aca el susodicho programa:

Código: ASM
  1. LIST    P=16F877A
  2.                 INCLUDE<P16F877A.INC>
  3.  
  4.  
  5.                 __CONFIG _CP_OFF  & _WDT_OFF & _BODEN_OFF & _XT_OSC  & _WRT_OFF & _LVP_OFF & _DEBUG_OFF
  6.  
  7.         CBLOCK  20H
  8.         ENDC
  9.        
  10.         ORG             00H
  11.         GOTO    INICIO
  12.        
  13.         ORG             04H
  14.         GOTO    INTERRUPCION
  15.        
  16. INICIO
  17.  
  18.         BSF             STATUS,RP0              ;SELECCIONO BANCO-1
  19.         MOVLW   6H                              ;CONFIGURO LOS PINES COMO
  20.         MOVWF   ADCON1                  ;ENTRADAS DIGITALES
  21.         BCF             STATUS,RP0              ;SELECCIONO BANCO-0
  22.         CALL    LCD_Inicializa
  23.         CALL    Inicia_RX
  24.  
  25.        
  26.         BSF             STATUS,RP0
  27.         MOVLW   B'11000000'
  28.         MOVWF   INTCON
  29.         BSF             PIE1,RCIE
  30.         BCF             STATUS,RP0
  31.        
  32.         SLEEP
  33.         GOTO    $-1
  34.  
  35. INTERRUPCION
  36.         CALL    WAIT_RX
  37.         CALL    LCD_Caracter
  38.  
  39.         RETFIE
  40.        
  41.         INCLUDE<LCD_4BIT.INC>  
  42.         INCLUDE<USART.INC>
  43.         INCLUDE<RETARDOS.INC>
  44.        
  45.         END
como veran no es nada del otro mundo, pero cuando trato de sensar la rx de otra forma ahi si me visualiza el dato en el LCD. Aca la el programa que si funciona con el PIC:

Código: ASM
  1. LIST    P=16F877A
  2.                 INCLUDE<P16F877A.INC>
  3.  
  4.  
  5.                 __CONFIG _CP_OFF  & _WDT_OFF & _BODEN_OFF & _XT_OSC  & _WRT_OFF & _LVP_OFF & _DEBUG_OFF
  6.  
  7.         CBLOCK  20H
  8.         ENDC
  9.        
  10.         ORG             00H
  11.  
  12.        
  13. INICIO
  14.  
  15.         BSF             STATUS,RP0              ;SELECCIONO BANCO-1
  16.         MOVLW   6H                              ;CONFIGURO LOS PINES COMO
  17.         MOVWF   ADCON1                  ;ENTRADAS DIGITALES
  18.         BCF             STATUS,RP0              ;SELECCIONO BANCO-0
  19.         CALL    LCD_Inicializa
  20.         CALL    Inicia_RX
  21.  
  22. aca
  23.         call    WAIT_RX
  24.         CALL    LCD_Caracter
  25.         goto    aca
  26.  
  27.        
  28.         INCLUDE<LCD_4BIT.INC>  
  29.         INCLUDE<USART.INC>
  30.         INCLUDE<RETARDOS.INC>
  31.        
  32.         END

con el segundo programa si funciona la RX pero el problema es que yo necesito que se por interrupcion y no estar esperando a que se llene el buffer de rx, la subrutina de la USART esta sensando el bit RCIF, eso es lo que me extraña. Espero poder contar con su apoyo para resolver este dilema  :mrgreen:. El xtal es de 4Mhz, adjunto los archivos necesarios

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: problemas en la RX por interrupcion con 16f877A
« Respuesta #1 en: 13 de Enero de 2008, 21:26:56 »
ummmmm, muy interesante tu comentario, pero creo que no es asi ya que e buscado por el foro y encontre que otros usaron la rx de por interrupcion, ahora lo que no vi es que usarn sleep  :mrgreen:, podra ser ese el problema?. haber quien da mas  :D :D. Que se pronuncien los experto en el tema  :D :D :D, pero voy a hacer una prueba de descarte, en ves de sleep voy a poner un goto  $-1 y si salta la interrupcion, quiere decir que es el sleep, pero lo mas raros es que en el proteus con el sleep si funciona, pero ya sabemos que porteus es proteus y lo real es lo real  :D, Ahora mismos hago la prueba  :-/

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: problemas en la RX por interrupcion con 16f877A
« Respuesta #2 en: 13 de Enero de 2008, 21:45:14 »
Asi es amigo JCC40, acabo de ralizar la prueba y remplaze el sleep y goto  $-1 del primer programa por un nop y goto  $-1 y ahora si el pic recibe los datos de la PC por interrupcion, bueno es una lastima que no pueda hacerlo en modo sleep, bueno tendre que hacer una pequeña modificacion en mi programa, por que ya lo habia trabajado en modo sleep. Disculpas a todos por  haberles hecho perder su valioso tiempo con tonterias mias, Espero que nadie mas caiga como yo  :shock:, ahora el proteus se me callo bien feo, y pensar que en proteus funciona la RX con sleep y yo diceindome "en que estoy fallando" rompiendome el coco por eso. Ahora tendre en cuenta este detalle para cuando trate en trabajar la rx por interrupcion, buuuuu, Ahora estoy pensando en un emulador, pero creo que con el ICD2 clone estara bien para comenzar, pero lo malo que usa el RB6 y RB7 para debug y yo justo uso esa lineas para telado y LCD, bueno eso tiene solucion. Si alguien sabe de una liena de pics que trabaje la rx en modo sleep pasen la voz  :mrgreen: haber si los de microchip me crean un pic de esas caracteristicas  :-/ :-/ :-/

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: problemas en la RX por interrupcion con 16f877A
« Respuesta #3 en: 13 de Enero de 2008, 22:04:19 »
Una vez mas tiene razon mi estimado JCC40, acabo de chequear con mas detalle el datasheet del 16f877A y encontre las fuentes por la cual se sale del modo sleep:

1. External Reset input on MCLR pin.
2. Watchdog Timer wake-up (if WDT was enabled).
3. Interrupt from INT pin, RB port change or
peripheral interrupt.

y las interrupciones de los perifericos son las siguientes:

1. PSP read or write (PIC16F874/877 only).
2. TMR1 interrupt. Timer1 must be operating as an
    asynchronous counter.
3. CCP Capture mode interrupt.
4. Special event trigger (Timer1 in Asynchronous
    mode using an external clock).
5. SSP (Start/Stop) bit detect interrupt.
6. SSP transmit or receive in Slave mode (SPI/I2C).
7. USART RX or TX (Synchronous Slave mode).
8. A/D conversion (when A/D clock source is RC).
9. EEPROM write operation completion.
10. Comparator output changes state.

Other peripherals cannot generate interrupts since
during Sleep, no on-chip clocks are present.

justo es lo que mencionabas, solo acepta rx de la usart en modo sincrono-esclavo  :mrgreen:: esto me pasa por no leer con mas profundidad el datasheet  :D, me hubiera ahorrado mucho dolor de cabeza, pero entonces el proteus tiene un bug respecto a eso, ya que para el si se puede hacer rx en modo sleep  :mrgreen:

Bueno, con esto la duda queda despejada, ahora a hechar ojo a eso de nanowatt.


 

anything