Problema com interrupção GPIO do PSoC

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á:
No arquivo PSoCGPIOINT.asm tem:
Codigo Fonte
Fico Grato de alguém tiver paciencia de ler tudo isso e sugerir uma solução
Zé Iran.
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.