Problema com interrupção GPIO do PSoC

Software e Hardware para uC PSoC

Moderadores: andre_luis, 51

Problema com interrupção GPIO do PSoC

Mensagempor Iran » 08 Mar 2010 18:15

Senhores,

Fiz um programinha de um contador BCD de 0 a 99 exibindo a contagem em 8 leds na porta 2, os leds acendem com zero lógico. Dois Push Buttons NA conectados aos pinos 0 e 1 da porta 0 incrementam e decrementam a contagem respectivamente.

O Drive Mode dos pinos 0 e 1 da porta 0 foram definidos como pull down. As interrupções foram definidas na borda de subida. Os push buttons ligam Vcc aos pinos.

Está acontecendo que após gravar o programa ao pressionar uma das teclas a interrupção é gerada e a ISR é executada:

Tecla Decrementa

Contagem inicial = 1111.1111 - 0
Depois = 0110.0110 - 99

Tecla Incrementa

Contagem inicial = 1111.1111 - 0
Depois = 1111.1110 - 1

Porém depois de pressionar qq tecla uma vez as teclas nao mais respondem.

O que eu estou deixando de fazer ? O que está errado ?

NO arquivo boot.asm tem lá:

Código: Selecionar todos
    org   1Ch                      ;GPIO Interrupt Vector
    ljmp   PSoC_GPIO_ISR
    reti


No arquivo PSoCGPIOINT.asm tem:

Código: Selecionar todos
PSoC_GPIO_ISR:


   ;@PSoC_UserCode_BODY@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   ljmp _PSoC_GPIO_ISR
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)

   reti



Codigo Fonte


Código: Selecionar todos
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//  Define o MCU  para o qual o código será compilado
//  Para PSoC MCU = 1
//  Para at89s8252 MCU = 0
//----------------------------------------------------------------------------

#define MCU 1

//----------------------------------------------------------------------------


#if MCU

    // Includes e Defines para PSoC

   #define CY8C29466               // Define para configuração dos ports bit a bit
   #define LEDS    PRT2DR          // Define para acessar um único bit
   #define TECLA   Port0.b.b1      // Define para acessar um único bit   
    #define BEEP   Port0.b.b2      // Define para acessar um único bit   
    #include <m8c.h>                // part specific constants and macros
    #include "PSoCAPI.h"            // PSoC API definitions for all User Modules
   #include "uc_CY8C29xxx.h"      // Biblioteca com os registradores especiais

#else

    // Includes e Defines para at89s8252

    #include <at89S8252.h>
    #define LEDS    P2
   #define TMENOS   P3_2
    #define TMAIS   P3_3
    #define BEEP    P1_0

#endif

//----------------------------------------------------------------------------
// Variáveis do Programa
//----------------------------------------------------------------------------

unsigned char cont = 0x0a;

//----------------------------------------------------------------------------
// Protótipo das Funções
//----------------------------------------------------------------------------

void Inicializa(void);
void Atraso(void);

//----------------------------------------------------------------------------
// Função Principal
//----------------------------------------------------------------------------

void main(void)
{
   Inicializa();
    while(1)
        {
            // Espera tecla ser pressionada
        }
}

//----------------------------------------------------------------------------
// Função de Inicialização
//----------------------------------------------------------------------------

void Inicializa(void)
{
     #if MCU

        // Inicialização para PSoC
      LEDS = 0xff;
        INT_CLR0 = 0x00;                                    // Limpa interrupções pendentes
        M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);         // Habilita interupção GPIO
        M8C_EnableGInt;                                     // Habilita globalmente interrupções

     #else

        // Inicialização para at89s8252
      
      IT0 = 1;                                 // Define Interrupção externa 0 na borda
        IT1 = 1;                                 // Define Interrupção externa 1 na borda
      EX0 = 1;                                            // Habilita Interrupção externa 0
        EX1 = 1;                                            // Habilita Interrupção externa 1
        EA  = 1;                                            // Habilita Globalmente as interrupções

     #endif
}


//----------------------------------------------------------------------------
// Função de Delay
//----------------------------------------------------------------------------

void Atraso(void)
{

    unsigned int atz = 1000;
    while(--atz)
        {
            // Espera atz zerar
        }
}

//----------------------------------------------------------------------------
// Rotina de Tratamento de Interrupção
//----------------------------------------------------------------------------

#if MCU

    // Tratamanto de Interrupção para PSoC

    #pragma interrupt_handler PSoC_GPIO_ISR

    void PSoC_GPIO_ISR(void)
    {

      switch(PRT0DR)
         {
            case 0x01:
            
                BEEP = 0;
                   if(++cont == 0x0b)
                       {
                           if(LEDS == 0xff)
                               LEDS = 0x66;
                           else
                               LEDS +=7;
                           cont = 0x01;
                       }
                   else
                       LEDS++;
                   Atraso();
                   BEEP = 1;
            break;
            
            case 0x02:
               
               BEEP = 0;                               // Liga beep
                   if(--cont)
                       LEDS--;
                   else
                  {
                     if(LEDS == 0x66)
                               LEDS = 0xff;
                           else
                               LEDS -= 7;
                           cont = 0x0a;
                  }
                   Atraso();
                   BEEP = 1;// Desliga beep
            break;

            default:
            break;
         
         }
        INT_CLR0 = 0x00;                                // Limpa interrupções pendentes
    }

#else

    // Tratamanto de Interrupção para at89s8252
   
   
   void Tmenos(void) interrupt 1
   {
        do
            {
                BEEP = 0;
                if(++cont == 0x0b)
                    {
                        if(LEDS == 0xff)
                            LEDS = 0x66;
                        else
                            LEDS +=7;
                        cont = 0x01;
                    }
                else
                    LEDS++;
                Atraso();
                BEEP = 1;
            }while(!TMENOS);
        IE0 = 0;
   }

    void Tmais (void) interrupt 2
    {
        do
            {
                BEEP = 0;                               // Liga beep
                if(--cont)
                    LEDS--;
                else   
         {
           if(LEDS == 0x66)
                            LEDS = 0xff;
                        else
                            LEDS -= 7;
                        cont = 0x0a;
               }
                Atraso();
                BEEP = 1;                               // Desliga beep
            }while(!TMAIS);
        IE1 = 0;                                        // Limpa interrupções pendentes
    }
#endif



Fico Grato de alguém tiver paciencia de ler tudo isso e sugerir uma solução

Zé Iran.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Iran » 08 Mar 2010 22:41

Encontrei o Problema.

É a P**** dessa saída BEEP.

Zé Iran.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA


Voltar para Cypress

Quem está online

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

cron

x