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

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

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

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

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

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


 
Опции темы
Непрочитано 03.04.2015, 14:18  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от STM32F0 Посмотреть сообщение
Какие прерывания?
Как минимум — compare/capture (считать принятые данные, загрузить новый бит), возможно, еще UEV.
Совсем без прерываний не выйдет, т.к. DMA нет.
Реклама:
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 03.04.2015, 15:11  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от eddy Посмотреть сообщение
Как минимум — compare/capture (считать принятые данные, загрузить новый бит), возможно, еще UEV.
Совсем без прерываний не выйдет
Рассказываю на пальцах и один раз, иначе - сатанинский ногодрыг, анафема и костёр.
.
Импульс просадки линии формируется аппаратно, прерывание не нужно.
.
Модулем компарэ формируем прерывание чтения состояния линии, в нём: читаем состояние линии, загружаем новые значения для таймера, на основе состояния линии формируем байт, выставляем флаг окончания чтения темпеатуры и т.д..
.
По наступлению события апдэйта значения из прелоад загружаются в регистры таймера автоматически, прерывание не нужно.
.
Сколько прерываний всего?

Последний раз редактировалось STM32F0; 03.04.2015 в 15:14.
STM32F0 вне форума  
Непрочитано 03.04.2015, 15:32  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от STM32F0 Посмотреть сообщение
Модулем компарэ формируем прерывание чтения состояния линии, в нём: читаем состояние линии, загружаем новые значения для таймера, на основе состояния линии формируем байт, выставляем флаг окончания чтения темпеатуры и т.д..
Что-то дохрена ты возлагаешь на обработчик прерывания CC. Пока он будет такую кучу вычислений делать, бит уже закончится и попрет следующий! И получится вечный зависон в прерываниях. Знаю, проходил в попытке софтовой эмуляции I2C.
В мануале к DS18 сказано, что продолжительность одного слота записи нуля — от 60 до 120мкс, из которых собственно полезная информация — 30мкс. Можно как ты делать между слотами 100мкс, т.е. таймер настроить на частоту 1МГц, а в ARR запихнуть 100 (на данные). Тогда на запись 0 в CCR2 пишем 60, а на запись 1 пишем 10 (чтобы наверняка больше 1мкс, но меньше 15).
При чтении у нас в CCR2 постоянно болтается 60, а по CCR1 формируем биты: ‹10 — получили единичку, ›10 — получили нолик. Если обработчик прерывания делать универсальным, есть шанс не успеть за интервал в 40 с небольшим микросекунд сделать кучу всего.
Но ХЗ, не буду загадывать.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 03.04.2015, 19:27  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от eddy Посмотреть сообщение
Что-то дохрена ты возлагаешь на обработчик прерывания CC. Пока он будет такую кучу вычислений делать, бит уже закончится и попрет следующий! И получится вечный зависон в прерываниях.
Берём распечатываем картинку, берём школьную линейку, меряем, вычисляем, диву даёмся, чешем затылок до облысения.
Сообщение от eddy Посмотреть сообщение
Если обработчик прерывания делать универсальным, есть шанс не успеть
Берём калькулятор, считаем: 1мкс на вход в прерывание, 1мкс на выход, 5мкс обработка прерывания, слот 70мкс. Итого занято - 7мкс из 70мкс.
Теперь берём твои три прерывания (что ты собираешься делать по апдэйту вообще непонятно): 3*2+5=11мкс.
За что боролись, что выиграли?
STM32F0 вне форума  
Непрочитано 03.04.2015, 19:42  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от STM32F0 Посмотреть сообщение
что ты собираешься делать по апдэйту вообще непонятно)
Очень даже понятно. Сейчас пишу по твоим советам, но UEV все равно отслеживаю. Вот для чего:
[code]
И правда: таймер можно и изнутри CC вырубить.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 04.04.2015, 20:03  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

STM32F0, не пойму: вроде бы правильно инициализирую, устанавливая в 1 APRE:
Код:
void onewire_setup(){
	TIM2_PSCR = 4;
	PORT(PD, DDR) |= GPIO_PIN3; // output & pseudo open-drain
	PORT(PD, CR2) |= GPIO_PIN3; // fast
	TIM2_CCMR2 = 0x60;
	TIM2_CCMR1 = 0x02;
	TIM2_CCER1 = 0x31;
	TIM2_IER = TIM_IER_CC1IE;
	TIM2_CR1 = TIM_CR1_APRE | TIM_CR1_URS;
}
Но при этом как только я в прерывании по CC1 впихиваю в CCR2 новое значение, оно тут же попадает туда: посмотри, какая гадость вместо четвертого бита вылезла (это я команду 0xCC отправляю, т.е. должно быть 00110011, а получается 001хрен011). Что это за нафиг такой?
Миниатюры:
Нажмите на изображение для увеличения
Название: 15.04.04_18:59:07.png
Просмотров: 26
Размер:	72.4 Кб
ID:	77794  
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 04.04.2015, 20:04  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Если что, вот прерывание:
Код:
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14){
	if(TIM2_SR1 & TIM_SR1_CC1IF){
		TIM2_SR1 &= ~TIM_SR1_CC1IF;
		onewire_gotlen = TIM2_CCR1H ‹‹ 8;
		onewire_gotlen |= TIM2_CCR1L;
		if(onewire_tick_ctr){ // there's some more data to transmit / receive
			--onewire_tick_ctr;
			if(is_receiver){// receive bits
				ow_data ››= 1;
				if(onewire_gotlen ‹ ONE_ZERO_BARRIER){ // this is 1
					ow_data |= 0x80; // LSbit first!
				}
				// in receiver mode we don't need to send byte after ctr is zero!
				if(onewire_tick_ctr == 0){
					TIM2_CR1 &= ~TIM_CR1_CEN;
				}
			}else{// transmit bits
				// update CCR2 registers with new values
				if(ow_data & 1){ // transmit 1
					TIM2REG(CCR2, BIT_ONE_P);
				}else{ // transmit 0
					TIM2REG(CCR2, BIT_ZERO_P);
				}
				ow_data ››= 1;
			}
		}else{ // end: turn off timer
			TIM2_CR1 &= ~TIM_CR1_CEN;
		}
	}
	//if(TIM2_SR1 & TIM_SR1_CC2IF)
	//	TIM2_SR1 &= ~TIM_SR1_CC2IF;
}
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 04.04.2015, 20:15  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Отбой!
Я про OC2PE забыл.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 04.04.2015, 21:27  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: FAQ по STM8

Чужой код - потёмки, но что в глаза бросилось:
нафига if(TIM2_SR1 & TIM_SR1_CC1IF) если там других прерываний нет?
нафига TIM2_SR1 &= ~TIM_SR1_CC1IF; если можно весь TIM2_SR1 сбросить?
ты что там меряешь, onewire_gotlen = TIM2_CCR1H ‹‹ 8;? А если восемь каналов одновременно захочется?
STM32F0 вне форума  
Непрочитано 04.04.2015, 21:40  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: FAQ по STM8

Все, в базовой комплектации работает.
Еще косяк заметил (но пока не исправил): там же нужны задержки между посылками, поэтому когда я вывожу диагностические сообщения, то все работает, а как только убираю их, паузы получаются недостаточными и глючит. Надысь еще раз даташит на DS18 читануть.
Сообщение от STM32F0 Посмотреть сообщение
нафига if(TIM2_SR1 & TIM_SR1_CC1IF) если там других прерываний нет?
Как обычно — забыл удалить после отладок (у меня поначалу еще и CC2 обрабатывалось).
Сообщение от STM32F0 Посмотреть сообщение
нафига TIM2_SR1 &= ~TIM_SR1_CC1IF; если можно весь TIM2_SR1 сбросить?
Та же хрень. Чистить код надо, тым дофига такого мусора.

Сообщение от STM32F0 Посмотреть сообщение
ты что там меряешь, onewire_gotlen = TIM2_CCR1H ‹‹ 8;?
А как ты измеришь задержку на RESET? Там же в среднем 650мкс! В один int8 не влезет!

Сообщение от STM32F0 Посмотреть сообщение
А если восемь каналов одновременно захочется?
Это — в планах. Запущу широковещательную "начать преобразование", а потом поочередно буду собирать данные. Еще надо будет добавить возможность добавления/удаления датчиков (процедура удаления — если опрашиваем датчик, а получаем шиш, то выкидываем его из EEPROM; а добавление — по одному тыкаем и по нажатию кнопки заносим новый идентификатор в EEPROM).
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
 

Закладки

Метки
arm, cortex, stm32, stm8
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импульсная зарядка для авто-аккумуляторов (новодел) Falconist Источники питания и свет 1915 14.03.2024 19:56
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
STM8(S/L), первые впечатления kison STM8 1423 19.05.2018 19:23
Вопросы и замечания по топику - FAQ по PROTEUS avr123-nm-ru Proteus 291 05.06.2015 20:49
FAQ Импульсный трансформатор alberio Источники питания и свет 87 13.11.2012 18:07


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot