| Форум РадиоКот https://radiokot.ru/forum/ |
|
| ATmega128 : USART1 https://radiokot.ru/forum/viewtopic.php?f=20&t=5530 |
Страница 1 из 2 |
| Автор: | Кашпо [ Чт июн 14, 2007 08:20:34 ] |
| Заголовок сообщения: | ATmega128 : USART1 |
Генерю начальный код в CodeVisionAVR. Включаю передачу по прерываниям и приём по прерываниям. скорость без разницы, ну допустим 9600. остальное по умолчанию (т.е. 8 бит с битом чётности и т.п.) тестирую в Proteus начинается всё с того, что проц вообще "не дышит" в сгенерированной по умолчанию проге. Не дышит он из-за того, что постоянно вызывается прерывание окончания передачи и это я ещё ничего не передавал! (он только из него вываливается, а оно тутже его обратно затягивает) помогает только доработка прерывания, путём дописывания кода, сбрасывающего флаг TXC вот что получается: Код: // USART1 Transmitter interrupt service routine
interrupt [USART1_TXC] void usart1_tx_isr(void) { //return; if (tx_counter1) { --tx_counter1; UDR1=tx_buffer1[tx_rd_index1]; if (++tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0; } else { UCSR1B = UCSR1B & 191; }; } после этого процессор начинает работать. пытаюсь передавать байты. Например вот так: putchar1(111); putchar1(222); putchar1(222); в результате первый символ передаётся, а остальные (которые должны прерыванием из буфера доставаться - не передаются) если писать вот так: putchar1(111); delay_ms(1); putchar1(222); delay_ms(1); putchar1(222); всё передаётся. всё вышеописанное относится только к USART1. USART0 работает без проблем, в сгенерированый код ненужно дописывать сброс флагов и пр. всё работает как и должно быть в теории. Прерывания вызываются и из буфера передаётся. инициализация, сгенерированная генератором кода - одинаковая для обоих передатчиков (ну за исключением названий портов) где грабли? В компиляторе? в Протеусе? или в генах? :shock: |
|
| Автор: | tych [ Чт июн 14, 2007 10:13:41 ] |
| Заголовок сообщения: | |
Посмотрите пример CVAVR по работе с двумя USART. Как там ? |
|
| Автор: | Кашпо [ Чт июн 14, 2007 10:40:10 ] |
| Заголовок сообщения: | |
tych писал(а): Посмотрите пример CVAVR по работе с двумя USART. Как там ?
Да мне не с двумя нужно. Мне с одним, но с USART1, так как ноги USART0 заняты другими делами. а где смотреть, если что?? |
|
| Автор: | tych [ Чт июн 14, 2007 10:45:11 ] |
| Заголовок сообщения: | |
Примеры обычно смотрят в примерах. C:\CVAVR\examples\2USART_LCD |
|
| Автор: | Кашпо [ Чт июн 14, 2007 11:09:16 ] |
| Заголовок сообщения: | |
tych писал(а): Примеры обычно смотрят в примерах.
C:\CVAVR\examples\2USART_LCD а-а-а. эти примеры? я думал мож где по этому сайту по-шукать или куда по-дальше слазить в инет в указанном вами примере (путь полностью совпадает с моим не используются преривания ни на передачу, ни на приём. Без прерываний и у меня прекрасно USART1 работает. Трабла именно в передаче по прерываниям и именно в USART1 (и возможно именно в конкретном компиляторе) Я надеялся что мож кто сталкивался с такой проблемой именно с первым USART. или имеет рабочий код (желательно на Си) |
|
| Автор: | moLCHec [ Чт июн 14, 2007 16:40:05 ] |
| Заголовок сообщения: | |
На следущей неделе надеюсь доберусь до USART1 на М128, мне там кстати оба нужны, могу держать в курсе если к тому времени ничего не решится. Пишу на Си, но в ICC for AVR. Если проблема решится то прозьба отписать с указанием причины чтоб на одни и теже грабли всем котам не наступать ))))) |
|
| Автор: | Кашпо [ Пн июн 18, 2007 03:46:42 ] |
| Заголовок сообщения: | |
В общем тема такая. Проблему я обошёл. У USART есть два прерывания: - прерывание при пустоте буфера передачи и установке флага TXC. - прерывание при установке флага UDRE (опустошение регистра данных) кодогенератор по умолчанию генерит код с привязкой к первому прерыванию. В случае с USART1 такое почему-то не работает. Но вот если повеситься на второе прерывание, то получается вполне ничего. Нужно только при начале передачи учтанавливать флаг разрешения этого прерывания, а по опустошении всего буфера - скидывать. Напомню. Всё это тестировалось в симуляторе Proteus7, код компилился в CodeVisionAVR. Возможно это был просто глюк симулятора, в реале возможно таких глюком бы небыло - это мне неизвестно. Кто попробует - отпишитесь. |
|
| Автор: | Spider [ Пн июн 18, 2007 05:33:59 ] |
| Заголовок сообщения: | |
Всё это только в протеусе. второй юарт меги (любой у которой есть второй) в протеусе Глючит по умолчанию. Это уже не раз обсуждалось на казусе. |
|
| Автор: | Томатный [ Вт июл 31, 2007 21:48:13 ] |
| Заголовок сообщения: | |
у меня тоже проблема с прерываниями. два МК - ATmega8 соеденил 1 проводом(TXD-RXD), програмирую в WinAVR, симулирую в PROTEUS. код содрал с даташита, изменил только строки UCSRB = (1<<TXEN)|(1<<TXCIE); (разрешил передачу и прерывание на одном МК) UCSRB = (1<<RXEN)|(1<<RXCIE); (разрешил приём и прерывание на втором МК) в программе передаю первый байт, а по возникновению прерывания второй и третий(по очереди)... в PROTEUS наблюдаю что передаётся только первый байт. додумался разрешить прерывания функцией sei(); после этого в PROTEUS перестал работать ЖКИ подключенный к порту D микроконтролера который передаёт байты. на щёт второго МК PROTEUS начал ругаться сообщениями что не смоделирован какой-то регистр(сообщения появляются с очень большой частотой что всё виснет) подскажите пожалуйста что делаю не так? |
|
| Автор: | Томатный [ Ср авг 01, 2007 19:47:09 ] | ||
| Заголовок сообщения: | |||
я наверно не с того начал мне нужно чтоб один МК передавал состояние 8 кнопок и значение с двух АЦП(режим 8 бит) по одному проводу другому МК по УСАРТу. помогите разобраться с УСАРТом и его прерываниями Вот то что у меня уже есть:
|
|||
| Автор: | Томатный [ Пт авг 03, 2007 04:41:54 ] | ||
| Заголовок сообщения: | |||
Котики вы где? Тут так тихо, что аж страшно Это случайно не помидор на моей аватарке котов отпугивает? Вот опять прикрепляю свои программы, чучуть подкоректировал их, вродибы уже должно всё работать, но не работает У меня такие подозреня, что Протэус глючит а не я!
|
|||
| Автор: | tych [ Сб авг 04, 2007 00:42:29 ] |
| Заголовок сообщения: | |
Томатный писал(а): У меня такие подозреня, что Протэус глючит а не я!
Он любит глючить. Скачайте поновей по линку в моем профиле или попробуйте в VMLAB. |
|
| Автор: | Mozart [ Сб авг 04, 2007 12:08:24 ] |
| Заголовок сообщения: | |
томатик, вы меня извените конечно... вы используете прерывания УСАРТА... а прерывания по окончанию АЦ - преобразования использовать мама не позволяет??? и вообще программу начинайте писать с АЛГОРИТМА её работы!!! Код: pause(25000);
if (UCSRA & (1<<UDRE)) UDR = i[k]; //передать первый байт поменяйте местами паузу и условие, может что-нить то и получится.... |
|
| Автор: | Томатный [ Сб авг 04, 2007 15:43:01 ] |
| Заголовок сообщения: | |
tych, у меня PROTEUS 7.1 SP2 как и у вас на сайте Mozart, на даном этапе развития ещё не дошол до примененя прерывания АЦП. Алгоритм понимаю, по идее должно всё работать. Поменял, ничего не изменилось. Всётаки это PROTEUS мне кажется... Надо пробовать в реальной конструкции, но пока нету такой возможности. |
|
| Автор: | tych [ Сб авг 04, 2007 16:15:41 ] |
| Заголовок сообщения: | |
Флаг должен сбрасываться при переходе на обработчик прерывания. Еcли не сбрасывает - значит протеус виноват. Проект прицепите. вот вам протеус 7.2 - http://www.4shared.com/file/21322196/da9613b2/PR4.html |
|
| Автор: | tych [ Сб авг 04, 2007 16:24:24 ] |
| Заголовок сообщения: | |
Томатный писал(а): Всётаки это PROTEUS мне кажется...
Надо пробовать в реальной конструкции, но пока нету такой возможности. VMLAB не глючит практически. |
|
| Автор: | Mozart [ Сб авг 04, 2007 16:46:20 ] |
| Заголовок сообщения: | |
Цитата: Всётаки это PROTEUS мне кажется...
начнём с того что вы не правильно усарт настроили... и протеус не глючит... кто вам сказал что надо в функцию передавать скорость УСАРТа??????? |
|
| Автор: | Mozart [ Сб авг 04, 2007 16:59:26 ] |
| Заголовок сообщения: | |
у меня в протеусе всё заработало... |
|
| Автор: | Mozart [ Сб авг 04, 2007 17:05:00 ] |
| Заголовок сообщения: | |
усарт у меня заработал... ацп ваши не работают хотя на лсд показывают 255 в двух строчках... надо смотреть настройки, а мне сейчас некогда... значит где ваши косяки... УСАРТ у меги8 один!!! это я так к слову... в файлике транс.с и значит ошибки здеся... Код: void USART_Init(unsigned int baud) //Инициализация УСАРТ { UCSRC = 0; UBRRH = (unsigned char)(baud >> 8); //скорость УСАРТ UBRRL = (unsigned char)(baud); UCSRB = (1 << TXEN)|(1 << TXCIE); //Разрешить передачу и прерывание UCSRC = (1 << URSEL)|(1 << USBS)|(3 << UCSZ0); //8 бит данных, 2 стоп бита } и ошибка здеся... скажу что она в названии... Код: SIGNAL(SIG_UART0_TRANS)
{ if(k < 2) UDR = i[++k]; //если случиться прерывание передать i[1] затем i[2] } я прошу вас... не обозначайте массив как "i".... длина названия переменных не занимает больше памяти... |
|
| Автор: | Томатный [ Сб авг 04, 2007 20:09:46 ] |
| Заголовок сообщения: | |
Цитата: вот вам протеус 7.2 - http://www.4shared.com/file/21322196/da9613b2/PR4.html Спасибо! Чёт он у меня сам закрывается через время после того как сворачиваю. Цитата: начнём с того что вы не правильно усарт настроили... Цитата: в файлике транс.с и значит ошибки здеся... Гдето тут на форуме как-то увидел что в CodeVisionAVR есть генератор кода(не пользуюсь этой программой по этому не знал). Решил попробовать. Сгенерировал код. Пришлось добавить самому разрешение прерывания по окончанию приёма/передачи потому, что у меня дэмо версия. Код: void USART_Init() { UCSRA=0x00; UCSRB=0x48; //У приёмника UCSRB=0x90; UCSRC=0x8E; UBRRH = 0x00; UBRRL = 0x19; } С помощью даташыта перепроверил эти значения, но всеравно не работает Цитата: усарт у меня заработал... ацп ваши не работают хотя на лсд показывают 255 в двух строчках... У меня всё наоборот: усарт не работает, а АЦП работают и на ЖКИ отображаются правельные значения. Цитата: и ошибка здеся... скажу что она в названии... Цитата: УСАРТ у меги8 один!!! это я так к слову... Исправил на INTERRUPT(SIG_UART_TRANS) и INTERRUPT(SIG_UART_RECV) Цитата: я прошу вас... не обозначайте массив как "i".... Ок Цитата: длина названия переменных не занимает больше памяти...
Издеваетесь? Почему оно не работает? Спасибо что помогаете! |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


