Никто не пытался сделать программный UART? а то одного не хватает.
Есть Учебно-отладочный стенд на базе ATmega16, к нему даделали модуль с передатчиком Xbee. С самим модулем мне работать пока не надо, однако стоит задача связи передатчика с ПК через стенд (стенд - обязательное звено). Проблема в том, что в МК UART один.
Его решено завязать на Xbee, а вот несчет компа - то ему остается фигура из трех пальцев, до тех пор, пока не написан программный UART. Полопатил инет, не нашел. может кто подкинет хотя бы идею...
заранее благодарен
Нужна идея как сделать, или где готовое взять?
Если первое, то я использовал таймерные временные метки в режиме совпадения. Два прерывания: совпадение, переполнение. Заранее составляется массив значений, зависит от скорости. В совпадении считывается/записывается бит, и заносится новое значение OCR. По переполнению байт передан или принят.
Есть следующий код. По идее, он должен передавать значение 0xC2 раз в секунду на скорости 9600 бод с двумя стоп-битами. Однако в терминале ловлю сплошные нули, и то только при включении/сбросе или смене параметров соединения со стороны компа. подскажите, где я налажал? (код написан в WinAVR):
...
ISR(TIMER0_COMP_vect)
//обработчик прерывания "Т./Сч.0 -> сравнение"
{
PORTB=a[i]; // вывести в порт i-й символ массива
if(i<10) // Если не закончилась последовательность
reti(); // то завершить обработку прерывания и быть
//готовым обрабатывать следующий бит
//иначе
cli(); //запретить прерывания
_delay_ms(1000); //подождать секунду
i=0; //обнулить счетчик бит
sei(); // разрешить прерывания взад
reti(); // выйти из обработчика
}
задержка на секунду в прерываниях - это не есть гуд, за это время таймер успевает "нащелкать" множество тактов, а вы пропустите прерывания, во вторых - где увеличивается i ?
Вообще видимо неоптимальный код, но я не могу дать рекоммендаций к написанию "хорошего" кода на С. На асм элементарно решается
Правда не помогло. Взглянул на схему - max232 вроде бы с инвертором... В общем, инвертировал поток - стал получать посылки ежесекундно, хотя не то, что посылал:
1) Сначала сразу два байта 0xFE, 0xFF
2) затем один 0xFF
3) наконец, 0x00
и сначала. Может кто подскажет в чем косяк?