Аvrstudio/c#/песочница
24.12.2012, 22:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Есть там ожидание UDRE
|
|
|
|
24.12.2012, 22:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Ожидание типа "пока все не надоит - не отпустит?", процессор занят этим ожиданием ?
|
|
|
|
24.12.2012, 22:39
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Сообщение от whoim
|
ut1wpr, ужс какой осилить надо еще..
вроде как у меня счас "полностью" по прерыванию и есть? зачем несколько потоков если канал получения байтиков один? зачем несколько буферов если реально нужен один? получил в него данные, пропарсил раскидав по переменным в структуре - дальше..
|
Понял. Раз ужс, тогда не надо. 
Вообще-то, там еще кроме получения и разборки есть еще и передача буфера. Его-то я и предлагал на прерывания перевести. Ну, нет так нет...
Мой EB500 льет мессаги, как из ведра. Пять типов. Да если еще видимых много - то и инфы по ним тоже немеряно. Все это выливать - тоже время надо. Перенастраивать модуль в лом. Достаточно выкл-вкл и снова настраивать? Не, не хочу... А полностью уйдя в прерывания, какое-то жалкое подобие многозадачности получается. Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
24.12.2012, 23:47
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Так отключить все лишнее, и будет лить только то что надо.
|
|
|
|
25.12.2012, 05:58
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Сообщение от Boba_spb
|
Подпрограмму передачи строки в студию !!
Глянем как она работает, Прерывания ей ведомы иль "детский сад" ?
|
Ну вообще то все что что выкладывал находится в прерывании по приходу данных в уарт
Подпрограмма передачи - ожидание в статусном регистре данных (как правило, если прерывание сработало - то данные есть, так, на всякий) и возврат данных регистра дата
|
|
|
|
25.12.2012, 06:07
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Сообщение от ut1wpr
|
Понял. Раз ужс, тогда не надо. 
Вообще-то, там еще кроме получения и разборки есть еще и передача буфера. Его-то я и предлагал на прерывания перевести. Ну, нет так нет...
Мой EB500 льет мессаги, как из ведра. Пять типов. Да если еще видимых много - то и инфы по ним тоже немеряно. Все это выливать - тоже время надо. Перенастраивать модуль в лом. Достаточно выкл-вкл и снова настраивать? Не, не хочу... А полностью уйдя в прерывания, какое-то жалкое подобие многозадачности получается. Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
|
Давайте попробую описать логику работы полнее.
Таймер тикает в -- переменную (вачдог), дотикает до нуля - пробует настраивать порт и резетить gpio сам модуль. По очереди пробует на дефолтной скорости и разогнанный. Там же батарейка, которая сдохнуть может. Никто не знает, как настроен модуль. Если приходит что то в порт - передается в процедуру обработки данных по \n. То есть отсюда работа идет уже по прерыванию прихода в порт.
Первым делом если memcmp обнаруживает вменяемые данные - вачдог обновляется на максимум (полсекунды помоему). Далее, если модуль прислал что он стартанул - передается в подпрограмму его конфигурирования. Если (смотрим по флагу) скорость дефолтная - ему передается команда на разгон. Тут ручками вызывается инициализация порта с переключением флага, и если модуль присылает команду что стартанул - происходит его конфигурирование в оставшейся части. Скорость выдачи, потоки к выдаче, сбас, дгпс, нтрип, всякая хрень в общем.
В итоге по прерыванию порта идет посимвольное наполнение буфера, а если встретим \n то буфер передается на парсинг, и в зависимости от того что в нем - происходит или конфигурирование или парсинг и выдирание данных в структуру, некоторые данные еще пропускаются через фильтр калмана. Но сейчас это все отключено.
Цель - по прерыванию посимвольно наполнять буфер и при встрече \n показать его и счетчик на ноль (буфер наполнять сначала).
Последний раз редактировалось whoim; 25.12.2012 в 06:10.
|
|
|
|
25.12.2012, 06:08
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
ut1wpr, а какие прерывания еще у вас задействованы кроме прихода данных в порт и таймера для вачдога?
|
|
|
|
25.12.2012, 06:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Сообщение от ut1wpr
|
Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
|
Нет возможности описать что в каком прерывании и где, или показать кусок кода? ) Сам не показываю пока потому что код на работе) Доползу - все покажу
|
|
|
|
25.12.2012, 08:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
Вот глобальные переменные
|
Код:
|
volatile uint8_t _gnss_pos; //position on parsing line on RX
volatile char _gnss_line[200]; //line from UART ended 0x00
//GNSS WATCHDOG
volatile uint8_t gnss_flags; //bits› 0:baud (0 - 9600, 1 - 115200); 1: send RCM to console; 2: use kalman; 7: UART int busy; 6 - RX to buffer flag
volatile uint16_t gnss_watchdog; //timer ms for watchdog gnss module
volatile uint8_t gnss_respond_fail_counter; //counter fault gnss respond |
Вот прерывание по приходу данных в порт
|
Код:
|
ISR(USARTC1_RXC_vect)
{
if(!(gnss_flags&PIN7_bm)) //не стоит флаг uart busy (обработка внутри парсера)
{
gnss_flags |= PIN7_bm; //ставим флаг занятости UARTa обработкой
//read line
uint8_t _gnss_char = GNSS_read_byte();
//RS485_send_byte(_gnss_char);
if(_gnss_char == '$')
{
gnss_flags |= PIN6_bm; //разрешаем
_gnss_pos = 0; //обнуляем счетчик
}
if(_gnss_char == '\n') //символ окончания строки \r, первый встречающийся
{
gnss_flags&=~PIN6_bm; //запрещаем
_gnss_line[_gnss_pos] = '\n';
_gnss_line[_gnss_pos+1] = 0x00; //EOF
//отладка
RS485_send_str(_gnss_line);RS485_send_str("\r\n");
_gnss_pos = 0;
//вачдог порта
gnss_parse_line();
}
if(gnss_flags&PIN6_bm) //если разрешено
{
_gnss_line[_gnss_pos] = _gnss_char;
_gnss_pos++; //increment counter
}
//gnss_watchdog = GNSS_WATCHDOG_T;
gnss_flags &= ~PIN7_bm; //снимаем флаг
}
else
{
RS485_send_str("gnss uart send data but parser is busy\r\n");
}
} |
Вот работа с UART
|
Код:
|
//////////////////////////////////////////////////////////////////////////
//UART прием/передача
//////////////////////////////////////////////////////////////////////////
uint8_t GNSS_read_byte(void)
{
//while(!(USARTC1_STATUS & USART_RXCIF_bm));
return USARTC1.DATA;
}
void GNSS_send_byte(uint8_t _v)
{
while (!(USARTC1.STATUS & USART_DREIF_bm));
USARTC1.DATA = _v;
}
void GNSS_send_str(const char *str)
{
while(*str)
GNSS_send_byte(*(str++));
} |
Вот то что пока в gnss_parse_line();
|
Код:
|
//if gnss module started, apply settings
if(memcmp(_gnss_line, "$PMTK010,001*2E", 15) == 0)
gnss_config();
//if parceable data, update watchdog time to max
if(memcmp(_gnss_line, "$GPRMC", 6) == 0 || memcmp(_gnss_line, "$GPGGA", 6) == 0 || memcmp(_gnss_line, "$PMTK", 5) == 0)
{
//watchdog
gnss_watchdog = GNSS_WATCHDOG_T;
//fail counter
gnss_respond_fail_counter = 0;
} |
Как видите, тупо вачдог. Он обрабатывается в прерывании таймера каждую миллисекунду
|
Код:
|
//GNSS watchdog
if(gnss_watchdog != 0)
gnss_watchdog--;
else
{
//log
#ifdef DEBUG_485
RS485_send_str("gnss watchdog\r\n");
#endif
gnss_respond_fail_counter++;
if(gnss_respond_fail_counter ›= GNSS_FAIL_RESPOND_C)
{
gnss_respond_fail_counter = 0;
#ifdef DEBUG_SD
SDMMC_write_log("gnss module start fail\r\n");
#endif
#ifdef DEBUG_485
RS485_send_str("gnss module start fail\r\n");
#endif
}
gnss_watchdog = GNSS_WATCHDOG_T; //restart watchdog
//reinit gnss module
GNSS_init();
} |
Ну, если надо выкину конечно конфигурацию модуля и настройки порта, но все работает в этом плане
|
|
|
|
25.12.2012, 09:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Аvrstudio/c#/песочница
попробовал разную скорость порта (вплоть до 19200 взамен 115200), потыкал отладочными сообщениями.. итог всегда один
если модуль шлет только одну строку, все работает четко
как только он подряд шлет две строки - вторая теряется и корежится
видимо, проблема в том что он шлет подряд обе две строки. Нужен хотя бы небольшой промежуток между ними. Получается, я, пока у меня идет вывод - теряю байтики в регистре data потому что не забрал их?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Песочница по С
|
RY723 |
Электроника - это просто |
0 |
27.02.2011 14:05 |
Часовой пояс GMT +4, время: 20:49.
|
|