Mam pewien problem.
Problem ten dotyka mnie praktycznie od początku pracy
z ARMami, wygląda to tak pisze sobie procedure obsługi przerwania dokonuję jakiejś drobnej zmiany i wszystko przestaje działać, i właśnie dziś udało mi się przyłapać ten problem troche dokładniej i conajmniej ciekawie.
Wiec :
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
IO0SET = LED0;
}
//***********************************************************************************
jest to fragment który bada stan lini wyjściowej procesora i jeśli 1 to daje 0, jak 0 to daje 1
do tego pinu jest podpięta dioda led celem sygnalizacji wszelkich pomysłów (taki debugger) pierwotnie był on używany do obserwacji
czy wystąpiło przerwanie timera, tak czy inaczej działanie kodu objawia się miganiem diody.
Program i był testowany i w przerwaniu i w main i nigdy nie było problemu z tym fragmentem.
Problem jest gdy wywale ten "debuger", program bez niego nie działa !!!
Nawet jeśli zmienie procedure tak:
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
// IO0SET = LED0;
}
//***********************************************************************************
to przestaje działać, i nie chodzi tu o samego leda bo jak go odłącze kabelkiem a zostawie kod to też działa, coś jest w samym zapisie
czy jak ? albo znowu ślepy jestem ?
Niżej jest zamieszczone całe przerwanie, tak sobie pisałem pisałem i napisałem działa ale tylko z tym debugerem na diodie led !!!
Na koniec dodam że już kilka razy miałem taki problem z przerwaniami, i za diabła nie wiem co jest !!! Dopiero siadam i przepisuje program inaczej, ostatnio zrobiłem tak że w przerwaniu ustawiłem flage "wystapiłoPrzerwanie" a w main sprawdzałem tą flagę i brałem się za obsługe, musiałem tak zrobić bo termin gonił, ale dalej tak niedam rady. help !
static void timer0ISR(void) __attribute__ ((interrupt ("IRQ")));
static void timer0ISR(void)
{
TimeOutRS0 --;
if (TimeOutRS0 == 0)
{
uart0_rx_insert_idx = 0; //Zerujemy wskaznik
TimeOutRS0 = CzasTimeOutRS0;
if (OdebranoStartRS0 == 1)
{
OdebranoStartRS0 = 0;
OdebranoPakietRS0 = 1;
}
}
//
TimeOutRS1 --;
if (TimeOutRS1 == 0)
{
uart1_rx_insert_idx = 0; //Zerujemy wskaznik
TimeOutRS1 = CzasTimeOutRS1;
if (OdebranoStartRS1 == 1)
{
OdebranoStartRS1 = 0;
if (uart1_rx_buffer[0] == 0xAC)
{
OdebranoPakietRS1 = 1;
//Stop = 1;
}
}
}
timer0Count++;
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
IO0SET = LED0;
}
//***********************************************************************************
T0IR = 0xFF; // Clear the timer 0 interrupt
VICVectAddr = 0; // Update VIC priorities
}
Problem ten dotyka mnie praktycznie od początku pracy
z ARMami, wygląda to tak pisze sobie procedure obsługi przerwania dokonuję jakiejś drobnej zmiany i wszystko przestaje działać, i właśnie dziś udało mi się przyłapać ten problem troche dokładniej i conajmniej ciekawie.
Wiec :
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
IO0SET = LED0;
}
//***********************************************************************************
jest to fragment który bada stan lini wyjściowej procesora i jeśli 1 to daje 0, jak 0 to daje 1
do tego pinu jest podpięta dioda led celem sygnalizacji wszelkich pomysłów (taki debugger) pierwotnie był on używany do obserwacji
czy wystąpiło przerwanie timera, tak czy inaczej działanie kodu objawia się miganiem diody.
Program i był testowany i w przerwaniu i w main i nigdy nie było problemu z tym fragmentem.
Problem jest gdy wywale ten "debuger", program bez niego nie działa !!!
Nawet jeśli zmienie procedure tak:
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
// IO0SET = LED0;
}
//***********************************************************************************
to przestaje działać, i nie chodzi tu o samego leda bo jak go odłącze kabelkiem a zostawie kod to też działa, coś jest w samym zapisie
czy jak ? albo znowu ślepy jestem ?
Niżej jest zamieszczone całe przerwanie, tak sobie pisałem pisałem i napisałem działa ale tylko z tym debugerem na diodie led !!!
Na koniec dodam że już kilka razy miałem taki problem z przerwaniami, i za diabła nie wiem co jest !!! Dopiero siadam i przepisuje program inaczej, ostatnio zrobiłem tak że w przerwaniu ustawiłem flage "wystapiłoPrzerwanie" a w main sprawdzałem tą flagę i brałem się za obsługe, musiałem tak zrobić bo termin gonił, ale dalej tak niedam rady. help !
static void timer0ISR(void) __attribute__ ((interrupt ("IRQ")));
static void timer0ISR(void)
{
TimeOutRS0 --;
if (TimeOutRS0 == 0)
{
uart0_rx_insert_idx = 0; //Zerujemy wskaznik
TimeOutRS0 = CzasTimeOutRS0;
if (OdebranoStartRS0 == 1)
{
OdebranoStartRS0 = 0;
OdebranoPakietRS0 = 1;
}
}
//
TimeOutRS1 --;
if (TimeOutRS1 == 0)
{
uart1_rx_insert_idx = 0; //Zerujemy wskaznik
TimeOutRS1 = CzasTimeOutRS1;
if (OdebranoStartRS1 == 1)
{
OdebranoStartRS1 = 0;
if (uart1_rx_buffer[0] == 0xAC)
{
OdebranoPakietRS1 = 1;
//Stop = 1;
}
}
}
timer0Count++;
//***************** PROBLEMATYCZNE LINIE KODU *************************
//
if (IO0PIN & LED0)
{
IO0CLR = LED0;
}
else
{
IO0SET = LED0;
}
//***********************************************************************************
T0IR = 0xFF; // Clear the timer 0 interrupt
VICVectAddr = 0; // Update VIC priorities
}