Пишу софтовый передатчик для UARTA (на 2400) на Си для Мега. Проблема ника не получается передать байт , принимается не тот байт который шлю.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено dmx 18 ноября 2004 г. 03:23


Кварц у меня 14.7456MHz скорость UART хочу 2400. Значит через количество тиков равное 14745600/2400=6144 такое количество тиков содержит один бит. Формат посылки такая, нулевой стартовый бит , потом 8 бит данных , один стоповый бит (высокий потенциал).
Время отмеряю при помощи 16 ти разрядного таймера записываю значение 6144 в регистр сравнения таймера.
Программа простая вот она ниже

#define setbit(x,y) (x|=(1<#define clearbit(x,y) (x&=~(1<#define checkbit(x,y) (x&(1<void main(void)
{
setbit(DDRC,PC3); // Ножка через которую софтовый UART выводим, конфигурируем на вывод
setbit(PORTC,PC3);
__enable_interrupt(); //Разрешаем прерывания
while(1)
{
putcharsoft(52); // Этот байт хочу послать по софтовому UARTу В ASCII это должна быть “4”.
}// end while
} // end main

//============-Interrupt CompareA for Timer1-==============
#pragma vector=0x18
__interrupt void TIMER1_COMPA(void)
{
intcompareA=1; // Устанавливаем флаг возникновения прерывания;
}

void putcharsoft (unsigned char curbyte)
{//0
unsigned int i;
unsigned charb;
TCCR1B = 1; // Инициализация 16-ти разрядного таймера (прескаллер не использую)
OCR1AH=6144/256; // Пишим в регистр сравнения таймера Старший байт
OCR1AL=6144%256; // Младший байт
setbit(TIMSK,OCIE1A); // Разрешаем прерывания по сравнению

TCNT1H=0;TCNT1L=0; // Обнуляем таймер
clearbit(PORTC,PC3); // Посылаем стартовый бит
while(intcompareA ==0)b=1; //Ждем время равное 6144 тикам пока флаг intcompareA не станет равным единицы
intcompareA =0; // обнуляем этот флаг

for(i=0;i<8;i++) // Посылаем 8 бит данных
{
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); // Запрещаем прерывание от таймера

} // end proc


Вот…..
Байты вывожу через Max 232 в терминалку (ссответственно в терминалке настроена та же скорость и формат посылки), не могу понять в чем дело, похоже скорость неправильная, но где , может Си (IAR2.28)неподходит на ASMе писать нужно?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru