Autor Tema: PIC 18F2550 Interrupciones se reinicia solo  (Leído 4143 veces)

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

Desconectado kgronerc

  • PIC10
  • *
  • Mensajes: 8
PIC 18F2550 Interrupciones se reinicia solo
« en: 04 de Septiembre de 2014, 15:52:17 »
Que tal amigos, soy nuevo en el foro, nunca he usado uno anteriormente por ende esta es mi primera vez, basicamente el programa que tengo es bastante sencillo, esta programado en PBP, el PIC, tiene conectado en los pines RB0:RB2 (INTO, INT1, INT2) tres transistores NPN, y ademas una resistencia pull up en cada uno de los pines. Basicamente lo que hace es detectar una interrupcion en cualquiera de estos 3 registros y sacar en el LCD un mensaje dependiendo del puerto. El problema se genera el momento de hacer reiteradas (es decir, varias) interrupciones, el PIC se queda colgado y me toca reiniciar el sistema. Les agradezco de antemano su gentil ayuda. El codigo:

DEFINE OSC 20
PAUSEUS 50
DEFINE LCD_DREG PORTB
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
Define ADC_BITS 10
DEFINE ADC_SAMPLEUS 50
ON INTERRUPT GOTO INTERRUPCION
UCON.3=0
UCFG.3=1
TECLA VAR WORD
BAN VAR BIT
BAN1 VAR BIT
VEC VAR BIT[16]
CONT VAR BYTE
TP VAR BYTE    
X VAR BYTE
Y VAR BYTE
X1 VAR BYTE
SUM VAR BYTE
B0 VAR BIT
B1 VAR BIT
B2 VAR BIT
BAN=0
BAN1=0
X=0
TP=500
SUM=0
b0=1
B1=1
B2=1
ADCON1=%00001110
ADCON2=%10000100
TRISA=%00011001
TRISB=%00000111
TRISC=%00110000
PORTA=0
PORTB=0
PORTC=0
PAUSE 1000
LCDOUT $fe, 1
LCDOUT $fe, 2, "AUTO RESET..."
PAUSE 3000
Symbol TIM0 = INTCON2.6
SYMBOL TIM1 = INTCON2.5
SYMBOL TIM2 = INTCON2.4
INTCON=%10010000
INTCON3=%11011000  
TIM0 = 0
TIM1 = 0
TIM2 = 0

INTERRUPCION:
    DISABLE
    PAUSE 500
    LCDOUT $fe, 1
    LCDOUT $fe, 2, "INTERRUPCION"
    PAUSE 500
    PORTA.2=1
    PAUSE 15
    PORTA.2=0
    PAUSE 50
    IF ((PORTB.0 = 0) AND (B0 = 0)) THEN
        LCDOUT $fe, 1
        LCDOUT $fe, 2, "B0 ACTIVADO"
        B0=1
        FOR CONT = 1 TO 5
            PORTA.2=1
            PAUSEUS 1000
            PORTA.2=0
            PAUSEUS 5000
        NEXT CONT    
        PAUSE 1000
    ENDIF
    IF ((PORTB.1 = 0) AND (B1 = 0)) THEN
        LCDOUT $fe, 1
        LCDOUT $fe, 2, "B1 ACTIVADO"
        B1=1
        FOR CONT = 1 TO 5
            PORTA.2=1
            PAUSEUS 2000
            PORTA.2=0
            PAUSEUS 5000    
        NEXT CONT
        PAUSE 1000
    ENDIF
    IF ((PORTB.2 = 0) AND (B2 = 0)) THEN
        LCDOUT $fe, 1
        LCDOUT $fe, 2, "B2 ACTIVADO"
        B2=1
        FOR CONT = 1 TO 5
            PORTA.2=1
            PAUSEUS 3000
            PORTA.2=0
            PAUSEUS 5000    
        NEXT CONT
        PAUSE 1000
    ENDIF
    IF (PORTB.0 = 1) THEN B0=0
    IF (PORTB.1 = 1) THEN B1=0
    IF (PORTB.2 = 1) THEN B2=0            
    INTCON=%10010000
    INTCON3=%11011000
    ADCON2=%10000100
    TRISA=%00010001
    TRISB=%00000111
    TRISC=%00000000
    ENABLE
    PAUSEUS 100
    GOTO CLAVE
END

Por favor si lguien tiene alguna idea, les agradezco,

Saludos
« Última modificación: 04 de Septiembre de 2014, 16:39:58 por kgronerc »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #1 en: 04 de Septiembre de 2014, 18:54:44 »
No conosco Basic.

¿Pero debes  o no limpiar banderas por interrupción cuando se producen???
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #2 en: 04 de Septiembre de 2014, 19:12:56 »
si

Desconectado kgronerc

  • PIC10
  • *
  • Mensajes: 8
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #3 en: 04 de Septiembre de 2014, 20:03:45 »
No conosco Basic.

¿Pero debes  o no limpiar banderas por interrupción cuando se producen???

Si, de todas formas las banderas las estoy haciendo cero nuevamente en los registros aqui:

 IF (PORTB.0 = 1) THEN B0=0
    IF (PORTB.1 = 1) THEN B1=0
    IF (PORTB.2 = 1) THEN B2=0            
    INTCON=%10010000
    INTCON3=%11011000

    ADCON2=%10000100
    TRISA=%00010001
    TRISB=%00000111
    TRISC=%00000000
    ENABLE
    PAUSEUS 100
    GOTO CLAVE

Muchas gracias por tu pronta respuesta, si tal vez tienes alguna otra idea te agradezco un monton, saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #4 en: 05 de Septiembre de 2014, 08:26:36 »
¿Donde está la función o rutina principal del programa?, no la veo.

No conozco tu lenguaje pero creo que con la estructuración actual de tu código fuente estas provocando un desbordamiento (overflow)  en la pila (stack) del micro, por eso solo te funciona durante un tiempo.
« Última modificación: 05 de Septiembre de 2014, 08:32:08 por dogflu66 »
Saludos desde Granada, España.

Desconectado kgronerc

  • PIC10
  • *
  • Mensajes: 8
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #5 en: 05 de Septiembre de 2014, 12:12:35 »
Estimado dogflu66, gracias por tu respuesta, actualmente no esta publicada la rutina principal, ya que el problema se provoca al momento de generar varias interrupciones, entonces es como que si el vector "INTERRUPCION" estuviera demasiado cargado, y su repetida ejecucion esta provocando un overflow. Que crees que pueda ser ?

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #6 en: 06 de Septiembre de 2014, 15:47:38 »
A ver si esto te sirve:

Código: [Seleccionar]
'PROGRAMA PARA PRACTICAR CON INTERRUP. por cambio de estado RB7:4
'On Interrupt - Interrupts in BASIC
'Turn LED on. - Interrupt on RB7:4 turns LED off.
'Program waits 0.5 seconds and turns LED back on.
'-------------------------------------------------------------------
Include "_FuncionesPic16F88.bas"
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
Symbol led0 = RB.0  'Se asigna nombre al RB0
Symbol led1 = RB.1  'Se asigna nombre al RB1
Symbol led2 = RB.2  'Se asigna nombre al RB2
Symbol led3 = RB.3  'Se asigna nombre al RB3
AllDigital  'Pin como digitales
TRISB = %11110000  'RB7:4 como entradas, resto salidas
Call _set_pullup(_pullup_on)  'Enable PORTB pullups
'Call _set_int_ext(_int_ext_l_to_h)  'Flanco interrupción ext. RB0 bajo a alto
'Call _enable_interrupts(_int_ext)  'Habilita interrupción ext. RB0
Call _enable_interrupts(_int_rb)  'Habiita interrupción por cambio en RB7:4
Call _enable_interrupts(_global)  'Habilita intrrup. global y perifericos
'-------------------------------------------------------------------
Dim _portb As Byte
WaitMs 100  'Espera se establice el estado de los puertos
_portb = PORTB  'Memoriza estado de las entradas del puerto B
'Rutina principal
void_main:
High led0  'Turn LED on
High led1  'Turn LED on
High led2  'Turn LED on
High led3  'Turn LED on
Goto void_main  'Do it forever
End                                               
'Interrupt handler
On Interrupt  'Define interrupt handler, disable interrupt
If _portb.7 <> PORTB.7 Then Low led0  'Turn LED off
If _portb.6 <> PORTB.6 Then Low led1  'Turn LED off
If _portb.5 <> PORTB.5 Then Low led2  'Turn LED off
If _portb.4 <> PORTB.4 Then Low led3  'Turn LED off
_portb = PORTB  'Actualiza estado de las entradas del puerto B
WaitMs 500  'Wait 0.5 Seconds
_rbif = 0  'Clear interrupt pin RB7:4 flag
Resume  'Return to main program, enable interrupt
Saludos desde Granada, España.

Desconectado kgronerc

  • PIC10
  • *
  • Mensajes: 8
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #7 en: 08 de Septiembre de 2014, 14:12:05 »
Estimado dogflu66, muchas gracias por tu pronta respuesta, ya solucione el problema, estaba malutilizando los registros INTCON2 e INTCON3. Te agradezco por tu gentil ayuda. Saludos

Desconectado kamisama

  • PIC16
  • ***
  • Mensajes: 151
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #8 en: 19 de Octubre de 2014, 19:47:25 »
Hola podrias aclarar un poco mas lo del INTCON y el problema de reinicio.

Tengo un 18f4550 que no se porque si lo toco se reinicia y si esta a 3.3v necesita que lo toque para que comience.

No se si alguien sabe de arduino pero alli tambien me tope con algo curioso, cuando hay un consumo repentino de energia aunque no este al mismo nivel de tension (consumo a 64v y toma de alimentacion de conversor dc-dc 12v y reg de 5v posterior) se pausa y despues sigue corriendo, pero se pausa un o unos segundos.

Cosas locas, que antes no me pasaban, jajajaja

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #9 en: 20 de Octubre de 2014, 06:15:41 »
Los arduinos que han pasado por mis manos, aunque el pcb era de fabrica, estos pcbs se podía observar claramente que no habían sido ruteados por un profesional, por lo que depende en que ambiente se utilicen pueden dar problemas de interferencias.

Si este no es tu caso y los componentes están bien, posiblemente la fuente que estés utilizando no sea la correcta y necesites aumentar la calidad de esta.

Estos son los principales fallos, esto no quiere decir que pueda ser cualquier otra cosa.
Saludos desde Granada, España.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: PIC 18F2550 Interrupciones se reinicia solo
« Respuesta #10 en: 20 de Octubre de 2014, 06:48:15 »
tendras enchufado bien el pin del MCLR no?? Yo cuando empece me ocurrio lo mismo, era porque tenia el pin MCLR sin enchufar y al acercar el dedo lo mismo se encendia que se apagaba por el ruido que produce esto.


 

anything