Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Аvrstudio/c#/песочница

Непрочитано 24.12.2012, 22:21  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Есть там ожидание UDRE
Реклама:
omercury вне форума  
Непрочитано 24.12.2012, 22:35  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Ожидание типа "пока все не надоит - не отпустит?", процессор занят этим ожиданием ?
Boba_spb вне форума  
Непрочитано 24.12.2012, 22:39  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Сообщение от whoim Посмотреть сообщение
ut1wpr, ужс какой осилить надо еще..
вроде как у меня счас "полностью" по прерыванию и есть? зачем несколько потоков если канал получения байтиков один? зачем несколько буферов если реально нужен один? получил в него данные, пропарсил раскидав по переменным в структуре - дальше..
Понял. Раз ужс, тогда не надо.
Вообще-то, там еще кроме получения и разборки есть еще и передача буфера. Его-то я и предлагал на прерывания перевести. Ну, нет так нет...
Мой EB500 льет мессаги, как из ведра. Пять типов. Да если еще видимых много - то и инфы по ним тоже немеряно. Все это выливать - тоже время надо. Перенастраивать модуль в лом. Достаточно выкл-вкл и снова настраивать? Не, не хочу... А полностью уйдя в прерывания, какое-то жалкое подобие многозадачности получается. Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 24.12.2012, 23:47  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Так отключить все лишнее, и будет лить только то что надо.
Boba_spb вне форума  
Непрочитано 25.12.2012, 05:58  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Сообщение от Boba_spb Посмотреть сообщение
Подпрограмму передачи строки в студию !!
Глянем как она работает, Прерывания ей ведомы иль "детский сад" ?
Ну вообще то все что что выкладывал находится в прерывании по приходу данных в уарт
Подпрограмма передачи - ожидание в статусном регистре данных (как правило, если прерывание сработало - то данные есть, так, на всякий) и возврат данных регистра дата
whoim вне форума  
Непрочитано 25.12.2012, 06:07  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Сообщение от ut1wpr Посмотреть сообщение
Понял. Раз ужс, тогда не надо.
Вообще-то, там еще кроме получения и разборки есть еще и передача буфера. Его-то я и предлагал на прерывания перевести. Ну, нет так нет...
Мой EB500 льет мессаги, как из ведра. Пять типов. Да если еще видимых много - то и инфы по ним тоже немеряно. Все это выливать - тоже время надо. Перенастраивать модуль в лом. Достаточно выкл-вкл и снова настраивать? Не, не хочу... А полностью уйдя в прерывания, какое-то жалкое подобие многозадачности получается. Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
Давайте попробую описать логику работы полнее.
Таймер тикает в -- переменную (вачдог), дотикает до нуля - пробует настраивать порт и резетить gpio сам модуль. По очереди пробует на дефолтной скорости и разогнанный. Там же батарейка, которая сдохнуть может. Никто не знает, как настроен модуль. Если приходит что то в порт - передается в процедуру обработки данных по \n. То есть отсюда работа идет уже по прерыванию прихода в порт.

Первым делом если memcmp обнаруживает вменяемые данные - вачдог обновляется на максимум (полсекунды помоему). Далее, если модуль прислал что он стартанул - передается в подпрограмму его конфигурирования. Если (смотрим по флагу) скорость дефолтная - ему передается команда на разгон. Тут ручками вызывается инициализация порта с переключением флага, и если модуль присылает команду что стартанул - происходит его конфигурирование в оставшейся части. Скорость выдачи, потоки к выдаче, сбас, дгпс, нтрип, всякая хрень в общем.

В итоге по прерыванию порта идет посимвольное наполнение буфера, а если встретим \n то буфер передается на парсинг, и в зависимости от того что в нем - происходит или конфигурирование или парсинг и выдирание данных в структуру, некоторые данные еще пропускаются через фильтр калмана. Но сейчас это все отключено.

Цель - по прерыванию посимвольно наполнять буфер и при встрече \n показать его и счетчик на ноль (буфер наполнять сначала).

Последний раз редактировалось whoim; 25.12.2012 в 06:10.
whoim вне форума  
Непрочитано 25.12.2012, 06:08  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

ut1wpr, а какие прерывания еще у вас задействованы кроме прихода данных в порт и таймера для вачдога?
whoim вне форума  
Непрочитано 25.12.2012, 06:13  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

Сообщение от ut1wpr Посмотреть сообщение
Прием и передача прозрачно, куча времени на обработку строк.
Но повторяю, нет так нет...
Нет возможности описать что в каком прерывании и где, или показать кусок кода? ) Сам не показываю пока потому что код на работе) Доползу - все покажу
whoim вне форума  
Непрочитано 25.12.2012, 08:34  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию 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();
	}
Ну, если надо выкину конечно конфигурацию модуля и настройки порта, но все работает в этом плане
whoim вне форума  
Непрочитано 25.12.2012, 09:36  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Аvrstudio/c#/песочница

попробовал разную скорость порта (вплоть до 19200 взамен 115200), потыкал отладочными сообщениями.. итог всегда один
если модуль шлет только одну строку, все работает четко
как только он подряд шлет две строки - вторая теряется и корежится

видимо, проблема в том что он шлет подряд обе две строки. Нужен хотя бы небольшой промежуток между ними. Получается, я, пока у меня идет вывод - теряю байтики в регистре data потому что не забрал их?
whoim вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Песочница по С RY723 Электроника - это просто 0 27.02.2011 14:05


Часовой пояс GMT +4, время: 20:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.