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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 19.12.2007, 19:59  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Сел разбирать цикликлический код избыточности ради интереса,который дал мне rremix,подпрограмку,сообразить не могу как она работает.Сам алгоритм понимаю что надо поделить байт WireByte на полином при этом отнимание(как я понял разница теряется между отнимание и сложением) идет через исключающее или,может просто не доходит,знаю что частное не нужно,а остаток получаемый это и есть CRC.
Алгоритм начинается с просмотра нулевого бита WireByte,если =1 то отнимается 0х18=32,если =0 то отнимаем нули операцией иск. или,потом сдвигаем оба регистра циклически и опять проверяем нулевой бит WireByte.Вскольз понимаю что таким способом остается остаток,но дойди не может,может кто носом ткент

Код:
DS.CRC.AddByte
	; добавить байт в контрольную сумму
	movwf 	WireByte
	movlw	0x08
	movwf 	WireCount

DS.CRC.AddByte.Loop
	movlw	0x01
	andwf 	WireByte,W	;операция "и" с 01 и байтом 
	xorwf 	WireCRC,F	;исключаящая или с CRC и акамулятором(там остается
				;0 или 1 в нулевом бите)

	movlw 	0x18		; ложим в W=00011010
	btfss 	WireCRC,0	;проверяем нулевой бит CRC,если 1 то исключаящая или с
	movlw 	0x00		; 00011010
	xorwf	WireCRC,F	;а если 0 то исключаящая или с 00,сложение без переноса
					
	bcf 	Carry		;сброс флага С
						
	rrf 	WireCRC,F	;сдвиг вправо циклический WireCRC 
	btfsc 	Carry
	bsf 	WireCRC,7

	bcf 	Carry
	rrf 	WireByte,F	;сдвиг вправо циклический WireByte
	btfsc 	Carry
	bsf 	WireByte,7

	decfsz 	WireCount,F	;и так все восем битов
	goto 	DS.CRC.AddByte.Loop
	return
Реклама:
CERGEI1982 вне форума  
Непрочитано 20.12.2007, 00:07  
day177
Прописка
 
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
day177 на пути к лучшему
По умолчанию

спасибо urry

Кстати алгоритм такой: инициализация датчиков, в цикле while(1) команда на конвертацию для всех датчиков, ждем пока конвертится температура и показываем старое значение, считывание нового значения.

Так вот, если использовать при инициализации стандартную функцию: для каждого датчика отдельно устанавливать разрешение и верхний и нижний пороги, то первое измерение получается кривое. А если пользую свою функцию: skip rom, устанавить разрешение и верхний и нижний пороги для всех датчиков сразу, то первое измерение в норме. Вот такой вот косяк
day177 вне форума  
Непрочитано 20.12.2007, 03:39  
rremix
Временная регистрация
 
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
rremix на пути к лучшему
По умолчанию

Сергей. Я вот только сейчас начал читать присланную тобой статью насчет CRC, и как-то не могу согласиться, что это ПРОСТОЕ пояснение алгоритма ЦРЦ от далласа. В даташите есть блок-схема, описывающая работу аппаратного модуля ЦРЦ. Я ее и реализовал. Честно скажу - не заморачивался, обратил внимание только на то, что если пришедший байт - нулевой, то все операции не изменяют биты, а просто проворачивают регистр (XOR 0), а если еденица - то биты изменяются.
Или, если по другому - приходящий бит расширяется (см по стрелкам) аж на 3, и их изменяет. Что я и делаю, записывая значение 0x18 или 0x00 - т.е. либо устанавливаю биты, либо сбрасываю их. Присмотрись к рисунку. Если поймешь, как это описать с научной точки зрения - поделись, ибо ту статью я тоже через слово понимаю

-- Прилагается рисунок: --

rremix вне форума  
Непрочитано 20.12.2007, 16:44  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

В том то и дело что я не понял эту блок схему,когда начал переводить даташифт(даже обидно что все так замудренно),что входящие,а где выходит регистр,сейчас немного понимаю сравнивая с алгоритмом,надо вспомнить деление с остатком,может что прояснится,если пойму что к чему опишу свои мысли.
CERGEI1982 вне форума  
Непрочитано 21.12.2007, 14:16  
day177
Прописка
 
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
day177 на пути к лучшему
По умолчанию

urry

Цитата:
Так и должно быть - первое измерение - в мусор.
кстати, не объясните почему так происходит?[/code]
day177 вне форума  
Непрочитано 21.12.2007, 20:50  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Вопрос не ко мне, а к производителю - прочтите написанное мелким шрифтом - после включения питания в регистрах - 85 градусов.

-- Прилагается рисунок: --
urry вне форума  
Непрочитано 21.12.2007, 23:23  
day177
Прописка
 
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
day177 на пути к лучшему
По умолчанию

во пасиба, не заметил мелкий шрифт

Итак выкладываю прогу. Что умеет?
максимум 8 градусников,
измерение температуры с дискретностью 0,5 градуса (отображается только целая часть).

Как работает:
показывает версию прошивки;
показывает количество датчиков (выводится "no d" если ни одного датчика не обнаружено);
инициализирует все датчики разом (выводится "Err init" если возникла ошибка инициализации);
циклично выводит номер датчика (например "d1");
измеренную температуру.

Прикрепленный файл: 185606.rar
day177 вне форума  
Непрочитано 22.12.2007, 18:09  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

rremix объясни что в подпрограмме(ну ту что мне дал на датчик) означает WireTreePoints может это масив из наборов WireAddr.Просто не очень понял для чего это подпрограмка,которая через косвенную адресацию выдвигает нулевой бит 8 регистров WireTreePoint и при этом потом проверяется бит последнего выдвинутого регистра WireTreePoint.Может проверяется чтоб не было переполнения если датчиков больше восьми(это догатки).Тоже самое потом происходит и с WireAddr.Буду дальше понимать как да что,ломать и тренировать голову ,но с подсказкой было бы полегче.
Вот что понял про высчислении циклического избыточного кода:все зависит от того скока будет значащих единичек в пришедшем регистре WireByte(он сдвигается вправо циклически),получается как бы умножение регистра CRC на 0х18,при этом получается шиворот на выворот,то есть когда берем младший бит WireByte,то прибавляем с помощью или-исключающего(или отнимаем),сдвигаем получается что самое первое сложение(или отнимание) будет в старших битах после всех сдвигов,но само сложение(отнимание) с помощью или-исключ. в голове не укладывается.
Код:
DS.ScrollRight
	; для внутреннего использования модулем
	movwf 	WireRollCount
DS.ScrollRight.Loop
	rrf 	INDF,F
	incf 	FSR,F
	decfsz 	WireRollCount,F
	goto 	DS.ScrollRight.Loop
	btfss 	Carry
	goto 	DS.ScrollRight.Zero

	subwf 	FSR,F
	bsf 	INDF,7
	return
DS.ScrollRight.Zero
	subwf 	FSR,F
	bcf 	INDF,7
	return
Увидел еще что в этой подпрограмке все регистры WireTreePoint сдвигаются вправо на один бит,при этом выдвигается младший бит в флаг переноса младшего регистра WireTreePoint.
CERGEI1982 вне форума  
Непрочитано 22.12.2007, 19:52  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

А WireTreePoint это кажись запись конфликтов на шине.
Все понял подпрограмму DS.RomFindFirst,тока вопрос: в регистрах WireAddr будет лежать адрес инвертированый?
CERGEI1982 вне форума  
Непрочитано 23.12.2007, 22:30  
rremix
Временная регистрация
 
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
rremix на пути к лучшему
По умолчанию

неа, вполне даже неинвертированный. WireTreePoints - там стоят еденички в местах разветвлений (конфликтов), а в WireAddr - вполне настоящий адрес, сгенерированный по этому алгоритму древовидного поиска.
rremix вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Термометр на ds18b20 Peshevbis Микроконтроллеры, АЦП, память и т.д 83 31.12.2010 20:22
ds18b20 отключение от шины EKuzmich Микроконтроллеры, АЦП, память и т.д 24 29.08.2009 11:01
CD4051+DS18B20 gena1959 TTL и CMOS логика 5 03.09.2007 01:04
Модель DS18B20 Cap63 Микроконтроллеры, АЦП, память и т.д 3 22.01.2007 21:51
о датчиках ds18b20 Peshevbis Микроконтроллеры, АЦП, память и т.д 3 17.10.2006 17:17


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


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