Autor Tema: no puedo activar INT0 PORTB,0 (PIC18F66K80 )  (Leído 3201 veces)

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

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« en: 29 de Diciembre de 2017, 06:34:20 »
Código: ASM
  1. Que tal   si alguien me puede ayudar  quiero usar la interrupcion externa INT0  pic18f66k80, pero no  logro que el  pin PORTB0 sea entrada
  2. no me lee nada ya sea con interrupcion o  sin interrupcion usando los pines 0,1 y4 del PORTB no me leen nada dejo el codigo y simulacion proteus 8.6 para que me digan en que estoy mal, gracias.
  3.  
  4. [code]
  5. ;====================================================================
  6. ; interrupcion por RB0
  7.  
  8. ; Compiler:  MPASM (Proteus)
  9. ;====================================================================
  10.         LIST    P=18LF66K80
  11.         include <p18lf66k80.inc>            ; Include register definition file
  12.  
  13. ;====================================================================
  14.         CBLOCK 00H ; VER PAGINA 109
  15.         R_ContA                                         ; Contadores para los retardos.
  16.         R_ContB
  17.         R_ContC
  18.         ENDC
  19. ;====================================================================
  20.  
  21. ;====================================================================
  22. ; RESET and INTERRUPT VECTORS
  23. ;====================================================================
  24.         ORG             00
  25.         GOTO       INICIO
  26.         ORG             08H                             ; INTERUPCION DE HIGH PRIORIDAD
  27.         GOTO    ServicioInterrupcion
  28.         ORG         018H                        ; INTERUPCION DE LOW PRIORIDAD
  29. ServicioInterrupcion
  30.         movlb       03H
  31.         movlw   b'11111111'
  32.         xorwf   PORTC,F
  33.        
  34. FinInterrupcion
  35.         MOVLB   00H                             ; ACCES BANK0
  36.         BCF             INTCON,INT0IF  
  37.        
  38.         retfie
  39.  
  40. ;====================================================================
  41. ; CODE SEGMENT
  42. ;====================================================================
  43.  
  44. INICIO
  45.         MOVLW   B'01010100'
  46.         MOVWF   OSCCON
  47.         MOVLB   05H
  48.         CLRF            ANCON0
  49.         CLRF        ANCON1              ; PIN PORTB,0,1 Y 4 COMO DIGITALES
  50.                
  51.         MOVLB   03H
  52.         CLRF            TRISC           ; TRISC COMO SALIDA
  53.         CLRF            PORTC
  54.         MOVLW   B'11111111'     ; TRISB COMO ENTADA
  55.         MOVWF   TRISB
  56.        
  57.        
  58.         MOVLB   01H
  59.         BCF             RCON,IPEN               ; 0 = Disables priority levels on interrupts
  60.         MOVLB   00H
  61.         BSF             INTCON2,INTEDG0 ; Interrupcion por flanco de subida.
  62.        
  63.         MOVLW   B'10010000'
  64.         MOVWF   INTCON          ;  Habilita Interrupcion GLOBAL y INT0 EXTERNA.
  65.         MOVLB   03H
  66.        
  67. principal
  68.        
  69.         GOTO    principal
  70.  
  71.       END
[/code]
« Última modificación: 29 de Diciembre de 2017, 11:06:22 por proteus7 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #1 en: 29 de Diciembre de 2017, 13:39:49 »
El pin RB0 tiene las siguientes capacidades:

Para TRISB.0 = 0

RB0              data output.

Para TRISB.0 = 1

PORTB<0>    data input ; weak pull-up when RBPU bit is cleared.
AN10            A/D Input Channel 10 and Comparator C1+ input. Default input configuration on POR.
C1INA          Comparator 1 Input A.
INT0            External Interrupt 0 input.

Indistinto del TRISB.0
FLT0            Enhanced PWM Fault input for ECCPx.


Vemos que tenes que ese pin para cuando TRISB.0 esta en 1, puede funcionar con varios modulos. Entre ellos hay 2 que son analogicos como el AN10/C1INA, ademas como vas a ver tenes que en la descripcion del AN10, como Default la entrada es ANALOGICA y lo necesitamos digital. Entonces para asegurarnos debemos:

- Pasarlo a entrada ( esto ocurre en el POR pero nos aseguramos siempre en caso de reset)
- Pasarlo a digital ( Ponemos a 0 los bits del ANCON1 correspondiente de esos pines que serian los bits 0 al 2 )
  Con este ultimo punto, te aseguras que el modulo del comparador/ADC no funcionen, ya que necesitan que sean analogicas las entradsa
- Asegurarse de que el PWM del ( ECCP ) se encuentre apagado. Esto con el POR se encuentra ya de por si deshabilitado en el arranque.

entonces.... Solo necesitas agregar:

Código: ASM
  1. CLRF ANCON1, ACCESS

------------------------------------------------------

Código: ASM
  1. MOVLB   00H
  2.         MOVLB   03H

Estas confundido, los PIC16 tiene 2 formas de acceso a memoria, ACCESS y BANKED.

Si usas instrucciones asi ( como los pic16 ):

Código: ASM
  1. CLRF ANCON1

el compilador sobre entiende que es ACCESS, en ACCESS el mapeado de la RAM es de 0x00 a 0x5F (banco 0 unicamente), es decir siempre que uses ACCESS podes acceder al banco 0 desde las direcciones 0x00 al 0x5F, y tambien a los SFR que se ubican desde 0x60 a 0xFF, observa que no es necesario cambiar de bancos, los SFR se encuentran en una parte del banco 15, pero se puede acceder a los mismos sin necesidad de cambiar de banco para nada.

La otra opcion es usar BANKED, ejemplo ADDWF 0x10, W, BANKED, este hace caso al banco que vos seleccions poniendo en el BSR ( con el MOLVB )

Para que se entienda mejor voy a hacer un ejemplo y los comentarios te van a decir desde que direccion de memoria se toman los datos, para que veas la diferencia de ACCESS/BANKED:

Código: ASM
  1. MOVLB 0x00              ;Banco 0
  2.    ADDWF 0x30, W, ACCESS            ; Por ser ACCESS y la direccion RAM 0x30, suma lo que hay en 0x030 (banco 0) con W
  3.    ADDWF 0x30, W                          ; Lo mismo que el anterior, por cuestioenes de compatibilidad es lo mismo que la instruccion anterior
  4.    ADDWF 0xA3, W, ACCESS            ; Ahora la direccion es 0xA3 y es superior a 0x60, por ende accede a los SFR (banco 15) y el resultado es sumar el registro PIE3 (0xFA3) y W
  5.    ADDWF 0xA3, W, BANKED            ; En este caso al usar BANKED hace uso del valor de banco que le dimos por lo que suma el contenido de la direccion de memoria 0x0A3 + W
  6.    MOVLB 0x01                                ; Banco 1
  7.    ADDWF 0x30, W, ACCESS             ; Suma el contenido de 0x030 a W
  8.    ADDWF 0xA3, W, ACCESS             ; Suma el contenido de 0xFA3 (PIE3) a W
  9.    ADDWF 0xA3, W, BANKED             ; Suma el contenido de 0x1A3 a W

Si observas el codigo anterior, sin usar bancos tenes de 0x00 a 0x5F lugares para guardar tus cosas y usar las mas comunes, y podes acceder a todos los SFR sin cambiar de banco.
Ademas luego podes usar el BANKED para acceder por completo todo el banco. Si seleccionas el banco 1 al comienzo, podrias tener de 0x100 a 0x1FF ( 256 valores ) + de 0x00 a 0x5F (96) posiciones de RAM sin siquiera cambiar de banco, lo cual para un programa en ASM seguramente sea suficiente.

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #2 en: 30 de Diciembre de 2017, 11:31:16 »
Gracias killerjc ya lo solucione , se me habia pasado que los  sfr's estaban en el banco 15 y 14 , entonces al inicio solo puse MOVLB 0FH y con eso tengo acceso a la mayor parte de los registros, aunque  para limpiar el registo  ANCONx no me fuciono con acces ni banked, pero solo con BANKSEL y MOVLB 0FH.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #3 en: 30 de Diciembre de 2017, 11:48:50 »
No es necesario ir al banco 15 para que puedas acceder a los SFR (al menos en su mayoria o los mas comunes)

Ahora que reviso resulta que ANCONx estan en las direcciones 0x5C y 0x5D , es decir son menores a 0x5F, por eso no podes acceder con el ACCESS. y debes usar el BANKED

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #4 en: 30 de Diciembre de 2017, 13:54:27 »
No es necesario ir al banco 15 para que puedas acceder a los SFR (al menos en su mayoria o los mas comunes)

Ahora que reviso resulta que ANCONx estan en las direcciones 0x5C y 0x5D , es decir son menores a 0x5F, por eso no podes acceder con el ACCESS. y debes usar el BANKED

Pues use  (CLRF ANCON0, BANKED)  y no funcionó           

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #5 en: 30 de Diciembre de 2017, 14:48:28 »
Para usar el BANKED deberias haber realizado (probado y funciona):

Código: ASM
  1. MOVLB   0x0F
  2.         CLRF    ANCON0, BANKED
  3.         CLRF    ANCON1, BANKED

Primero seleccionamos el banco 15 para usar con el BANKED, luego procedemos a usar las instrucciones.

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #6 en: 31 de Diciembre de 2017, 00:22:56 »
Para usar el BANKED deberias haber realizado (probado y funciona):

Código: ASM
  1. MOVLB   0x0F
  2.         CLRF    ANCON0, BANKED
  3.         CLRF    ANCON1, BANKED

Primero seleccionamos el banco 15 para usar con el BANKED, luego procedemos a usar las instrucciones.

pues no funciona, de hecho al poner esto me marco error
Código: ASM
  1. MOVLB   0FH                     ; Banco 15     
  2.         CLRF            ANCON0,BANKED
  3.         CLRF    ANCON1,BANKED           ; PIN PORTB,0,1 Y 4 COMO DIGITALES

y al poner esto  si compiló bien
Código: ASM
  1. MOVLB   0FH                     ; Banco 15     
  2.         CLRF            ANCON0
  3.         CLRF    ANCON1          ; PIN PORTB,0,1 Y 4 COMO DIGITALES


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #7 en: 31 de Diciembre de 2017, 10:36:19 »
Vos programas en el proteus?

En el MPLAB que usa el compilador MPASM de microchip me lo compila correctamente y sin errores, el código que pase es totalmente válido y según el datasheet cumple con como es el funcionamiento del PIC.

Si lo haces del proteus tal ves su compilador siempre tome como default el BANKED por eso podés hacerlo así, pero no debería darte error ya que es una sintaxis válida. Pero eso depende del compilador usado. La verdad que nunca usé proteus para programar. Y pensé que usaba el compilador MPASM

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #8 en: 31 de Diciembre de 2017, 12:55:17 »
Asi es, programo en el proteus,  creo por eso me tira error. por cierto en los pic 18 usar goto $-1 para regresar una instruccion hacia arriba  ya no se puede? Porque  me tira error

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #9 en: 31 de Diciembre de 2017, 13:08:02 »
Se puede, pero el problema es que en los PIC18 el Contador de programa ( PC ) si o si debe ser par, es decir su ultimo bit es siempre 0. Ya que si observas las instrucciones son de 16 bits, es decir 2 bytes. Para mantener esa alineacion ( de palabra-16bits- o en 2 bytes) se lo hace avanzar/retroceder de a 2.

Por ende para lograr lo mismo que haces en un PIC16 con un GOTO $-1 en los PIC18 necesitas realizar un GOTO $-2 Observaras que por ejemplo si tenes un GOTO/MOVFF entre otros, antes (que ocupa 4 bytes) necesitas contarlo como 4 bytes y no 2.

Desconectado proteus7

  • PIC10
  • *
  • Mensajes: 11
Re:no puedo activar INT0 PORTB,0 (PIC18F66K80 )
« Respuesta #10 en: 31 de Diciembre de 2017, 18:51:14 »
OK, gracias, si funciono con el goto $-2