AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.07.2019, 18:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от Deniska407
|
Моя же программа принимает только ОДИН
|
i в перывании по приему обнуляется, посему пишется всегда только в frame[0]
|
|
|
|
04.07.2019, 18:28
|
|
Прохожий
Регистрация: 03.07.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от Ara41
|
i в перывании по приему обнуляется, посему пишется всегда только в frame[0]
|
Не подскажете "чайнику" как быть и как должен выглядеть алгоритм в этом случае?
|
|
|
|
04.07.2019, 19:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
в прерывании заполняем frame, по приему 8 байт взводим флаг приема, обрабатываем farme в main, обнуляя уже там i и сбрасывая флаг приема. Как-то так )
|
|
|
|
04.07.2019, 20:34
|
|
Прохожий
Регистрация: 03.07.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от akegor
|
Deniska407, почему бы Вам было не указать в явном виде скорость обмена? Лениво мне, как-то, ковыряться в ДШ...
Откуда взяты 5мс задержки после загрузки байта в УДР ? Вообще-то, гораздо беспроигрышней отлавливать событие "передача байта окончена" по соответствующему флагу.
Вы дрыгаете ножкой направления для каждого байта. А почему бы не сделать прием-передачу через кольцевой буфер на прерываниях? В этом случае ставить на передачу можно один раз на все байты буфера, а переключать на чтение после передачи последнего байта.
У меня все работает именно так.
|
Уважаемый Akegor! В том то и дело, что опыта работы с:
"... А почему бы не сделать прием-передачу через кольцевой буфер на прерываниях? В этом случае ставить на передачу можно один раз на все байты буфера, а переключать на чтение после передачи последнего байта. У меня все работает именно так..."
Ножкой дрыгаю при передаче - так работает китайская плата UART-›RS-485 (контакты DE и RE). Замечание принимаю! Конечно же нужно дрыгать в функции:
void USART_Transmit_String() а не в:
void USART_Transmit( unsigned char data ) !
ОГРОМНОЕ спасибо за это замечание!
Осталось понять как принимать не 1 байт а целую телеграмму в в frame[i] ... тогда парсинг написать для меня будет вообще без проблем!
|
|
|
|
04.07.2019, 21:46
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,771 раз(а) в 5,896 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от Deniska407
|
Осталось понять...
|
Во вложении (поменять расширение на "с") файл, который генерит визард CV AVR. Сгенерил специально для Вас только с УАРТом, с одним. Это чтобы не загромождать. Посмотрите, понравится - примените, если "не очень" - допилите до "очень" (я применяю допиленный вариант). Управление 485-м добавляется "парой кликов мыши".
Удачи!
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.07.2019, 03:21
|
|
Прохожий
Регистрация: 03.07.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от akegor
|
Во вложении (поменять расширение на "с") файл, который генерит визард CV AVR. Сгенерил специально для Вас только с УАРТом, с одним. Это чтобы не загромождать. Посмотрите, понравится - примените, если "не очень" - допилите до "очень" (я применяю допиленный вариант). Управление 485-м добавляется "парой кликов мыши".
Удачи!
|
к огромному сожалению квалификации не хватило разобраться в этом файле ... пока мучаюсь с таким куском кода:
PHP код:
|
ISR (USART0_RX_vect)
{
frame[0] = UDR0;
flagRX=1;
}
int main(void)
{
USART_Init();
StartTransmit_SET_OUTPUT;
StartTransmit_HIGH;
LED_SET_OUTPUT;
LED_LOW;
sei();
flagRX=0;
while(1)
{
if (flagRX==1)
{
exceptionResponse(5);
flagRX = 0;
}
}
}
|
как читать из буфера столько байт, сколько в нем находится и помещать их по очереди в массив frame[i] и по i понимать длину массива - вот это для меня БОЛЬШАЯ загадка ... хотя может весь фокус действительно в терминале... завтра буду посылать телеграммы из TERMITE (ModBUS RTU Terminal). Может быть он байты в порт как то кладет иначе ...
|
|
|
|
05.07.2019, 09:46
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,771 раз(а) в 5,896 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от Deniska407
|
к огромному сожалению...
|
Переработал чуть: поубирал все лишнее и чуть прокомментировал. Смотрите. Будут вопросы и неясности - спрашивайте.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
06.07.2019, 13:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от parovoZZ
|
Я даже на ЛА вижу джиттер от 441/841.
|
Тащем-то джиттер и другая частота - разные вещи.
__________________
Экзорцист 40-го уровня.
|
|
|
|
07.07.2019, 17:49
|
|
Прохожий
Регистрация: 03.07.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Уважаемые коллеги!
Вот что у меня получилось отладить и получить требуемый результат на Ардуинке:
Код:
|
unsigned char frame_buffer = 0;
unsigned char buf_overflow = 0;
while (Serial.available())
{
if (buf_overflow)
Serial.read();
else
{
if (frame_buffer == 32) buf_overflow = 1;
frame[frame_buffer] = Serial.read();
frame_buffer++;
}
delayMicroseconds(1500); // подобрал опытным путем. вроде принимает нормально.
} |
этот кусок кода четко объясняет что мне хочется получить: а) последовательно прочитать все телеграмму: 50 03 01 00 00 01 88 77 (запрос по RS-485) и засунуть в массив frame:
frame[0]=50, frame[1]=03, frame[2]=01, frame[3]=00, frame[4]=00, frame[5]=01, frame[6]=88, frame[7]=77
как это переложить на С++, используя ISR (USART0_RX_vect) /прерывание/ я не знаю. Все, что я пока добился - чтение одного единственного (ПЕРВОГО) байта и все. Не понимаю, как читать из буфера телеграмму и по какому признаку останавливаться, получая frame_buffer, который указывает сколько байт в телеграмме. Если кому не сложно, разжуйте, пожалуйста, нубу ...
|
|
|
|
08.07.2019, 10:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Код:
|
ISR (USART0_RX_vect)
{
frame[i++] = UDR0;
if (i==8)
{
flagRX=1; //ТЕЛЕГРАММА ПОЛУЧЕНА
i=0;
}
} |
как-то так
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:31.
|
|