Dúvida Interupção no GPIO3 do 12F675

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida Interupção no GPIO3 do 12F675

Mensagempor Andre_Cruz » 03 Jan 2010 17:56

Tenho um 12F675 programado em ASM, lê um botão no GPIO3 e aciona três saídas GPIO0, GPIO1 e GPIO2, rodando a 20 MHz.

Estou convertendo de ASM para C no hitech.

Estou com problemas para gerar a interupção de mudança de estado no GPIO3.

Segue o fonte !

Código: Selecionar todos

#include <pic.h>                           

// Configurar as opcoes de operacao

__CONFIG(HS & WDTDIS & PWRTDIS & BORDIS & MCLRDIS & INTIO);

//funcao de tratamento da Interrupt Service Routines
void interrupt isr() {

/*
   CADA INT. TIMER1 A CADA 0,1S
*/
//OK
   if (TMR1IF) {
      TMR1IF = 0;         // LIMPA FLAG DA INT. DE TIMER1
      TMR1L = 0x44;
      TMR1H = 0x24;         // REINICIA TIMER 1 COM 62500
   }

   if (GPIF) {
      GPIF = 0;
   
      GPIO0 = 1;
      GPIO1 = 1;
      GPIO2 = 1;
   }

//OK
   if (T0IF) {
      T0IF = 0;
      TMR0 = 36;            //REINICIA TIMER 0
   }


}
void main() {

   TRISIO = 0b00001000;   //GPI02 COMO ENTRADA


//INTCON

   GIE = 1;                  //CHAVE GERAL LIGADA
   PEIE = 1;                  //HABILITADA INT. DE PERIFERICOS
   T0IE = 1;                  //INT. DE TIMER0 HABILITADA
     INTE = 0;                  //INT. DE GPIO2 DESHABILITADA
   GPIE = 1;                  //HABILITADA INT. DE MUDANCA EM GPIO
   T0IF = 0;                  //FLAG DA INT. DE TIMER0
    INTF = 0;                  //FLAG DA INT. DE GPIO2
   GPIF = 0;                  //FLAG DA INT. DE MUDANCA EM GPIO

   
//OPTION_REG

   GPPU = 1;                  //PULL UP HABILITADO
   INTEDG = 0;                  //0 BORDA DE SUBIDA 1 BORDA DE DESCIDA
   T0CS = 0;                  //TIMER0 INCREMENTADO PELO CLOCK
   T0SE = 1;                  
   PSA = 0;                  //PRESCALER NO TIMER0
   PS2 = 0;
   PS1 = 0;
   PS0 = 1;                  // 1:4
      
//CMCON

   COUT = 0;                  //VIN < VOUT
   CINV = 0;                  //SAIDA NAO INVERTIDA
   CIS = 0;                  //VIN- LIGADA NO CIN-
   CM2 = 1;                  
   CM1 = 1;
   CM0 = 1;                  //COMPARADOR DESLIGADO

//ADCON0
   
   ADFM = 0;                  //RESULTADO JUSTIFICADO A DIREITA
   VCFG = 0;                  //TENSAO DE REFERENCIA VDD
   CHS0 = 0;
   CHS1 = 0;                  
   
   ADON = 0;                  //CONVERSOR AD DESLIGADO

//ANSEL
   
   ANS3 = 0;                  
   ANS2 = 0;
   ANS1 = 0;
   ANS0 = 0;                  //TODOS OS PINOS COMO IO DIGITAL

//IOC

   IOCB5 = 0;
   IOCB4 = 0;
   IOCB3 = 3;
   IOCB2 = 0;
   IOCB1 = 0;
   IOCB0 = 0;
                        //HABILITA A INT. DE GPIO3
//WPU

   WPU5 = 0;
   WPU4 = 0;
   WPU2 = 0;
   WPU1 = 0;
   WPU0 = 0;

//T1CON

   TMR1ON = 1;   
   TMR1CS = 0;   
   T1SYNC = 0;   
   T1OSCEN = 0;   
   T1CKPS0   = 1;
   T1CKPS1 = 1;   
   TMR1GE = 0;   

   TMR1IE = 1;

//VRCON

   VREN = 0;
   VR0 = 0;
   VR1 = 0;
   VR2 = 0;
   VR3 = 0;

   
   TMR0 = 36;

   while (1) {

   }//while
}


Em ASM funciona em C não consigo gerar a interupção.

Agradeço a ajuda de todos!

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ze » 04 Jan 2010 09:52

volta pro asm. rs
GPPU = 1; //PULL UP HABILITADO
bom até ontem a tarde habilitar o pullup geral deste uC era GPPU=0
TRISIO = 0b00001000; //GPI02 COMO ENTRADA
IOCB3 = 3;
tem algo estranho aí.

Pro caso do GPIO3 que tal se colocasse pullup externo?

Veja o asm que saí deste c e compare com o teu.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Andre_Cruz » 04 Jan 2010 12:56

lellis,

Realmente GPPU habilita em 0, e IOC3 = 3 não existe apenas IOC3 = 1.
Mesmo fazendo as correções não entra na interupção.
As I/Os esta configurada corretamente apenas o comentario esta errado.
Tentei com o pullup externo e nada.

A configuração em ASM:
Código: Selecionar todos

CONFIG_CPU 
; Inicia a configuração da CPU         
      BANK1
      CLRF    ANSEL                  

      MOVLW     B'00001000'         
      MOVWF   TRISIO                 

      MOVLW   B'01101000'            
      MOVWF   INTCON               
                                  
          MOVLW    B'10010001'            
         MOVWF    OPTION_REG
                              
      BSF      PIE1,TMR1IE
                              
                MOVLW   B'00001000'
      MOVWF   IOC                  

      MOVLW   B'00001000'
                MOVWF   WPU                  

      BANK0

      MOVLW   0x07               
      MOVWF   CMCON             

      CLRF    ADCON0                 
         
      MOVLW   B'00110000'            
      MOVWF   T1CON
                              
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ze » 04 Jan 2010 15:14

desculpa minha burrice, mas como sabes que "não" entrou na isr se lá ela apenas faz GPIOx=1? que tal GPIO^=0xff;delay(algo); while(GPIO3); pra ver?

se mula... ou mehor simula. tem como fazer com o mplab só que num sei como gerar um estímulo nos pinos (pregui) . taí uma boa oportunidade pra alguém que saiba nos ensinar. depois disto, coloque um break point nesta isr pra ver.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 04 Jan 2010 15:20

lellis, esse 683 é o primo rico do 12f629.
o GP3 é o MCLR, não tem nada associado a ele, somente entrada ou MLCR, nada de saida...
a interrupção por mudança de estado é o GP2,,,,

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Andre_Cruz » 04 Jan 2010 18:56

lellis,

Eu sei que ele não entrou na ISR, justamente porque não seta os pinos GPIO0, GPIO1 e GPIO2, que esta dentro da interupção IOC, associado ao pino GPIO3.

Estou falando isso baseado nas simulações feitas no proteus !
Mas o código ASM funciona a mesês !

fabim,

Estou tentando usar a interupt on change, o registrador IOC, página 23 item 3.2.2 no data sheet do PIC 12F675, se o registrador permite configurar a interupção ela deve funcionar ! Eu acho.

Valew vou ler mió o xitiii
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor aguivone » 06 Jan 2010 20:18

veja isso:

TRISIO = 0b00001000; //GPI02 COMO ENTRADA

agora veja isso:

TRISIO = 0b00000100; //GPI02 COMO ENTRADA (agora sim)

acho que não precisa dizer mais nada né !!!
aguivone
Bit
 
Mensagens: 35
Registrado em: 08 Dez 2009 13:12

Mensagempor Andre_Cruz » 07 Jan 2010 07:45

aguivone,

TRISIO = 0b00001000; //GPI02 COMO ENTRADA

Esta apenas com o comentário errado, a intensão é configurar o GPIO3 como entrada e os demais pinos como saída, e usar a IOC no GPIO3.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 07 Jan 2010 07:57

Código: Selecionar todos
GP3/MCLR/VPP GP3 TTL — GPIO input with interrupt-on-change
                       MCLR ST — Master Clear with internal pull-up
                        VPP HV — Programming voltage


nusssa, ja falei, todos pinos tem interrupt on change, menos o GP3...

só olhar o datasheet,

http://ww1.microchip.com/downloads/en/DeviceDoc/41211D_.pdf
Pagina 8...
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 07 Jan 2010 09:23

Para monitorar se ocorreu Interrupção coloque na ISR:

Liga LED
Delay
Desliga LED

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x