Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: tiny2313 UART работает с перерывами.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Alexis25
Сделали такую конструкцию: соединили atmega128 и attiny2313 уартами через 485 драйвер.
Скорость 9600, на тини кварц - 4.000 МГц.
В качестве отладки написал такую программу: с меги постоянно валятся байты на скорости 9600 (осциллографом проверено). На тини создан проект (в codevision avr), в настройках включен усарт с прерыванием. В обработчике усарта вписал только одну строчку:
PORTB.6=!PINB.6
По идее на этой ноге должен получиться меандр с частотой приёма символов. На самом деле получается 10 изменений уровня, затем пауза примерно 25 мс.
В чём может быть проблема?
gormih
Цитата(Alexis25 @ Oct 6 2008, 15:30) *
Сделали такую конструкцию: соединили atmega128 и attiny2313 уартами через 485 драйвер.
Скорость 9600, на тини кварц - 4.000 МГц.
В качестве отладки написал такую программу: с меги постоянно валятся байты на скорости 9600 (осциллографом проверено). На тини создан проект (в codevision avr), в настройках включен усарт с прерыванием. В обработчике усарта вписал только одну строчку:
PORTB.6=!PINB.6
По идее на этой ноге должен получиться меандр с частотой приёма символов. На самом деле получается 10 изменений уровня, затем пауза примерно 25 мс.
В чём может быть проблема?

Протокол обмена какой? Что там передается - непрерывный поток?
Alexis25
Цитата(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 мс.
В чём может быть проблема?

Поправка: меандр должен быть с частотой приёма БАЙТОВ.
hainiken
Цитата(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 отлаживать виртуально.
Alexis25
Цитата(hainiken @ Oct 6 2008, 17:14) *
Поменьше ! в 2 раза и еще меньше за счет стартов стопов. Подробное описание подключения и программирования UART - http://www.radiokot.ru/forum/viewtopic.php?t=11048


Ну не суть, меандр-то должен быть равномерным. А наблюдаются периодические паузы.
hainiken
Цитата(Alexis25 @ Oct 6 2008, 17:18) *
Ну не суть

Ну просто вы отдельный пост поправке посвятили - хотя символ это и есть байт при 8N1 - т.е. обычно.

Цитата(Alexis25 @ Oct 6 2008, 17:18) *
меандр-то должен быть равномерным. А наблюдаются периодические паузы.

Исходник нужно зырить. UDR не нужно считывать чтоб он освобождался ?

=====
Попробуйте драйвер 485 убрать и соединить напрямую UART через резиторы 1 кОм если МК рядом.
Alexis25
Цитата(hainiken @ Oct 6 2008, 17:24) *
Ну просто вы отдельный пост поправке посвятили - хотя символ это и есть байт при 8N1 - т.е. обычно.
Исходник нужно зырить. UDR не нужно считывать чтоб он освобождался ?

=====
Попробуйте драйвер 485 убрать и соединить напрямую UART через резиторы 1 кОм если МК рядом.


Странно, без драйвера работает. По крайней мере сейчас. Спасибо, буду копать дальше.
smac
Цитата(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
SysRq
Читаем:
Цитата(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++;
}


Нефиговая такая строчечка, да.... с равномерным таким временем выполнения, ага twak.gif

У вас линия RS485 к 2.5 вольтам подтянута? Без этого будет приниматься мусор, и такой обработчик ("PORTB.6++;") прерывания его зафиксирует. Мусорные "байты" могут "приходить" в любой момент.
Alexis25
Цитата(SysRq @ Oct 6 2008, 19:33) *
Читаем:

А в выложенном исходнике:
Нефиговая такая строчечка, да.... с равномерным таким временем выполнения, ага twak.gif

У вас линия RS485 к 2.5 вольтам подтянута? Без этого будет приниматься мусор, и такой обработчик ("PORTB.6++;") прерывания его зафиксирует. Мусорные "байты" могут "приходить" в любой момент.


Я вписал только одну строчку, остальное сгенерировано автоматически. Правда я её уже поправил на PORTB.6++, как мне тут посоветовали.

А по поводу 2.5 вольт можно подробнее? или лучше ссылку. Это не "защитное" ли смещение? Действительно, те самые паузы на витухе тоже наблюдаются.
SysRq
Цитата(Alexis25 @ Oct 7 2008, 10:37) *
Это не "защитное" ли смещение?
ТЫЦ, с пункта "Отказоустойчивость". Из опыта выяснилоь, что сие есть весьма важно.

Цитата(Alexis25 @ Oct 7 2008, 10:37) *
Действительно, те самые паузы на витухе тоже наблюдаются.
Дык может паузы создает тот кто данные отправляет?
Alexis25
Цитата(SysRq @ Oct 8 2008, 22:00) *
ТЫЦ, с пункта "Отказоустойчивость". Из опыта выяснилоь, что сие есть весьма важно.

Дык может паузы создает тот кто данные отправляет?

Нет, он пауз не создаёт. Появляются именно после интерфейса. Подозреваю, что это 50 Гц.
zombi
Цитата(Alexis25 @ Oct 6 2008, 16:47) *
Странно, без драйвера работает. По крайней мере сейчас. Спасибо, буду копать дальше.

Цитата
Нет, он пауз не создаёт. Появляются именно после интерфейса. Подозреваю, что это 50 Гц.

Значит нужно искать в самом 485 передатчике.
В передатчике сигнал "разрешение передачи" всегда активен? или активируется непосредственно перед передачей очередного байта? Если активируется, то учтена ли задержка переключения режима работы ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.