Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.12.2007, 19:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сел разбирать цикликлический код избыточности ради интереса,который дал мне 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 |
|
|
|
|
20.12.2007, 00:07
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
спасибо urry
Кстати алгоритм такой: инициализация датчиков, в цикле while(1) команда на конвертацию для всех датчиков, ждем пока конвертится температура и показываем старое значение, считывание нового значения.
Так вот, если использовать при инициализации стандартную функцию: для каждого датчика отдельно устанавливать разрешение и верхний и нижний пороги, то первое измерение получается кривое. А если пользую свою функцию: skip rom, устанавить разрешение и верхний и нижний пороги для всех датчиков сразу, то первое измерение в норме. Вот такой вот косяк
|
|
|
|
20.12.2007, 03:39
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сергей. Я вот только сейчас начал читать присланную тобой статью насчет CRC, и как-то не могу согласиться, что это ПРОСТОЕ пояснение алгоритма ЦРЦ от далласа. В даташите есть блок-схема, описывающая работу аппаратного модуля ЦРЦ. Я ее и реализовал. Честно скажу - не заморачивался, обратил внимание только на то, что если пришедший байт - нулевой, то все операции не изменяют биты, а просто проворачивают регистр (XOR 0), а если еденица - то биты изменяются.
Или, если по другому - приходящий бит расширяется (см по стрелкам) аж на 3, и их изменяет. Что я и делаю, записывая значение 0x18 или 0x00 - т.е. либо устанавливаю биты, либо сбрасываю их. Присмотрись к рисунку. Если поймешь, как это описать с научной точки зрения - поделись, ибо ту статью я тоже через слово понимаю
-- Прилагается рисунок: --
|
|
|
|
20.12.2007, 16:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
В том то и дело что я не понял эту блок схему,когда начал переводить даташифт(даже обидно что все так замудренно),что входящие,а где выходит регистр,сейчас немного понимаю сравнивая с алгоритмом,надо вспомнить деление с остатком,может что прояснится,если пойму что к чему опишу свои мысли.
|
|
|
|
21.12.2007, 14:16
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
urry
Цитата:
|
Так и должно быть - первое измерение - в мусор.
|
кстати, не объясните почему так происходит?[/code]
|
|
|
|
21.12.2007, 20:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Вопрос не ко мне, а к производителю - прочтите написанное мелким шрифтом - после включения питания в регистрах - 85 градусов.
-- Прилагается рисунок: --
|
|
|
|
21.12.2007, 23:23
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
во пасиба, не заметил мелкий шрифт
Итак выкладываю прогу. Что умеет?
максимум 8 градусников,
измерение температуры с дискретностью 0,5 градуса (отображается только целая часть).
Как работает:
показывает версию прошивки;
показывает количество датчиков (выводится "no d" если ни одного датчика не обнаружено);
инициализирует все датчики разом (выводится "Err init" если возникла ошибка инициализации);
циклично выводит номер датчика (например "d1");
измеренную температуру.
Прикрепленный файл: 185606.rar
|
|
|
|
22.12.2007, 18:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
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.
|
|
|
|
22.12.2007, 19:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
А WireTreePoint это кажись запись конфликтов на шине.
Все понял подпрограмму DS.RomFindFirst,тока вопрос: в регистрах WireAddr будет лежать адрес инвертированый?
|
|
|
|
23.12.2007, 22:30
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
неа, вполне даже неинвертированный. WireTreePoints - там стоят еденички в местах разветвлений (конфликтов), а в WireAddr - вполне настоящий адрес, сгенерированный по этому алгоритму древовидного поиска.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:18.
|
|