Цитата(Savrik @ May 12 2010, 23:35)

так-так-так...
tick_10 и
Temporary глобальные переменные? а ну-ка код полностью в студию

tick_10 глобальная, Temporary локальная и volatil'ом обзывал её лишь для проверки предположения(т.е. чтоб ноль из r1 писался напрямую в память).
Содержательная часть кода:
CODE
ISR (TIMER0_OVF_vect)//overflow interrupt vector
{
tick++;
++tick_10;
if (++t.second==60) //keep track of time, date, month, and year
{
t.second=0;
if (++t.minute==60)
{
t.minute=0;
if (++t.hour==24)
{
t.hour=0;
if (++t.date==32)
{
t.month++;
t.date=1;
}
else if (t.date==31)
{
if ((t.month==4) || (t.month==6) || (t.month==9) || (t.month==11))
{
t.month++;
t.date=1;
}
}
else if (t.date==30)
{
if(t.month==2)
{
t.month++;
t.date=1;
}
}
else if (t.date==29)
{
if((t.month==2) && (not_leap()))
{
t.month++;
t.date=1;
}
}
if (t.month==13)
{
t.month=1;
t.year++;
}
}
}
}
if (tick_10==10)
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Read TCNTn into i */
i = TCNT1;
TCNT1 = 0;
/* Restore global interrupt flag */
SREG = sreg;
pin_events_count_n=pin_events_count_n+i;
pin_events_count=pin_events_count_n;
pin_events_count_n=0;
if (log_on)
{
prepare_string();
USART_SEND();
}
tick_10=tick_10-10;
//tick_10=0;
}
}
void prepare_string(void)
{
for (int i=0; i<30;i++)
log_string[i]='\0';
if (t.date<10)
{
log_string[0]='0';
my_itoa(t.date, &log_string[1]);
}
else
my_itoa(t.date, &log_string[0]);
log_string[2]='.';
if (t.month<10)
{
log_string[3]='0';
my_itoa(t.month, &log_string[4]);
}
else
my_itoa(t.month, &log_string[3]);
log_string[5]='.';
my_itoa(t.year, &log_string[6]);
log_string[10]=' ';
if (t.hour<10)
{
log_string[11]='0';
my_itoa(t.hour, &log_string[12]);
}
else
my_itoa(t.hour, &log_string[11]);
log_string[13]=':';
if (t.minute<10)
{
log_string[14]='0';
my_itoa(t.minute, &log_string[15]);
}
else
my_itoa(t.minute, &log_string[14]);
log_string[16]=':';
if (t.second<10)
{
log_string[17]='0';
my_itoa(t.second, &log_string[18]);
}
else
my_itoa(t.second, &log_string[17]);
log_string[19]=' ';
volatile unsigned char i=my_ltoa(pin_events_count, &log_string[20]);
log_string[20+i]=log_string[19+i];
log_string[19+i]=',';
log_string[21+i]='\r';
log_string[22+i]='\n';
}
void my_itoa(int i, char *Place)
{
volatile int C[3];
volatile unsigned char Temp=0, NumLen = 0;
do
{
Temp++;
C[Temp] = i % 10;
i = i/10;
}
while (i);
NumLen = Temp;
for (Temp = NumLen; Temp>0; Temp--)
{Place[NumLen-Temp]=C[Temp] + 48;}
}
unsigned char my_ltoa(long int i, char *Place)
{
volatile unsigned char C[10];
volatile unsigned char Temp=0, NumLen = 0;
do
{
Temp++;
C[Temp] = i % 10;
i = i/10;
}
while (i);
NumLen = Temp;
for (Temp = NumLen; Temp>0; Temp--)
{Place[NumLen-Temp]=C[Temp] + 48;}
return NumLen;
}
void USART_SEND(void)
{
unsigned char Temporary=0;
do
{
ch=log_string[Temporary];
SendCharUart1(ch);
Temporary++;
}
while((ch!='\n')&&(Temporary<30));
}
Кстати, ещё баг возникает именно при выполнении prepare_string();из прерывания, если находиться в while(1) в функции отличной от main и в строке volatile unsigned char i=my_ltoa(pin_events_count, &log_string[20]); отсутсвует volatile. Контроллер начинает творить что-то страшное, сначала выводя на экран какой-то непонятный мусор, но с этим разбираться планирую когда раздобуду нормальный дебаггер.
P.S. То что подготовка строки тупая и вообще неизящная я знаю, но суть не в этом.
Сообщение отредактировал rezident - May 14 2010, 19:57
Причина редактирования: Оформление цитаты исходника.