|
|
  |
tiny2313 UART работает с перерывами. |
|
|
|
Oct 6 2008, 11:30
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Сделали такую конструкцию: соединили atmega128 и attiny2313 уартами через 485 драйвер. Скорость 9600, на тини кварц - 4.000 МГц. В качестве отладки написал такую программу: с меги постоянно валятся байты на скорости 9600 (осциллографом проверено). На тини создан проект (в codevision avr), в настройках включен усарт с прерыванием. В обработчике усарта вписал только одну строчку: PORTB.6=!PINB.6 По идее на этой ноге должен получиться меандр с частотой приёма символов. На самом деле получается 10 изменений уровня, затем пауза примерно 25 мс. В чём может быть проблема?
|
|
|
|
|
Oct 6 2008, 12:33
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Цитата(gormih @ Oct 6 2008, 16:27)  Протокол обмена какой? Что там передается - непрерывный поток? В смысле, протокол? Байт данных передаётся командой putchar, соответственно по прерыванию этот байт принимается тини. Или я чего-то ещё не сделал? Цитата(Alexis25 @ Oct 6 2008, 15:30)  Сделали такую конструкцию: соединили atmega128 и attiny2313 уартами через 485 драйвер. Скорость 9600, на тини кварц - 4.000 МГц. В качестве отладки написал такую программу: с меги постоянно валятся байты на скорости 9600 (осциллографом проверено). На тини создан проект (в codevision avr), в настройках включен усарт с прерыванием. В обработчике усарта вписал только одну строчку: PORTB.6=!PINB.6 По идее на этой ноге должен получиться меандр с частотой приёма символов. На самом деле получается 10 изменений уровня, затем пауза примерно 25 мс. В чём может быть проблема? Поправка: меандр должен быть с частотой приёма БАЙТОВ.
|
|
|
|
|
Oct 6 2008, 13:17
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 4-10-08
Пользователь №: 40 693

|
Цитата(Alexis25 @ Oct 6 2008, 16:33)  Поправка: меандр должен быть с частотой приёма БАЙТОВ. Поменьше ! в 2 раза и еще меньше за счет стартов стопов. Подробное описание подключения и программирования UART - http://www.radiokot.ru/forum/viewtopic.php?t=11048Вот так: PORTB.6 ^= 1; или так: PORTB.6 ++; Почетче будет пахать, так как не будет зависеть от того что конкретно на ноге есть. Цитата(Alexis25 @ Oct 6 2008, 15:30)  На тини создан проект (в codevision avr) Вот и приложите его архивчиком. А 2 МК (и больше и разных ядер) вы можете в PROTEUS отлаживать виртуально.
|
|
|
|
|
Oct 6 2008, 13:18
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Цитата(hainiken @ Oct 6 2008, 17:14)  Поменьше ! в 2 раза и еще меньше за счет стартов стопов. Подробное описание подключения и программирования UART - http://www.radiokot.ru/forum/viewtopic.php?t=11048Ну не суть, меандр-то должен быть равномерным. А наблюдаются периодические паузы.
Сообщение отредактировал Alexis25 - Oct 6 2008, 13:21
Прикрепленные файлы
2f.zip ( 31.83 килобайт )
Кол-во скачиваний: 45
|
|
|
|
|
Oct 6 2008, 13:24
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 4-10-08
Пользователь №: 40 693

|
Цитата(Alexis25 @ Oct 6 2008, 17:18)  Ну не суть Ну просто вы отдельный пост поправке посвятили - хотя символ это и есть байт при 8N1 - т.е. обычно. Цитата(Alexis25 @ Oct 6 2008, 17:18)  меандр-то должен быть равномерным. А наблюдаются периодические паузы. Исходник нужно зырить. UDR не нужно считывать чтоб он освобождался ? ===== Попробуйте драйвер 485 убрать и соединить напрямую UART через резиторы 1 кОм если МК рядом.
|
|
|
|
|
Oct 6 2008, 13:47
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Цитата(hainiken @ Oct 6 2008, 17:24)  Ну просто вы отдельный пост поправке посвятили - хотя символ это и есть байт при 8N1 - т.е. обычно. Исходник нужно зырить. UDR не нужно считывать чтоб он освобождался ?
===== Попробуйте драйвер 485 убрать и соединить напрямую UART через резиторы 1 кОм если МК рядом. Странно, без драйвера работает. По крайней мере сейчас. Спасибо, буду копать дальше.
|
|
|
|
|
Oct 6 2008, 15:17
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(Alexis25 @ Oct 6 2008, 17:47)  Странно, без драйвера работает. По крайней мере сейчас. ... Скорее всего, как уже было подмечено, нужно читать регистр UDR иначе у вас прерывание будет возникать несколько раз после приема одного байта. Вот цитата из даташита Цитата When the Receive Complete Interrupt Enable (RXCIE) in UCSRB is set, the USART Receive Complete interrupt will be executed as long as the RXC flag is set (provided that global interrupts are enabled). When interrupt-driven data reception is used, the receive complete routine must read the received data from UDR in order to clear the RXC flag, otherwise a new interrupt will occur once the interrupt routine terminates
|
|
|
|
|
Oct 6 2008, 15:33
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Читаем: Цитата(Alexis25 @ Oct 6 2008, 15:30)  На тини создан проект (в codevision avr), в настройках включен усарт с прерыванием. В обработчике усарта вписал только одну строчку: PORTB.6=!PINB.6 А в выложенном исходнике: Цитата interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; PORTB.6++; } Нефиговая такая строчечка, да.... с равномерным таким временем выполнения, ага У вас линия RS485 к 2.5 вольтам подтянута? Без этого будет приниматься мусор, и такой обработчик (" PORTB.6++;") прерывания его зафиксирует. Мусорные "байты" могут "приходить" в любой момент.
|
|
|
|
|
Oct 7 2008, 06:37
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Цитата(SysRq @ Oct 6 2008, 19:33)  Читаем: А в выложенном исходнике: Нефиговая такая строчечка, да.... с равномерным таким временем выполнения, ага У вас линия RS485 к 2.5 вольтам подтянута? Без этого будет приниматься мусор, и такой обработчик (" PORTB.6++;") прерывания его зафиксирует. Мусорные "байты" могут "приходить" в любой момент. Я вписал только одну строчку, остальное сгенерировано автоматически. Правда я её уже поправил на PORTB.6++, как мне тут посоветовали. А по поводу 2.5 вольт можно подробнее? или лучше ссылку. Это не "защитное" ли смещение? Действительно, те самые паузы на витухе тоже наблюдаются.
Сообщение отредактировал Alexis25 - Oct 7 2008, 07:09
|
|
|
|
|
Oct 8 2008, 18:00
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(Alexis25 @ Oct 7 2008, 10:37)  Это не "защитное" ли смещение? ТЫЦ, с пункта "Отказоустойчивость". Из опыта выяснилоь, что сие есть весьма важно. Цитата(Alexis25 @ Oct 7 2008, 10:37)  Действительно, те самые паузы на витухе тоже наблюдаются. Дык может паузы создает тот кто данные отправляет?
Сообщение отредактировал SysRq - Oct 8 2008, 18:01
|
|
|
|
|
Oct 9 2008, 06:04
|
Группа: Участник
Сообщений: 11
Регистрация: 6-10-08
Пользователь №: 40 719

|
Цитата(SysRq @ Oct 8 2008, 22:00)  ТЫЦ, с пункта "Отказоустойчивость". Из опыта выяснилоь, что сие есть весьма важно. Дык может паузы создает тот кто данные отправляет? Нет, он пауз не создаёт. Появляются именно после интерфейса. Подозреваю, что это 50 Гц.
|
|
|
|
|
Oct 13 2008, 22:14
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Alexis25 @ Oct 6 2008, 16:47)  Странно, без драйвера работает. По крайней мере сейчас. Спасибо, буду копать дальше. Цитата Нет, он пауз не создаёт. Появляются именно после интерфейса. Подозреваю, что это 50 Гц. Значит нужно искать в самом 485 передатчике. В передатчике сигнал "разрешение передачи" всегда активен? или активируется непосредственно перед передачей очередного байта? Если активируется, то учтена ли задержка переключения режима работы ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|