Генератор сообщений по USART для ATmega8

Данный генератор я часто применяю для проверки прохождения сигнала через схему. Для мониторинга работоспособности того же конвертера уровней. Программа периодически, период задается вручную, отправляет определенное количество сообщений, количество сообщений и текст сообщений задаются вручную.
Единственное замечание по длине сообщения есть, так как объем оперативной памяти микроконтроллера AtMega8 ограничен соответственно и объем данных тоже, который данный микроконтроллер может обработать. Предел 12-13 символов. При необходимости отправки сообщения по нажатию кнопки, программа легко адаптируется. В общем поле для идей более чем широкое.

Собственно код программы:

  1. //Подключаем стандартные библиотеки
  2. #include <avr/io.h> //библиотека ввода_вывода
  3.  
  4. //перечисляем переменные необходимые для работы
  5. int x,t,s,p,line;
  6.  
  7. //Задаем наши сообщения
  8. unsigned char msg1[] = "Initializing";
  9. unsigned char msg2[] = "done";
  10. unsigned char msg3[] = "xxxxxxxxxx";
  11. unsigned char msg4[] = "Hello from";
  12. unsigned char msg5[] = "avrlab.com";
  13. unsigned char msg6[] = "xxxxxxxxxx";
  14.  
  15. #define nop() {asm("nop");}//ассемблеровская функция необходимая для формирования задержки
  16.  
  17. //Функция задержки
  18. void delay(int t)
  19. {for (x=t; x>0 ;x--)
  20. nop (); }
  21.  
  22. //Функция большой задержки
  23. void long_delay ()
  24. {for (p=1; p<23; p++)
  25. {delay(5000); }
  26. }
  27.  
  28. //Функция инициализации модуля USART микроконтроллера AtMega8
  29. void USART_Init( unsigned int ubrr)
  30. {
  31. /* Set baud rate */
  32. UBRRH = (unsigned char)( ubrr>>8 );//Декларируем переменную для скорости соединения
  33. UBRRL = (unsigned char)ubrr;
  34. UCSRB = ( 1<<RXEN )|( 1<<TXEN );//Разрешаем прием и передачу данных
  35. UCSRC=0x86;//
  36. UCSRC = ( 1<<URSEL )|( 1<<USBS ) | ( 3<<UCSZ0 );
  37. }
  38.  
  39. //Функция приема данных
  40. unsigned char USART_Receive( void )
  41. {while ( !(UCSRA & (1<<RXC)) ); //Ожидание приема символа
  42. return UDR; } //Возврат принятого символа
  43.  
  44. //Функция отправки данных
  45. void USART_Transmit( unsigned char data )
  46. {while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
  47. UDR = data; //Начало передачи данных
  48. }
  49.  
  50. //Функция отправки сообщения
  51. void msgout (unsigned char msg[],int line)
  52. {s=0;
  53. for (;msg[s];s++)
  54. {USART_Transmit(msg[s]);}
  55.  
  56. if (line ==1)//Переход на новую строку
  57. {USART_Transmit(0x0d); //Отправляем команду перехода в начало строки
  58. USART_Transmit(0x0a); }//Отправляем команду переходу на новую строку
  59. }
  60.  
  61. //Главная функция
  62. int main (void)
  63. {
  64. USART_Init (8);//Инициализируем модуль USART скорость подключения 115200 кбит/с при частоте 16MHz
  65. while(1)//вечный цикл
  66. {
  67. msgout(msg1,1);//Отправляем первое сообщение
  68. msgout(msg2,1);//...второе
  69. msgout(msg3,1);//...третье
  70. msgout(msg4,1);//...
  71. msgout(msg5,1);//...
  72. msgout(msg6,1);//Отправляем шестое сообщение
  73. long_delay ();//Большая пауза между отправками сообщения
  74. }
  75. }

Данные снимаются с соответствующих выводов микроконтроллера ATmega8 и через преобразователь UART-RS232 передаются на персональный компьютер, где уже обрабатываются программой Terminal 1.9

Скачать файлы проекта "Генератор сообщений по USART"Данный генератор я часто применяю для проверки прохождения сигнала через схему. Для мониторинга работоспособности того же конвертера уровней. Программа периодически, период задается вручную, отправляет определенное количество сообщений, количество сообщений и текст сообщений задаются вручную.
Единственное замечание по длине сообщения есть, так как объем оперативной памяти микроконтроллера AtMega8 ограничен соответственно и объем данных тоже, который данный микроконтроллер может обработать. Предел 12-13 символов. При необходимости отправки сообщения по нажатию кнопки, программа легко адаптируется. В общем поле для идей более чем широкое.

Собственно код программы:

  1. //Подключаем стандартные библиотеки
  2. #include <avr/io.h> //библиотека ввода_вывода
  3.  
  4. //перечисляем переменные необходимые для работы
  5. int x,t,s,p,line;
  6.  
  7. //Задаем наши сообщения
  8. unsigned char msg1[] = "Initializing";
  9. unsigned char msg2[] = "done";
  10. unsigned char msg3[] = "xxxxxxxxxx";
  11. unsigned char msg4[] = "Hello from";
  12. unsigned char msg5[] = "avrlab.com";
  13. unsigned char msg6[] = "xxxxxxxxxx";
  14.  
  15. #define nop() {asm("nop");}//ассемблеровская функция необходимая для формирования задержки
  16.  
  17. //Функция задержки
  18. void delay(int t)
  19. {for (x=t; x>0 ;x--)
  20. nop (); }
  21.  
  22. //Функция большой задержки
  23. void long_delay ()
  24. {for (p=1; p<23; p++)
  25. {delay(5000); }
  26. }
  27.  
  28. //Функция инициализации модуля USART микроконтроллера AtMega8
  29. void USART_Init( unsigned int ubrr)
  30. {
  31. /* Set baud rate */
  32. UBRRH = (unsigned char)( ubrr>>8 );//Декларируем переменную для скорости соединения
  33. UBRRL = (unsigned char)ubrr;
  34. UCSRB = ( 1<<RXEN )|( 1<<TXEN );//Разрешаем прием и передачу данных
  35. UCSRC=0x86;//
  36. UCSRC = ( 1<<URSEL )|( 1<<USBS ) | ( 3<<UCSZ0 );
  37. }
  38.  
  39. //Функция приема данных
  40. unsigned char USART_Receive( void )
  41. {while ( !(UCSRA & (1<<RXC)) ); //Ожидание приема символа
  42. return UDR; } //Возврат принятого символа
  43.  
  44. //Функция отправки данных
  45. void USART_Transmit( unsigned char data )
  46. {while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
  47. UDR = data; //Начало передачи данных
  48. }
  49.  
  50. //Функция отправки сообщения
  51. void msgout (unsigned char msg[],int line)
  52. {s=0;
  53. for (;msg[s];s++)
  54. {USART_Transmit(msg[s]);}
  55.  
  56. if (line ==1)//Переход на новую строку
  57. {USART_Transmit(0x0d); //Отправляем команду перехода в начало строки
  58. USART_Transmit(0x0a); }//Отправляем команду переходу на новую строку
  59. }
  60.  
  61. //Главная функция
  62. int main (void)
  63. {
  64. USART_Init (8);//Инициализируем модуль USART скорость подключения 115200 кбит/с при частоте 16MHz
  65. while(1)//вечный цикл
  66. {
  67. msgout(msg1,1);//Отправляем первое сообщение
  68. msgout(msg2,1);//...второе
  69. msgout(msg3,1);//...третье
  70. msgout(msg4,1);//...
  71. msgout(msg5,1);//...
  72. msgout(msg6,1);//Отправляем шестое сообщение
  73. long_delay ();//Большая пауза между отправками сообщения
  74. }
  75. }

Данные снимаются с соответствующих выводов микроконтроллера ATmega8 и через преобразователь UART-RS232 передаются на персональный компьютер, где уже обрабатываются программой Terminal 1.9

Скачать файлы проекта "Генератор сообщений по USART"

Я переделал данную программу

Я переделал данную программу для МК Атмега16л
скорость 9600, частота внутренний кварц 1МГц.
но он не работает.
в чём может быть ошибка?

Ещё вопрос: как вы устанавливаете 16 МГц во фьюзах?
Там я не нашел таких значений.

Заранее спасибо за ответы!

Внутренний генератор задается

Внутренний генератор задается емкостью расположенной внутри микроконтроллера, короче говоря емкость эта очень зависима от температуры окружающей среды, и частота "плавает". Другое дело кварц внешний! Я всегда когда использую юарт синхронизирую микроконтроллер только от внешнего кварца. По поводу фьюзов и конфигурации фьюзов там первый пример как раз то что тебе надо! Программа есть на сайте тоже, через которую выполняется установка фьюзов.