Страница 1 из 2
ATmega128 : USART1
Добавлено: Чт июн 14, 2007 08:20:34
Кашпо
Генерю начальный код в 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:
Добавлено: Чт июн 14, 2007 10:13:41
tych
Посмотрите пример CVAVR по работе с двумя USART. Как там ?
Добавлено: Чт июн 14, 2007 10:40:10
Кашпо
tych писал(а):Посмотрите пример CVAVR по работе с двумя USART. Как там ?
Да мне не с двумя нужно. Мне с одним, но с USART1, так как ноги USART0 заняты другими делами.
а где смотреть, если что??
Добавлено: Чт июн 14, 2007 10:45:11
tych
Примеры обычно смотрят в примерах.
C:\CVAVR\examples\2USART_LCD
Добавлено: Чт июн 14, 2007 11:09:16
Кашпо
tych писал(а):Примеры обычно смотрят в примерах.
C:\CVAVR\examples\2USART_LCD
а-а-а. эти примеры? я думал мож где по этому сайту по-шукать или куда по-дальше слазить в инет
в указанном вами примере (путь полностью совпадает с моим

)
не используются преривания ни на передачу, ни на приём. Без прерываний и у меня прекрасно USART1 работает.
Трабла именно в передаче по прерываниям и именно в USART1 (и возможно именно в конкретном компиляторе)
Я надеялся что мож кто сталкивался с такой проблемой именно с первым USART. или имеет рабочий код (желательно на Си)
Добавлено: Чт июн 14, 2007 16:40:05
moLCHec
На следущей неделе надеюсь доберусь до USART1 на М128, мне там кстати оба нужны, могу держать в курсе если к тому времени ничего не решится. Пишу на Си, но в ICC for AVR. Если проблема решится то прозьба отписать с указанием причины чтоб на одни и теже грабли всем котам не наступать )))))

Добавлено: Пн июн 18, 2007 03:46:42
Кашпо
В общем тема такая. Проблему я обошёл. У USART есть два прерывания:
- прерывание при пустоте буфера передачи и установке флага TXC.
- прерывание при установке флага UDRE (опустошение регистра данных)
кодогенератор по умолчанию генерит код с привязкой к первому прерыванию. В случае с USART1 такое почему-то не работает.
Но вот если повеситься на второе прерывание, то получается вполне ничего. Нужно только при начале передачи учтанавливать флаг разрешения этого прерывания, а по опустошении всего буфера - скидывать.
Напомню. Всё это тестировалось в симуляторе Proteus7, код компилился в CodeVisionAVR.
Возможно это был просто глюк симулятора, в реале возможно таких глюком бы небыло - это мне неизвестно. Кто попробует - отпишитесь.
Добавлено: Пн июн 18, 2007 05:33:59
Spider
Всё это только в протеусе. второй юарт меги (любой у которой есть второй) в протеусе Глючит по умолчанию. Это уже не раз обсуждалось на казусе.
Добавлено: Вт июл 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
Томатный
Котики вы где?
Тут так тихо, что аж страшно
Это случайно не помидор на моей аватарке котов отпугивает?
Вот опять прикрепляю свои программы, чучуть подкоректировал их,
вродибы уже должно всё работать, но не работает
У меня такие подозреня, что Протэус глючит а не я!

Добавлено: Сб авг 04, 2007 00:42:29
tych
Томатный писал(а):У меня такие подозреня, что Протэус глючит а не я!

Он любит глючить.
Скачайте поновей по линку в моем профиле или попробуйте в VMLAB.
Добавлено: Сб авг 04, 2007 12:08:24
Mozart
томатик, вы меня извените конечно... вы используете прерывания УСАРТА... а прерывания по окончанию АЦ - преобразования использовать мама не позволяет???
и вообще программу начинайте писать с АЛГОРИТМА её работы!!!
Код: Выделить всё
pause(25000);
if (UCSRA & (1<<UDRE)) UDR = i[k]; //передать первый байт
поменяйте местами паузу и условие, может что-нить то и получится....
Добавлено: Сб авг 04, 2007 15:43:01
Томатный
tych, у меня PROTEUS 7.1 SP2 как и у вас на сайте
Mozart,
на даном этапе развития ещё не дошол до примененя прерывания АЦП.
Алгоритм понимаю, по идее должно всё работать.
Поменял, ничего не изменилось.
Всётаки это PROTEUS мне кажется...
Надо пробовать в реальной конструкции, но пока нету такой возможности.
Добавлено: Сб авг 04, 2007 16:15:41
tych
Флаг должен сбрасываться при переходе на обработчик прерывания.
Еcли не сбрасывает - значит протеус виноват. Проект прицепите.
вот вам протеус 7.2 -
http://www.4shared.com/file/21322196/da9613b2/PR4.html
Добавлено: Сб авг 04, 2007 16:24:24
tych
Томатный писал(а):Всётаки это PROTEUS мне кажется...
Надо пробовать в реальной конструкции,
но пока нету такой возможности.
VMLAB не глючит практически.
Добавлено: Сб авг 04, 2007 16:46:20
Mozart
Всётаки это PROTEUS мне кажется...
начнём с того что вы не правильно усарт настроили... и протеус не глючит... кто вам сказал что надо в функцию передавать скорость УСАРТа???????
Добавлено: Сб авг 04, 2007 16:59:26
Mozart
у меня в протеусе всё заработало...
Добавлено: Сб авг 04, 2007 17:05:00
Mozart
усарт у меня заработал... ацп ваши не работают хотя на лсд показывают 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
Томатный
Спасибо! Чёт он у меня сам закрывается через время после того как сворачиваю.
начнём с того что вы не правильно усарт настроили...
в файлике транс.с и значит ошибки здеся...
Гдето тут на форуме как-то увидел что в 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"....
Ок
длина названия переменных не занимает больше памяти...
Издеваетесь?

Почему оно не работает?
Спасибо что помогаете!