Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
//-------------------------
unsigned char i,b;
//-------------------------
const float k = 0.1;
//-------------------------
//Прерывание по переполнени таймера
ISR(TIMER1_OVF_vect) //Если возникает прерывание по переполнению таймера,
{
i++; //то увеличить значение счетчика переполнений
}
//-------------------------
//Программа для передачи через СОМ порт
void USART_Transmit (unsigned char data)
{
while (!(UCSRA&(1<<UDRE))); //Пока UDRE 0, делать ->
UDR=data;
}
//-------------------------
int Sec_USART (unsigned char *p )
{
float sec;
unsigned int valsec = *p;
sec = valsec; //в sec - значение valsec
sec = sec * k;
char s[5]; //умножить sec на к=0,0048 и результат записать в себя
dtostrf (sec, 5, 1, s); /Преобразовать значение секунд типа double в строку символов
USART_Transmit (s[0]);
USART_Transmit (s[1]);
USART_Transmit (s[2]);
USART_Transmit (s[3]);
USART_Transmit (s[4]);
return 0;
}
//-------------------------
ISR (TIMER1_COMPA_vect)
{
b ++; //Значение счетчика
Sec_USART (&b );
}
//------------------------
ISR (ANA_COMP_vect) //Прерывание от компаратора
if (ACSR & (1 << ACO))
{
TCCR1B = TCCR1B|((1<<CS10)|(1<<CS12)); //Коэф. предделителя = 1024
}
else
{
TCCR1B =TCCR1B & 0b11111010;
}
}
//--------------------------
//-------------------------
int main()
{
ACSR|= (1<<ACIE)|(1<<ACBG); //Инициализация компаратора
TCCR1B =TCCR1B| (1<<WGM12);
TIMSK =TIMSK| (1<<OCIE1A);
OCR1A = 39062; //В регистре сравнения 39062
sei();
for(;;)
{
asm ("nop");
asm ("nop");
}
}
Почему то в симуляторе он через сом порт передает первое значение 0,1 с, а затем зависает в функции USART_Transmit. Почему так и как это исправить?