Autor Tema: funcionamiento raro  (Leído 1943 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado jluisruelas

  • PIC10
  • *
  • Mensajes: 35
funcionamiento raro
« en: 28 de Octubre de 2014, 17:21:36 »
amigos que tal, tengo unos problemas bastante raros con el pic, pido su ayuda para que me orienten con posibles fallas, y es que en mi programa de repente no funciona como de be de ser, tengo una interrupcion por recepcion de datos, pero si le pongo el retfie no regresa de la rutina o se va para donde a nadie le importa y no funciona, le tengo que poner que salte al principio del programa para poder que funcione como debe de ser, uso una fuente usb, sera necesario añadirle capacitores para el ruido? o que me recomiendan?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: funcionamiento raro
« Respuesta #1 en: 28 de Octubre de 2014, 17:27:13 »
No me imagino que puede ser, pero lo mas seguro es que te pidan el codigo, y a lo sumo un esquematico, ni siquiera sabemos de que PIC se trata, de que recepcion de datos estas hablando, si luego alguno conoce respondera :)

Desconectado jluisruelas

  • PIC10
  • *
  • Mensajes: 35
Re: funcionamiento raro
« Respuesta #2 en: 28 de Octubre de 2014, 17:31:54 »
No me imagino que puede ser, pero lo mas seguro es que te pidan el codigo, y a lo sumo un esquematico, ni siquiera sabemos de que PIC se trata, de que recepcion de datos estas hablando, si luego alguno conoce respondera :)
gracias por responder amigo es un pic16f873a y la recepcion es usart
te pongo parte del codigo
Código: [Seleccionar]
LIST P=16F873A
#INCLUDE <P16F873A.INC>
__CONFIG _CP_ALL & _CPD_ON & _LVP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC

DATO EQU 0X21
VAR EQU 0X20
DATO1 EQU 0X22
DATO2 EQU 0X23
DATO3 EQU 0X24
DATO4 EQU 0X25
DATO5 EQU 0X26
DATO6 EQU 0X27
DATO7 EQU 0X28
DATO8 EQU 0X29
DATO9 EQU 0X2A
DATOA EQU 0X2B
DIR EQU 0X2C
C1 EQU 0X2D
ESTADO EQU 0X2E
INST EQU 0X2F
AUX EQU 0X30
AUX1 EQU 0X31
AUX2 EQU 0X32
AUX3 EQU 0X33
AUX4 EQU 0X34
CONT EQU 0X35
C2 EQU 0X36
PUERTO EQU 0X37
PIN EQU 0X38
REG EQU 0X39
ORG 0X00
GOTO MAIN
ORG 0X04
GOTO INTERRUMPE
MAIN ORG 0X05
CLRF STATUS
CLRF PORTA
        BCF STATUS,RP1      ;*******INICIA EN EL BANCO 1
        BSF STATUS,RP0      ;***************************
BSF PIE1,RCIE
MOVLW 0X06
MOVWF ADCON1
MOVLW B'11010000'
MOVWF TRISA
MOVLW B'11011111'
MOVWF OPTION_REG
MOVLW B'10000000'
MOVWF TRISC
MOVLW 0XFF
MOVWF TRISB
BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja)
MOVLW .31 ;valor para configurar 9600 Bauds
MOVWF SPBRG ;configura 9600 Bauds
BCF TXSTA,SYNC ;limpia bit SYNC (modo asíncrono)
BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisión)
BCF STATUS,RP0 ;*********REGRESA AL BANCO 0
BCF STATUS,RP1
CLRF PORTB
BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie)
BSF RCSTA,CREN ;Habilita recepción
BSF INTCON,GIE
BSF INTCON,PEIE
MOVLW 0X00
MOVWF PORTB
MOVWF PORTC
MOVWF PORTA
CLRWDT
MOVLW 0X40
MOVWF DIR
CALL LECTURA
MOVWF PORTB
CLRWDT
MOVLW 0X41
MOVWF DIR
CALL LECTURA
MOVWF PORTA
CLRWDT
MOVLW 0X42
MOVWF DIR
CALL LECTURA
MOVWF PORTC
NOP
MOVLW 0XFF
MOVWF AUX1
INICIO NOP
CLRWDT
GOTO ALARMA
IL BSF INTCON,GIE
MOVLW "&"
SUBWF DATO,W
BTFSS STATUS,Z
GOTO QW1
GOTO APA
QW1 MOVLW "#"
SUBWF DATO,W
BTFSS STATUS,Z
GOTO QW2
GOTO PORTON
QW2 MOVLW "%"
SUBWF DATO,W
BTFSS STATUS,Z
GOTO QW3
GOTO PUERTA
QW3 MOVLW "@"
SUBWF DATO,W
BTFSS STATUS,Z
GOTO INICIO
GOTO CONTRA
INTERRUMPE
BCF INTCON,GIE
CLRWDT
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO ;lo almacena en dato
CLRWDT
E5 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E5 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO1 ;lo almacena en dato
CLRWDT
E6 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E6 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO2 ;lo almacena en dato
CLRWDT
E7 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E7 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO3 ;lo almacena en dato
CLRWDT
E8 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E8 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO4 ;lo almacena en dato
CLRWDT
E9 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E9 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO5 ;lo almacena en dato
CLRWDT
E10 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E10 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO6 ;lo almacena en dato
BSF INTCON,GIE
BSF PORTA,5
RETFIE
lo que debe de hacer es estar comparando y si sucede una recepcion tomar una de las desiciones descritas despues de la etiqueta inicio pero si le pongo el retfie no hace nada

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: funcionamiento raro
« Respuesta #3 en: 28 de Octubre de 2014, 18:46:37 »
User software should ensure the appropriate interrupt bits are clear prior to enabling an interrupt

Imagino que es por eso. Deberias limpiar el Flag de interrupcion: BCF PIR1,RCIF , antes de habilitar la interrupcion general. ( Y salir de la misma )

Y no me convence el codigo xD Por que estas leyendo un flag que siempre esta activo y podrias usar el registro SFR para moverte entre todos los Registros DatosX si los tenes seguidos, me explico:
cada vez que entra por que esta lleno el buffer, entras a la interrupcion,
desactivas interrpcion global,
limpias flag,
guardas en donde apunta SFR (usando el registro INF 00h),
incrementas SFR,
preguntas si llego al limite datoA asi lo haces volver a dato1,
habilitas de nuevo las interrupciones,
salis de interrupcion.


Si necesitas todos los datos si o si, pone una bandera para que el programa principal entre cuando se leyeron los 10 datos y limpia la bandera para comenzar de nuevo
Es lo que haria yo pensandolo un poco. Pero si te anda asi Genial, cada uno con su forma de programar xD..
« Última modificación: 28 de Octubre de 2014, 18:53:21 por KILLERJC »

Desconectado jluisruelas

  • PIC10
  • *
  • Mensajes: 35
Re: funcionamiento raro
« Respuesta #4 en: 28 de Octubre de 2014, 19:11:58 »
User software should ensure the appropriate interrupt bits are clear prior to enabling an interrupt

Imagino que es por eso. Deberias limpiar el Flag de interrupcion: BCF PIR1,RCIF , antes de habilitar la interrupcion general. ( Y salir de la misma )

Y no me convence el codigo xD Por que estas leyendo un flag que siempre esta activo y podrias usar el registro SFR para moverte entre todos los Registros DatosX si los tenes seguidos, me explico:
cada vez que entra por que esta lleno el buffer, entras a la interrupcion,
desactivas interrpcion global,
limpias flag,
guardas en donde apunta SFR (usando el registro INF 00h),
incrementas SFR,
preguntas si llego al limite datoA asi lo haces volver a dato1,
habilitas de nuevo las interrupciones,
salis de interrupcion.


Si necesitas todos los datos si o si, pone una bandera para que el programa principal entre cuando se leyeron los 10 datos y limpia la bandera para comenzar de nuevo
Es lo que haria yo pensandolo un poco. Pero si te anda asi Genial, cada uno con su forma de programar xD..
ok amigo segun te entendi solo tendria que añadirle al codigo lo del flag y quedaria asi
Código: [Seleccionar]
INTERRUMPE
BCF INTCON,GIE
BCF PIE1,RCIE
CLRWDT
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO ;lo almacena en dato
E5 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E5 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO1 ;lo almacena en dato
E6 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E6 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO2 ;lo almacena en dato
E7 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E7 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO3 ;lo almacena en dato
E8 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E8 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO4 ;lo almacena en dato
E9 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E9 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO5 ;lo almacena en dato
E10 BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO E10 ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF DATO6 ;lo almacena en dato
BSF PORTA,5
BCF PIR1,RCIF
BSF INTCON,GIE
BSF PIE1,RCIE
RETFIE
lo pruebo asi y sigue haciendo lo mismo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: funcionamiento raro
« Respuesta #5 en: 28 de Octubre de 2014, 20:05:46 »
Código: [Seleccionar]
BCF PIR1,RCIF
BSF INTCON,GIE
BSF PIE1,RCIE

Al comienzo desabilita solamente la interrupcion global a no ser que tengas otra interrupcion Con lo cual te ahorras el modificar el PIE1,RCIE.
Al final esto no BSF INTCON,GIE
Si te fijas en el datasheet RETFIE te pone a 1 ese bit.
Y los CLRWDT ( o desabilitalo por ahora xD )
Y si aun asi ya no funciona, ya se me escapa de las manos o algo no estoy recordando xD

//EDIT

Ahora leyendo sobre el UART en el datasheet:
Flag bit RCIF is a read only bit, which is cleared by the hardware. It is cleared when the RCREG register has been read and is empty
En resumen no hace falta el BCF PIR1,RCIF :P
La unica q se me ocurre es la del  BSF INTCON,GIE
« Última modificación: 28 de Octubre de 2014, 20:26:56 por KILLERJC »

Desconectado jluisruelas

  • PIC10
  • *
  • Mensajes: 35
Re: funcionamiento raro
« Respuesta #6 en: 28 de Octubre de 2014, 20:33:38 »
Código: [Seleccionar]
BCF PIR1,RCIF
BSF INTCON,GIE
BSF PIE1,RCIE

Al comienzo desabilita solamente la interrupcion global a no ser que tengas otra interrupcion Con lo cual te ahorras el modificar el PIE1,RCIE.
Al final esto no BSF INTCON,GIE
Si te fijas en el datasheet RETFIE te pone a 1 ese bit.
Y los CLRWDT ( o desabilitalo por ahora xD )
Y si aun asi ya no funciona, ya se me escapa de las manos o algo no estoy recordando xD

//EDIT

Ahora leyendo sobre el UART en el datasheet:
Flag bit RCIF is a read only bit, which is cleared by the hardware. It is cleared when the RCREG register has been read and is empty
En resumen no hace falta el BCF PIR1,RCIF :P
La unica q se me ocurre es la del  BSF INTCON,GIE

gracias amigo ya quedo silucionado el prolema era que otra parte del codigo hacia conflicto

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: funcionamiento raro
« Respuesta #7 en: 28 de Octubre de 2014, 20:38:18 »
Una cosa mas hace un backup edl registro W y STATUS, cada vez que entres a una interrupcion, sino imaginate una interrupcion antes de un BTFSS STATUS,Z


 

anything