Interrupción en PIC18F4550 con Proton IDE

Hola Amigos, me llamo Raul, soy recien llegado saludo a todos los integrantes.

Queria saber si me pueden ayudar a resolver mi problema.....estoy ya confundido y no se donde esta el error de mi codigo che es SIMPLE pero no funciona.
en la serie 16F lo hace bien ( 16F876), llevando el mismo a la serie 18F no...!!!
les adjunto il codigo.....
Hace poco que estoy con BASIC PROTON y casi estoy arrepentido de haber comprado el programa, el forun de proton NO ES LO QUE ESPERABA....!!!.....paciencia.......!!
les agradesco anticipadamente por el tiempo perdido con me....

GRACIAS

RAUL.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                    Device=18F4550
                    Xtal = 10
                                     
                    Declare PLL_Req=On
                    
                    All_Digital = True
 ''config fuses''
      
      @XT_OSC
      @PWRTE_ON
      @CPD_OFF
      @WDT_OFF
      @BODEN_OFF
      @LVP_OFF
 ''''''''''''''''''
             
             
             TRISA=%00000000
             TRISB=%00000011
             TRISC=%00000000
             TRISD=%00000000
             TRISE=%00000000
            
            
            Symbol INTFf   = INTCON.1         ' RB0 External Interrupt Flag.
            Symbol INTEe   = INTCON.4         ' RB0 External Interrupt Enable.
            Symbol GIEe    = INTCON.7         ' Global Interrupt Enable.
            Symbol INTEDGg = INTCON2.6
            
                        On_Interrupt GoTo Interrupcion   ' Interrupción por externa (es la más rápida).
            
            GIEe = 1                          ' Activa interrupciones generales.
            INTEe = 1                         ' Activa la interrupción externa RB0/INT.
            INTEDGg = 1                       ' Hace que inicialmente la interrupción se dispare por flanco de subida.


             
            
            Dim x As Byte                    ' Variable X ---> contador de posición actual.
            x = 0                            ' variable puesta a "0"
 

                       ''Programa Principal ------|
              While 1 = 1
                PORTC = x                     ' El contenido de X se visualiza en el Puerto C a través de los LED.
              Wend
              End
'//////////////////////////////////////////////
                                
Interrupcion:                 '-------- Decodificador de Encoder --------------
         

    Context Save              ' Salva en contexto de los registros antes de operar con la interrupción.
    
    If PORTB.0=1    Then      ' Si RB0 se ha puesto a 1 (flanco de subida),

       INTEDGg = 0            ' entonces activar la siguiente interrupción por flanco de bajada.

       If PORTB.1=1 Then      ' Si RB1 está a 1,

          Inc x               ' entonces incrementar el contador X.

       End If

    End If
    
    If PORTB.0 = 0   Then     ' Si RB0 se ha puesto a 0 (flanco de bajada),

       INTEDGg = 1            ' entonces activar la siguiente interrupción por flanco de subida.

       If PORTB.1=1 Then      ' Si RB1 está 1,

          Dec x               ' entonces decrementar el contador X.

       End If

    End If
    
    INTFf = 0                  ' Borra el "flag" de la interrupción RB0/INT.

                               ' para poder permitir la siguiente interrupción.

    Context Restore            ' Restablece el contexto de los registros tal como estaban antes de la interrupción.
    
''////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 

Adjuntos

  • gestion Interrupt.zip
    1.2 KB · Visitas: 14
Última edición por un moderador:
bueno no programo en basic y no se cual es tu duda

pero el 18f4550 tiene el lio del PLL prescaler , hay que saberlo configurar por que si no tendremos problemas
 
Así nunca verás los incrementos o decrementos de la variable "x"
Cuando se da la interrupción por flanco de subida, se incrementa, pero en el flanco de bajada se decrementa.
Como todo el proceso se da en la interrupción, al salir, "x" se mantiene sin cambios.

Prueba de ésta forma:
PHP:
Device=18F4550
Xtal = 10MHz

Config_Start
    FOSC=HS,PBADEN=OFF,ICPRT=On
    FCMEN=Off,IESO=Off,PWRT=On,WDT=OFF,LVP=OFF
Config_End
                                     
Declare Create_Coff On

; Declaración de variables:
    Dim X   As Byte


Inicio:
    INTCON = %11010000              ; Activar interrupción por RB0
    INTCON2 = %10000000             ; Activar resistencias Pull-Up del puerto B
    
    TRISC = 0
    PORTC = 0
    
    Clear
    
    On_Hardware_Interrupt GoTo Servicio_Interrupciones
    
Programa:
    While 1 = 1
        PORTC = X
    Wend
    
Servicio_Interrupciones:
    Context Save
    
    If INTCONbits_INT0IF = 1 Then   ; Si es interrupción por RB0... (Flanco de bajada)
        Inc X                       ; Se incrementa "X"
        INTCONbits_INT0IF = 0       ; Se limpia el flag "INT0IF" (Registro INTCON bit 1)
    End If
    
    Context Restore
    
    End
Nota que se usaron instrucciones y configuraciones para Proton IDE.
 
Hola D@arkbytes....
Gracias por tu respuesta.....
agregue algunas configuraciones en los puertos porque provando con el PICsimulator IDE, los puertos A no eran configuradas.
El motivo por el cual NO funciona tampoco tu codigo es porque el interrrupt lo tengo que activar con el cambio del valore en una PORTB....!!!.. o la "0" o la "1"..... y tu no lo has puesto en tu programa.

Quizas no me he explicado bien, tratare de hacerlo ahora de lo que necesito.
tengo un codigo un poco pesante en el MAIN principal y un encoder conectado a PORTB.0 y PORTB.1 que incrementa o decrementa una variable.
quiero que cuando muevo el ENCODER se active un INTERRUPT para que en ese preciso momento funcione
solo un pequeno codigo para el encoder y deje de lado el MAIN principal.
esto es todo.
lo que realmente necesito es configurar el PIC18F4550 para que active los dos interrupt de los puertos B.0 y B.1.
este pequeno programa que he puesto es solo para probar la configuracion de los interrupt, no es el original.
espero me haya explicado hace mucho que no escribo espanol, pido disculpas por la gramatica....!!!

P.D: porque no escribes como te llamas....????... no es mas facil...???

Saludos a todos ...RAUL.
 
OK. El código que expuse si funciona, pero usa sólo una interrupción externa. (RB0)
Para activar también la interrupción por RB1, (INT1) debes establecer en 1 el bit 3 (INT1IE) del registro INTCON3
La prioridad se establece en el bit 6 (INT1IP)

Y para saber que ocurrió una interrupción INT1, (Por RB1) se debe verificar el estado del bit 0 (INT1IF)
Así como lo hice en el programa anterior pero fue con INT0IF.
Los bits INT0IF, INT1IF e INT2IF siempre se deben poner a 0 cada vez que se ponen en 1, ésto es cada vez que se activa su interrupción.

PD: Me llamo Ricardo.
 
OK....Gracias Ricardo, te aseguro que usando el PICsimulatorIDE non funciona......estare cometiendo algun error.....o no entiendo el funcionamiento de tu codigo.
Te pido por favor que me des un ejemplo del codigo de lo que me dices cuando tengas un poco de tiempo......ya estoy en TILT...no entiendo mas nada .....estoy confundido.
la serie 16F es mucho mas simple usar los interrupts...!!! pero no me sirve.
Te agradesco mucho por el tiempo que pierdes conmigo...!!!

Raul....
 
Tal vez no te funcione porque al principio mencionaste que estás usando Proton IDE, y el código que expuse no es para PICSimulator IDE.
Nota que se usaron instrucciones y configuraciones para Proton IDE.
Adjunto un ejemplo de interrupción por RB0 y RB1 con la simulación en Proteus 7.10.

Saludos.
 

Adjuntos

  • 18F4550 INT RB0 RB1.rar
    28 KB · Visitas: 28
GRACIAS OTRA VES Ricardo....!!!...

Perdoname si te hago perder tiempo..!! sos muy atento.

he visto entre mis CHIP que tengo solamente el PIC18F4520...!! no el 4550.
queria dejar de usar el programa simulador y hacerlo directamente su un broadboard.....

PREGUNTA de un millon de dolares....!! :D ..... cambia alguna cosa importante del codico si uso este MICRO...'???????.....
y quisiera saber porque pones en el codigo "
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If INTCONbits_INT0IF = 1 Then ; Si es interrupción por RB0... (Flanco de bajada)
Inc X ; Se incrementa "X"
INTCONbits_INT0IF = 0 ; Se limpia el flag "INT0IF" (Registro INTCON bit 1)
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
en ves de sentir los PUERTOS B.0 y B.1....???? es lo mismo...???

Raul
 
Saludos.
He visto entre mis chips, que tengo solamente el PIC18F4520, no el 4550.
Quería dejar de usar el programa simulador y hacerlo directamente su un breadboard.

Pregunta de un millon de dolares....!! :D ..... ¿Cambia alguna cosa importante del código si uso este micro?
El código puede funcionar en un 18F4520 porque también dispone de esas interrupciones.
Y quisiera saber por qué pones en el código:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If INTCONbits_INT0IF = 1 Then ; Si es interrupción por RB0... (Flanco de bajada)
Inc X ; Se incrementa "X"
INTCONbits_INT0IF = 0 ; Se limpia el flag "INT0IF" (Registro INTCON bit 1)
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
En vez de sentir los puertos B.0 y B.1 ¿Es lo mismo?
Porque si las interrupciones se dan cuando existe un cambio de estado sobre esos pines, resulta ilógico volver a comprobar su estado.
Y como los flancos cuando la interrupción se deba ejecutar son configurables, también se puede saber en que estado se encuentran.
 
OK.....GRACIAS Ricardo....!!
Ayer puse un 18f4520 en la broadboard y lo hice funcionar, ahora que mas o menos entendi como se configura un INTERRUPT gracias a tu ayuda, devo configurar todo en mi programa original para la gestion de un ENCODER que incrementa o decrementa la frequencia de salida de un V.F.O.
Espero que sea en grado de hacerlo dado que devo cambiare tambien el MICRO, mi proyecto trabaja con un 18F45K22.....seguramente tendre que leer muy bien el DATASHEET.

GRACIAS otra ves !!

RAUL.
 
Atrás
Arriba