|
Кварц у меня 14.7456MHz скорость UART хочу 2400. Значит через количество тиков равное 14745600/2400=6144 такое количество тиков содержит один бит. Формат посылки такая, нулевой стартовый бит , потом 8 бит данных , один стоповый бит (высокий потенциал).
Время отмеряю при помощи 16 ти разрядного таймера записываю значение 6144 в регистр сравнения таймера.
Программа простая вот она ниже
#define setbit(x,y) (x|=(1< //============-Interrupt CompareA for Timer1-============== void putcharsoft (unsigned char curbyte) TCNT1H=0;TCNT1L=0; // Обнуляем таймер for(i=0;i<8;i++) // Посылаем 8 бит данных } // end proc
E-mail:
info@telesys.ru
{
setbit(DDRC,PC3); // Ножка через которую софтовый UART выводим, конфигурируем на вывод
setbit(PORTC,PC3);
__enable_interrupt(); //Разрешаем прерывания
while(1)
{
putcharsoft(52); // Этот байт хочу послать по софтовому UARTу В ASCII это должна быть “4”.
}// end while
} // end main
#pragma vector=0x18
__interrupt void TIMER1_COMPA(void)
{
intcompareA=1; // Устанавливаем флаг возникновения прерывания;
}
{//0
unsigned int i;
unsigned charb;
TCCR1B = 1; // Инициализация 16-ти разрядного таймера (прескаллер не использую)
OCR1AH=6144/256; // Пишим в регистр сравнения таймера Старший байт
OCR1AL=6144%256; // Младший байт
setbit(TIMSK,OCIE1A); // Разрешаем прерывания по сравнению
clearbit(PORTC,PC3); // Посылаем стартовый бит
while(intcompareA ==0)b=1; //Ждем время равное 6144 тикам пока флаг intcompareA не станет равным единицы
intcompareA =0; // обнуляем этот флаг
{
TCNT1H=0;TCNT1L=0; // Обнуляем таймер
if (checkbit(curbyte,i)>0) setbit(PORTC,PC3);
else clearbit(PORTC,PC3);
while(intcompareA ==0)b=1; //Ждем время равное 6144 тикам
intcompareA =0;
}
TCNT1H=0;TCNT1L=0; // Обнуляем таймер
setbit(PORTC,PC3);// Посылаем стоп бит
while(intcompareA==0)b=1; //Ждем время равное 6144 тикам
intcompareA =0;
clearbit(TIMSK,OCIE2); // Запрещаем прерывание от таймера
Вот…..
Байты вывожу через Max 232 в терминалку (ссответственно в терминалке настроена та же скорость и формат посылки), не могу понять в чем дело, похоже скорость неправильная, но где , может Си (IAR2.28)неподходит на ASMе писать нужно?
Ответы