В общем стало лень считать значения регистров для вычисления скорости обмен по юарту для двух устройств, а решил доверить это компьютеру.. Вот такое вот решение. Код: /*частота работы микроконтроллера*/ #define F_CPU 8000000UL /*нужная нам скорость*/ #define BAUD 9600L /*формула для расчета значения*/ #define UBRRL_value (F_CPU/(BAUD*16))-1 // Далее пихаем полученное значение в регистры UBRRH и UBRRL: Код: void uart_init( void ) { /*младший байт*/ UBRRL = UBRRL_value; /*старший байт*/ UBRRH = UBRRL_value >> 8; /*другие настройки*/ } Закидываем данные строчки в наши исходники; Так как данный регистр одинаков для мк серии atmega и attiny, то будет работать) Проверил на atmega8 и attiny2313. Передача и прием идут отлично.
согласен, очень удобно. но если значение этого регистра вычислится не близко к целому. например 17,5 мы этого не увидим , и как поведет себя уарт(глюки будут)?
он нигде не использовал float или double соответственно значение с плавающей точкой получится вроде как не может
одинаково округлится, так как значение целое. если два мк работают на одной частоте, одной скорости, и формула одна и та же , то и результат будет одинаков. ну и плюс погрешность допускается.
Извеняюсь , вопрос не конкретизировал. Просто когда связывал мк и пк . На пк скорость жестко задается. А на мк по этой формуле этот регистр вычислился и округлился так, что связь не пошла(получил кваказябры). Почитав про уарт..: там советуют при выборе частоты и скорости передачи стараться результата близкого к целому часлу. Может мне показалось, но после подгонки частоты связь пошла. А данный фитч для связи мк и мк идеален. Еще хочу спросить : вы связывали несколько мк в систему по уарт. Если можете ткните носом в источник не могу найти нормальных описаний.
Если несколько МК, то к UART лучше добавить драйвер RS485. Простой RS232 плохо подходит для организации сети.
и все, не надо переходить на усарт, а то не хотелось бы мучиться? И еще интересно: в данной реализации можно сделать просто отправку 8бит. если в программе написана реакция на это число устройство реагирует , а если этого числа нет в программе, тогда реагирует другое устройство где описано оно.? тоесть без всяких адресов?
Я эту технологию использую давно. Большим преимуществом является высокая помехозащищенность. Там "1" и "0" определяются разницей потенциалов между линией А и В. Обычная помеха одинаково влияет на обе линии и никак не влияет на сигнал. Подключение линий производится через одну микросхеме драйвера 485 прямо к порту UART. Без проблем сопрягаются устройства с питанием 5В и 3.3В. Можно. Это по сути и будет адрес.
Для AVR рекомендуется ставить специальные кварцевые резонаторы с уартовскими частотами, например 11.592 МГц и т.д. Тогда остатка не будет или он будет минимальным.