Генератор сообщений по USART для ATmega8
Данный генератор я часто применяю для проверки прохождения сигнала через схему. Для мониторинга работоспособности того же конвертера уровней. Программа периодически, период задается вручную, отправляет определенное количество сообщений, количество сообщений и текст сообщений задаются вручную.
Единственное замечание по длине сообщения есть, так как объем оперативной памяти микроконтроллера AtMega8 ограничен соответственно и объем данных тоже, который данный микроконтроллер может обработать. Предел 12-13 символов. При необходимости отправки сообщения по нажатию кнопки, программа легко адаптируется. В общем поле для идей более чем широкое.
Собственно код программы:
//Подключаем стандартные библиотеки #include <avr/io.h> //библиотека ввода_вывода //перечисляем переменные необходимые для работы int x,t,s,p,line; //Задаем наши сообщения unsigned char msg1[] = "Initializing"; unsigned char msg2[] = "done"; unsigned char msg3[] = "xxxxxxxxxx"; unsigned char msg4[] = "Hello from"; unsigned char msg5[] = "avrlab.com"; unsigned char msg6[] = "xxxxxxxxxx"; #define nop() {asm("nop");}//ассемблеровская функция необходимая для формирования задержки //Функция задержки void delay(int t) {for (x=t; x>0 ;x--) nop (); } //Функция большой задержки void long_delay () {for (p=1; p<23; p++) {delay(5000); } } //Функция инициализации модуля USART микроконтроллера AtMega8 void USART_Init( unsigned int ubrr) { /* Set baud rate */ UBRRH = (unsigned char)( ubrr>>8 );//Декларируем переменную для скорости соединения UBRRL = (unsigned char)ubrr; UCSRB = ( 1<<RXEN )|( 1<<TXEN );//Разрешаем прием и передачу данных UCSRC=0x86;// UCSRC = ( 1<<URSEL )|( 1<<USBS ) | ( 3<<UCSZ0 ); } //Функция приема данных unsigned char USART_Receive( void ) {while ( !(UCSRA & (1<<RXC)) ); //Ожидание приема символа return UDR; } //Возврат принятого символа //Функция отправки данных void USART_Transmit( unsigned char data ) {while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных } //Функция отправки сообщения void msgout (unsigned char msg[],int line) {s=0; for (;msg[s];s++) {USART_Transmit(msg[s]);} if (line ==1)//Переход на новую строку {USART_Transmit(0x0d); //Отправляем команду перехода в начало строки USART_Transmit(0x0a); }//Отправляем команду переходу на новую строку } //Главная функция int main (void) { USART_Init (8);//Инициализируем модуль USART скорость подключения 115200 кбит/с при частоте 16MHz while(1)//вечный цикл { msgout(msg1,1);//Отправляем первое сообщение msgout(msg2,1);//...второе msgout(msg3,1);//...третье msgout(msg4,1);//... msgout(msg5,1);//... msgout(msg6,1);//Отправляем шестое сообщение long_delay ();//Большая пауза между отправками сообщения } }
Данные снимаются с соответствующих выводов микроконтроллера ATmega8 и через преобразователь UART-RS232 передаются на персональный компьютер, где уже обрабатываются программой Terminal 1.9
Скачать файлы проекта "Генератор сообщений по USART"Данный генератор я часто применяю для проверки прохождения сигнала через схему. Для мониторинга работоспособности того же конвертера уровней. Программа периодически, период задается вручную, отправляет определенное количество сообщений, количество сообщений и текст сообщений задаются вручную.
Единственное замечание по длине сообщения есть, так как объем оперативной памяти микроконтроллера AtMega8 ограничен соответственно и объем данных тоже, который данный микроконтроллер может обработать. Предел 12-13 символов. При необходимости отправки сообщения по нажатию кнопки, программа легко адаптируется. В общем поле для идей более чем широкое.
Собственно код программы:
//Подключаем стандартные библиотеки #include <avr/io.h> //библиотека ввода_вывода //перечисляем переменные необходимые для работы int x,t,s,p,line; //Задаем наши сообщения unsigned char msg1[] = "Initializing"; unsigned char msg2[] = "done"; unsigned char msg3[] = "xxxxxxxxxx"; unsigned char msg4[] = "Hello from"; unsigned char msg5[] = "avrlab.com"; unsigned char msg6[] = "xxxxxxxxxx"; #define nop() {asm("nop");}//ассемблеровская функция необходимая для формирования задержки //Функция задержки void delay(int t) {for (x=t; x>0 ;x--) nop (); } //Функция большой задержки void long_delay () {for (p=1; p<23; p++) {delay(5000); } } //Функция инициализации модуля USART микроконтроллера AtMega8 void USART_Init( unsigned int ubrr) { /* Set baud rate */ UBRRH = (unsigned char)( ubrr>>8 );//Декларируем переменную для скорости соединения UBRRL = (unsigned char)ubrr; UCSRB = ( 1<<RXEN )|( 1<<TXEN );//Разрешаем прием и передачу данных UCSRC=0x86;// UCSRC = ( 1<<URSEL )|( 1<<USBS ) | ( 3<<UCSZ0 ); } //Функция приема данных unsigned char USART_Receive( void ) {while ( !(UCSRA & (1<<RXC)) ); //Ожидание приема символа return UDR; } //Возврат принятого символа //Функция отправки данных void USART_Transmit( unsigned char data ) {while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных } //Функция отправки сообщения void msgout (unsigned char msg[],int line) {s=0; for (;msg[s];s++) {USART_Transmit(msg[s]);} if (line ==1)//Переход на новую строку {USART_Transmit(0x0d); //Отправляем команду перехода в начало строки USART_Transmit(0x0a); }//Отправляем команду переходу на новую строку } //Главная функция int main (void) { USART_Init (8);//Инициализируем модуль USART скорость подключения 115200 кбит/с при частоте 16MHz while(1)//вечный цикл { msgout(msg1,1);//Отправляем первое сообщение msgout(msg2,1);//...второе msgout(msg3,1);//...третье msgout(msg4,1);//... msgout(msg5,1);//... msgout(msg6,1);//Отправляем шестое сообщение long_delay ();//Большая пауза между отправками сообщения } }
Данные снимаются с соответствующих выводов микроконтроллера ATmega8 и через преобразователь UART-RS232 передаются на персональный компьютер, где уже обрабатываются программой Terminal 1.9
Скачать файлы проекта "Генератор сообщений по USART"
Я переделал данную программу
Я переделал данную программу для МК Атмега16л
скорость 9600, частота внутренний кварц 1МГц.
но он не работает.
в чём может быть ошибка?
Ещё вопрос: как вы устанавливаете 16 МГц во фьюзах?
Там я не нашел таких значений.
Заранее спасибо за ответы!
Внутренний генератор задается
Внутренний генератор задается емкостью расположенной внутри микроконтроллера, короче говоря емкость эта очень зависима от температуры окружающей среды, и частота "плавает". Другое дело кварц внешний! Я всегда когда использую юарт синхронизирую микроконтроллер только от внешнего кварца. По поводу фьюзов и конфигурации фьюзов там первый пример как раз то что тебе надо! Программа есть на сайте тоже, через которую выполняется установка фьюзов.