Генерю начальный код в CodeVisionAVR.
Включаю передачу по прерываниям и приём по прерываниям.
скорость без разницы, ну допустим 9600. остальное по умолчанию (т.е. 8 бит с битом чётности и т.п.)
тестирую в Proteus
начинается всё с того, что проц вообще "не дышит" в сгенерированной по умолчанию проге. Не дышит он из-за того, что постоянно вызывается прерывание окончания передачи и это я ещё ничего не передавал! (он только из него вываливается, а оно тутже его обратно затягивает)
помогает только доработка прерывания, путём дописывания кода, сбрасывающего флаг TXC
вот что получается:
после этого процессор начинает работать.
пытаюсь передавать байты. Например вот так:
putchar1(111);
putchar1(222);
putchar1(222);
в результате первый символ передаётся, а остальные (которые должны прерыванием из буфера доставаться - не передаются)
если писать вот так:
putchar1(111);
delay_ms(1);
putchar1(222);
delay_ms(1);
putchar1(222);
всё передаётся.
всё вышеописанное относится только к USART1.
USART0 работает без проблем, в сгенерированый код ненужно дописывать сброс флагов и пр. всё работает как и должно быть в теории. Прерывания вызываются и из буфера передаётся.
инициализация, сгенерированная генератором кода - одинаковая для обоих передатчиков (ну за исключением названий портов)
где грабли? В компиляторе? в Протеусе? или в генах? :shock:
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
а-а-а. эти примеры? я думал мож где по этому сайту по-шукать или куда по-дальше слазить в инет
в указанном вами примере (путь полностью совпадает с моим )
не используются преривания ни на передачу, ни на приём. Без прерываний и у меня прекрасно USART1 работает.
Трабла именно в передаче по прерываниям и именно в USART1 (и возможно именно в конкретном компиляторе)
Я надеялся что мож кто сталкивался с такой проблемой именно с первым USART. или имеет рабочий код (желательно на Си)
На следущей неделе надеюсь доберусь до USART1 на М128, мне там кстати оба нужны, могу держать в курсе если к тому времени ничего не решится. Пишу на Си, но в ICC for AVR. Если проблема решится то прозьба отписать с указанием причины чтоб на одни и теже грабли всем котам не наступать )))))
_________________ Настоящий кот всегда либо голоден,
либо невыспался ...
В общем тема такая. Проблему я обошёл. У USART есть два прерывания:
- прерывание при пустоте буфера передачи и установке флага TXC.
- прерывание при установке флага UDRE (опустошение регистра данных)
кодогенератор по умолчанию генерит код с привязкой к первому прерыванию. В случае с USART1 такое почему-то не работает.
Но вот если повеситься на второе прерывание, то получается вполне ничего. Нужно только при начале передачи учтанавливать флаг разрешения этого прерывания, а по опустошении всего буфера - скидывать.
Напомню. Всё это тестировалось в симуляторе Proteus7, код компилился в CodeVisionAVR.
Возможно это был просто глюк симулятора, в реале возможно таких глюком бы небыло - это мне неизвестно. Кто попробует - отпишитесь.
у меня тоже проблема с прерываниями.
два МК - ATmega8 соеденил 1 проводом(TXD-RXD), програмирую в WinAVR, симулирую в PROTEUS.
код содрал с даташита, изменил только строки
UCSRB = (1<<TXEN)|(1<<TXCIE); (разрешил передачу и прерывание на одном МК)
UCSRB = (1<<RXEN)|(1<<RXCIE); (разрешил приём и прерывание на втором МК)
в программе передаю первый байт, а по возникновению прерывания второй и третий(по очереди)...
в PROTEUS наблюдаю что передаётся только первый байт.
додумался разрешить прерывания функцией sei();
после этого в PROTEUS перестал работать ЖКИ подключенный к порту D микроконтролера который передаёт байты.
на щёт второго МК PROTEUS начал ругаться сообщениями что не смоделирован какой-то регистр(сообщения появляются с очень большой частотой что всё виснет)
подскажите пожалуйста что делаю не так?
я наверно не с того начал
мне нужно чтоб один МК передавал состояние 8 кнопок и значение с двух АЦП(режим 8 бит) по одному проводу другому МК по УСАРТу.
помогите разобраться с УСАРТом и его прерываниями
Вот то что у меня уже есть:
Вложения:
Комментарий к файлу: Исходники(WinAVR) и HEX коды для обоих МК и проэкт в PROTEUS USART.rar [21.31 KiB]
Скачиваний: 396
Котики вы где?
Тут так тихо, что аж страшно Это случайно не помидор на моей аватарке котов отпугивает?
Вот опять прикрепляю свои программы, чучуть подкоректировал их,
вродибы уже должно всё работать, но не работает У меня такие подозреня, что Протэус глючит а не я!
Вложения:
Комментарий к файлу: Исходники(WinAVR) и HEX коды для обоих МК и проэкт в PROTEUS USART.rar [21.23 KiB]
Скачиваний: 362
томатик, вы меня извените конечно... вы используете прерывания УСАРТА... а прерывания по окончанию АЦ - преобразования использовать мама не позволяет???
и вообще программу начинайте писать с АЛГОРИТМА её работы!!!
Код:
pause(25000); if (UCSRA & (1<<UDRE)) UDR = i[k]; //передать первый байт
поменяйте местами паузу и условие, может что-нить то и получится....
_________________ если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Mozart,
на даном этапе развития ещё не дошол до примененя прерывания АЦП.
Алгоритм понимаю, по идее должно всё работать.
Поменял, ничего не изменилось.
Всётаки это PROTEUS мне кажется...
Надо пробовать в реальной конструкции, но пока нету такой возможности.
усарт у меня заработал... ацп ваши не работают хотя на лсд показывают 255 в двух строчках... надо смотреть настройки, а мне сейчас некогда... значит где ваши косяки...
УСАРТ у меги8 один!!! это я так к слову...
в файлике транс.с и значит ошибки здеся...
Спасибо! Чёт он у меня сам закрывается через время после того как сворачиваю.
Цитата:
начнём с того что вы не правильно усарт настроили...
Цитата:
в файлике транс.с и значит ошибки здеся...
Гдето тут на форуме как-то увидел что в CodeVisionAVR есть генератор кода(не пользуюсь этой программой по этому не знал). Решил попробовать. Сгенерировал код. Пришлось добавить самому разрешение прерывания по окончанию приёма/передачи потому, что у меня дэмо версия.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения