Autor Tema: interrupciones en 12f629?????  (Leído 4364 veces)

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

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
interrupciones en 12f629?????
« en: 07 de Mayo de 2006, 17:22:23 »
hola, estoy empezando en esto de los PICs, y estoy muy interesado en programar un 12F629, y necesito habilitar la interrupcion, pero no se como. Programo en ensamblador (no se C aun), y no se como configurar el Bh ni como hacer funcionar la interrupcion cuando le pongo un 1 o un 0 a GPIO,2.  Si alguien puediera ayudarme

GRACIAS

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: interrupciones en 12f629?????
« Respuesta #1 en: 07 de Mayo de 2006, 18:14:27 »
Seguramente gran parte de esa informacion la encuentres en el datasheet, la cosa es ir mirando los registros que intervienen en lo que quieres hacer a la hora de hacer tu programa.
Tengo planeado hacer algo con ese micro ( en realidad el 12f675), pero estoy esperando que me llegue, asi que no puedo serte de mas ayuda por ahora.

Saludos!
Saludos desde Córdoba, españa

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
Re: interrupciones en 12f629?????
« Respuesta #2 en: 07 de Mayo de 2006, 18:28:43 »
gracias, el datasheet lo tengo, pero no me entero bien de como es, llevo probandolo de todas las maneras que se me ocurren, y nada, no encuentro la forma. lo que quiero es simplemente que cuando hay un cambio en la patilla GPIO2 u otra que yo defina, que salte la interrupcion, solo eso. el programa que estoy poniendo para probar es (haber si encontrais solucion):


   #include   <p12f629.inc>
   LIST       p=12F629

status   equ   03h
intcon   equ   0Bh
ioc      equ   96h
PDel0   equ 21h    ; variable de temporizacion
PDel1    equ   22h      ; variable de temporizacion
PDel2    equ   23h      ; variable de temporizacion
contador   equ   24h      ; variable que cuenta los minutos que faltan

   org      0000h      ; Origen de reset
   goto   inicio
   org      04h         ; origen de interrupcion

   movlw   b'00000010'
   movwf   GPIO
   
tmp   ; tiempo de 1 segundo para que permanezca encendido el led antes de irse de la interrupcion
       movlw     .14       ; 1 set number of repetitions (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set number of repetitions (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set number of repetitions (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
       retfie


;********** Declaracion de entradas y salidas **********   
inicio
   clrf   status   
   bsf      status,RP0   ; cambia a banco 1
   movlw   b'00010000' ; habilito la interrupcion
   movwf   intcon
   movlw   b'00110000'   ; 0,1 y 2 como salidas, 4 y 5 como entradas
   movwf   TRISIO
   movlw   b'00000100'
   movwf   ioc
   bcf      status,RP0   ; regresa al banco 0
   
bucle
   movlw   b'00000000'
   movwf   GPIO
   goto   bucle


end

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: interrupciones en 12f629?????
« Respuesta #3 en: 08 de Mayo de 2006, 01:45:02 »
Hola. Las interrupciones por cambio de estado, solo puden ser utilizadas en pines configurados como entradas. Si configuras un pin como salida, la interr automaticamente se desactiva por hardware.Por lo tanto GP2 debe ser entrada para que te funcione.

El bit INTCON,7 es el bit de habilitacion de interrupciones global, es decir que si este bit no esta seteado, ninguna interrupcion se producirá.

   #include   <p12f629.inc>
   LIST       p=12F629

status   equ   03h
intcon   equ   0Bh
ioc      equ   96h
PDel0   equ 21h    ; variable de temporizacion
PDel1    equ   22h      ; variable de temporizacion
PDel2    equ   23h      ; variable de temporizacion
contador   equ   24h      ; variable que cuenta los minutos que faltan

   org      0000h      ; Origen de reset
   goto   inicio
   org      04h         ; origen de interrupcion
   bcf   INTCON,GPIF   ;limpiar flag de interrupcion
   movlw   b'00000010'
   movwf   GPIO
   
tmp   ; tiempo de 1 segundo para que permanezca encendido el led antes de irse de la interrupcion
       movlw     .14       ; 1 set number of repetitions (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set number of repetitions (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set number of repetitions (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
       retfie


;********** Declaracion de entradas y salidas **********   
inicio
   clrf   status   
   movlw   0x07
   movwf   CMCON      ;GP<2:0> digitales
   bsf   status,RP0                   ; cambia a banco 1
                clrf            ANSEL
   movlw   b'10010000'               ; habilito la interrupcion
   movwf   intcon
   movlw   b'00110100'   ; 0,1 y 3 como salidas. 2,4 y 5 como entradas
   movwf   TRISIO
   movlw   b'00000100'
   movwf   ioc
   bcf   status,RP0                   ; regresa al banco 0
   
bucle
   clrf   GPIO
   goto   bucle


                end

Éxitos.
« Última modificación: 08 de Mayo de 2006, 01:51:57 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
Re: interrupciones en 12f629?????
« Respuesta #4 en: 08 de Mayo de 2006, 05:15:58 »
ok, muchas gracias por la respuesta, esta noche probare y comentare resultado, solo una duda por suriosidad, el micro que uso es el 12f629, y este no tiene entradas analogicas, ¿hace falta programar CMCON y ANSEL?

Lo dicho, esta noche pruebo
GRACIAS

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: interrupciones en 12f629?????
« Respuesta #5 en: 08 de Mayo de 2006, 11:02:06 »
Si posee entradas analogicas, ya que tiene un comparador, asi que si habra que configurar cmncon, los relacionados con el ADC no
Saludos desde Córdoba, españa

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
Re: interrupciones en 12f629?????
« Respuesta #6 en: 09 de Mayo de 2006, 14:56:02 »
uuuuuuuuuyyyyyyyyyyy, casi, ahora ya le hace caso a la interrupcion, pero no sale de ella, se queda dentro, ¿como sale del bucle? ¿en la simulacion tambien se queda dentro, por lo que supongo que sera fallo de programacion. y otra cosa rara, en el momento de alimenta el PIC, aveces se activa GPIO,0, ¿porque? al saltar la interrupcion se apaga, pero nunca deberia estar encendido

GRACIAS

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: interrupciones en 12f629?????
« Respuesta #7 en: 09 de Mayo de 2006, 16:54:56 »
Hola. El motivo por el cual el programa no sale de la interrupcion, es porque tenes habilitadas dos interrupciones en el mismo pin(GP2).
La primer interrupcion que tenes habilitada es la del INTCON.4 (INTE), que es una interrupcion exclusiva del pin GP2(parecida a la del RB0 de un pic16F84).Cuando GP2 cambia de estado, se produce la interrupcion y se setea el flag INTCON,INTF.
La segunda es la interrupt on change(IOC), en la cual seteas el pin GP2 para que produzca la interrupcion.Cuando GP2 cambia de estado, se produce la interrupcion y se setea el flag INTCON,GPIF.
Por lo tanto, dentro de la interrupcion, solo limpiabas 1 flag: el GPIF. Mientras que el otro flag(INTF) tambien se habia seteado, y no era limpiado por soft(en el programa).
El problema sucedio justo por utilizar el GP2 como bit de interrupcion.Como seteaste ambas interrupciones, ambas seteaban sus flags a la vez cuando GP2 cambiaba de estado, y uno de los dos flags(INTF) no era limpiado en el programa, provocando que una vez que el RETFIE habilitaba el INTCON,GIE, se vuelva a producir inmediatamente la interrupcion nuevamente, debido al flag "sucio"(INTF) que no era limpiado por soft.
Por lo tanto:
Modifique el programa para que utilice solo 1 de las 2 interrupciones en GP2. Dejé el INTE, es decir, la interrupcion exclusiva del pin GP2, y elimine el IOC en GP2 para que no se produzcan dos interrupciones por el mismo motivo.
Si bien es posible utilizar ambas interrupciones a la vez, en ese caso, el soft deberia limpiar ambos flags(el INTF y el GPIF) dentro de la rutina de interrupcion.
Tambien es posible utilizar el IOC solo, modificando facilmente el programa que aca te paso.
Espero haya quedado claro.

Código: ASM
  1. #include        <p12f629.inc>
  2.         LIST            p=12F629
  3.  
  4. PDel0           equ     21h     ; variable de temporizacion
  5. PDel1           equ     22h     ; variable de temporizacion
  6. PDel2           equ     23h     ; variable de temporizacion
  7. contador        equ     24h     ; variable que cuenta los minutos que faltan
  8. ;W_TEMP         equ     25h
  9. ;PCLATH_TEMP    equ     26h
  10. ;STATUS_TEMP    equ     27h
  11.  
  12.         org     0000h           ; Origen de reset
  13.         goto    inicio
  14.         org     04h             ; origen de interrupcion
  15. ;       MOVWF   W_TEMP
  16. ;       SWAPF   STATUS,W
  17. ;       CLRF    STATUS
  18. ;       MOVWF   STATUS_TEMP
  19. ;       MOVF    PCLATH, W
  20. ;       MOVWF   PCLATH_TEMP
  21. ;       CLRF    PCLATH
  22.  
  23.         movlw   b'00000010'
  24.         movwf   GPIO
  25.         bcf     INTCON,INTF     ;limpiar flag de interrupcion GP2(¡GP2 posee interr exclusiva!)
  26. tmp                             ; tiempo de 1 segundo para que permanezca encendido el led antes de irse de la interrupcion
  27.         movlw   .14             ; 1 set number of repetitions (C)
  28.         movwf   PDel0           ; 1 |
  29. PLoop0  movlw   .72             ; 1 set number of repetitions (B)
  30.         movwf   PDel1           ; 1 |
  31. PLoop1  movlw   .247            ; 1 set number of repetitions (A)
  32.         movwf   PDel2           ; 1 |
  33. PLoop2  clrwdt                  ; 1 clear watchdog
  34.         decfsz  PDel2,1         ; 1 + (1) is the time over? (A)
  35.         goto    PLoop2          ; 2 no, loop
  36.         decfsz  PDel1,1         ; 1 + (1) is the time over? (B)
  37.         goto    PLoop1          ; 2 no, loop
  38.         decfsz  PDel0,1         ; 1 + (1) is the time over? (C)
  39.         goto    PLoop0          ; 2 no, loop
  40. PDelL1  goto    PDelL2          ; 2 cycles delay
  41. PDelL2  clrwdt                  ; 1 cycle delay
  42.  
  43. ;       MOVF    PCLATH_TEMP, W
  44. ;       MOVWF   PCLATH
  45. ;       SWAPF   STATUS_TEMP,W
  46. ;       MOVWF   STATUS
  47. ;       SWAPF   W_TEMP,F
  48. ;       SWAPF   W_TEMP,W
  49.         retfie
  50.  
  51. ;********** Declaracion de entradas y salidas **********  
  52. inicio
  53.         movlw   0x07
  54.         movwf   CMCON           ;GP<2:0> digitales
  55.         bsf     STATUS,RP0      ; cambia a banco 1
  56.         movlw   b'10010000'     ; habilito la interrupcion
  57.         movwf   INTCON
  58.         movlw   b'00110100'     ; 0,1 y 3 como salidas. 2,4 y 5 como entradas
  59.         movwf   TRISIO
  60.         bcf     STATUS,RP0      ; regresa al banco 0
  61.    
  62. bucle
  63.         clrf    GPIO
  64.         goto    bucle
  65.  
  66.         end

Exitos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
Re: interrupciones en 12f629?????
« Respuesta #8 en: 09 de Mayo de 2006, 17:07:53 »
ok, ha quedado clariiiisimo, lo pruebo en un ratito y escribo resultado

MUCHAS GRACIAS

Desconectado electronicpic

  • PIC10
  • *
  • Mensajes: 23
Re: interrupciones en 12f629?????
« Respuesta #9 en: 09 de Mayo de 2006, 17:53:25 »
sois unos maestros en el tema, si señor, va perfecto, muchas gracias por todo

GRACIAS


 

anything