Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega16 + DS18B20. Код на ассемблере не работает.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
neurox
Здравствуйте. Столкнулся с такой проблемой. Передо мной стоит задача научить AVR-ку читать температуру с термодатчика и, хотя бы, выкидывать полученные данные в терминал по USART. Термодатчик смонтирован на плате и подключен к 6 pin PORTA, питание не паразитное. Мега работает на 8 MHz и тактиурется от внутреннего RC-генератора. Код написан на ассемблере в AVR studio. Теперь суть самой проблемы - термодатчик выдает presence импульс(то есть он всётаки работает), но все остальные действия безрезультатны - вместо температуры приходит всякая дребедень, но только не температура. Свой код перепроверял много раз, но не могу понять в чем ошибка. Знающие люди, поглядите на код пожалуйста, может я не вижу ошибки? Или подскажите возможные проблемы.. Заранее благодарен.

Нажмите для просмотра прикрепленного файла

Целиком код в прикреплении, а вот участки с "функциями" записи и чтения:

Код
_ds_wr_byte:
    
    sbi        DDRA, 6        ;шестой пин PORTA на выход

    ldi        wr_counter,    8
    
    _start_wr:
        sbrc    ds_cmd, 0
        rjmp    _wr_one
        rjmp    _wr_zero
    
    _wr_one:
        cbi        PORTA, PA6
        
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
    
        sbi        PORTA, PA6
        
        ldi        box, 8
        rcall    _ds_s_delay                ; 10us  * box
        
        rjmp    _end_wr

    _wr_zero:
        cbi        PORTA, PA6

        ldi        box, 8
        rcall    _ds_s_delay

        sbi        PORTA, PA6

        rjmp    _end_wr

    _end_wr:
        
        lsr        ds_cmd

        ldi        box, 1
        rcall    _ds_s_delay
        
        dec        wr_counter
        brne    _start_wr
        ret

_ds_rx_t_bytes:                    ; функция принимает 2 байта содержащих температуру
    ldi        wr_counter, 8
    
    ldi        lbyte, 0x00
    ldi        hbyte, 0x00    
    
    _read_l_b:
        sbi        DDRA, 6
    ;----------------------------
        cbi        PORTA, PA6
        rcall    _delay_1us        ;  3 мкс
        rcall    _delay_1us
    ;sbi        PORTA, PA6
    ;----------------------------
        cbi        DDRA, 6
        ldi        box, 1            ; 10 мкс
        rcall    _ds_s_delay            
    ;----------------------------
        sbic    PINA, PA6
        ori lbyte, (1 << 7)
        lsr lbyte
        
    ;ldi        box, 7
    ;rcall    _ds_s_delay
        rcall _delay_1us
        rcall _delay_1us

        dec        wr_counter
        breq    _read_l_b
    
        ldi        wr_counter, 8        
    
    _read_h_b:
        sbi        DDRA, 6
    ;----------------------------
        cbi        PORTA, PA6
        rcall    _delay_1us        ;  3 мкс
        rcall    _delay_1us
    ;sbi        PORTA, PA6
    ;----------------------------
        cbi        DDRA, 6
        ldi        box, 1            ; 10 мкс
        rcall    _ds_s_delay            
    ;----------------------------
        sbic    PINA, PA6
        ori hbyte, (1 << 7)
        lsr hbyte
        
        rcall _delay_1us
        
        dec        wr_counter
        breq    _read_h_b
        ret


З.Ы. Может быть проблема в нестабильном RC генераторе в меге?

Нажмите для просмотра прикрепленного файла
oll
Резистор подтягивающий 4,7К у Вас есть? Похоже так ногой порта управлять нельзя. Гляньте мой алгоритм -может поможет.
domowoj
Может поможет
http://radioded.ru/index.php?option=com_co...19&Itemid=1

и вот перевод даташита.
Aesthete Animus
2neurox
Меня смущает Ваша функция _ds_rx_t_bytes, а конкретно, та ее часть, которая начинается от _read_l_b.

Насколько я помню, для чтения бита нужно сделать следующее:
-захватить порт, сбросить его в ноль
-подождать интерва A - 6мкс
-освободить порт
-подождать интервал E - 9мкс
-прочитать значение
-дождаться завершения таймстампа - интервал F - 55мкс

За подобробными разъяснениями пожалуйте сюда:
http://pdfserv.maxim-ic.com/en/an/AN126.pdf

Тоесть, наверное както так:
Код
...
ldi        lbyte, 0x00
ldi        hbyte, 0x00    

_read_l_b:
    
;----------------------------
    sbi        DDRA, PA6
    cbi        PORTA, PA6
    
; Интервал A - 6мкс
    rcall    _delay_1us            
    rcall    _delay_1us
    rcall    _delay_1us            
    rcall    _delay_1us            
    rcall    _delay_1us            
    rcall    _delay_1us        
;----------------------------
    cbi DDRA, PA6
    
    // Интервал E - 9мкс
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
    rcall    _delay_1us
;----------------------------
    sbic    PINA, PA6
    ori lbyte, (1 << 7)
    lsr lbyte
;----------------------------
; Окончание таймслота - F - 55мкс
    ldi        box, 5
    rcall    _ds_s_delay    
    
...


Кстати, в функции _delay_us - у вас лишний nop. rcall съедает три такта, ret - четыре, так что в той функции нужно провести всего один такт.
Deka
А можно я просто выложу свой ассемблерный код общения с датчиком? Там кроме обычного обмена есть функция проверки CRC. Код снабжён подробными коментариями и я думаю разобраться будет несложно. Да и адаптировать к своему коду тоже.
Aesthete Animus
Ну если на то пошло, то вот smile.gif
http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm
ARV
Цитата(Aesthete Animus @ Dec 6 2008, 15:48) *
2neurox
Меня смущает Ваша функция _ds_rx_t_bytes, а конкретно, та ее часть, которая начинается от _read_l_b.

Насколько я помню, для чтения бита нужно сделать следующее:
-захватить порт, сбросить его в ноль
-подождать интерва A - 6мкс
-освободить порт
-подождать интервал E - 9мкс
-прочитать значение
-дождаться завершения таймстампа - интервал F - 55мкс
ни каких 6 мкс! 1 мкс - не более! за подробностями отправляю к чтению правильной статьи
Aesthete Animus
Цитата(ARV @ Dec 7 2008, 14:50) *
ни каких 6 мкс! 1 мкс - не более!

Во-первых, если Вы почитаете даташит
http://www.maxim-ic.com/getds.cfm?qv_pk=2812
например на странице 17, то увидите, что это время (в течении которого мастер подтягивает линии к нулю) должно быть не менее 1мкс!
Цитата
A read time slot is initiated by the master device pulling the 1-Wire bus low for a minimum of 1μs and then releasing the bus
С чего Вы решили обратное - мне непонятно.

Цитата(ARV @ Dec 7 2008, 14:50) *
за подробностями отправляю к чтению правильной статьи

Ну да, дать ссылку на собственную же статью и утверждать в ее "правильности", это что, теперь такая новая шутка?
ARV
Цитата(Aesthete Animus @ Dec 7 2008, 15:56) *
Ну да, дать ссылку на собственную же статью и утверждать в ее "правильности", это что, теперь такая новая шутка?
хотите верьте, хотите нет, но много проектов, сделанных в соответствии с рекомендациями из моей статьи (он основана на чтении даташита и моем опыте) позволяют мне утверждать, что статья верная. хотите делать 6 мкс? - пожалуйста, кто ж запретит?

если надо, чтобы все заработало, просто сделайте мастером 0 в течение 1 мкс, и через 9-13 мкс (не позже) считывайте линию. хотите стоять на своем - не забудьте рассказать о результатах.
xemul
Цитата(ARV @ Dec 7 2008, 23:26) *
хотите верьте, хотите нет, но много проектов, сделанных в соответствии с рекомендациями из моей статьи (он основана на чтении даташита и моем опыте) позволяют мне утверждать, что статья верная.

На стр. 2 Вашей статьи говорится:
Цитата
Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс присутствия, называемый «Presence pulse»
Это утверждение не соответствует действительности, т.к. далеко не все ванварные семейства так реагируют на подачу питания.
Aesthete Animus
Цитата(ARV @ Dec 7 2008, 23:26) *
хотите верьте, хотите нет, но много проектов, сделанных в соответствии с рекомендациями из моей статьи (он основана на чтении даташита и моем опыте)

Я и вижу, статья основана только на чтении даташита, а не на следовании оному. Притом, чтении невнимательном, как я уже отмечал выше. Естесственно, Вам равно никто не может запретить делать так, как Вам заблагорассудилось. Но, в таком случае, незачем утверждать о правильности своих действий.

Цитата(ARV @ Dec 7 2008, 23:26) *
если надо, чтобы все заработало, просто сделайте мастером 0 в течение 1 мкс, и через 9-13 мкс (не позже) считывайте линию. хотите стоять на своем - не забудьте рассказать о результатах.

Вы не поверите, Вы наверное будете просто шокированы, но, будучи сделанным по документации, - у меня все работало. Правда странно? sad.gif
neurox
Цитата
Резистор подтягивающий 4,7К у Вас есть? Похоже так ногой порта управлять нельзя. Гляньте мой алгоритм -может поможет.


Да, резистор есть. Просто в силу моей неграмотности, я не знаю что происходит с лог. уровнем в линии, когда ставишь ногу микроконтроллера на вход. Поэтому на всякий случай я ставил её в 1 а потом уже отпускал линию...

Цитата
Меня смущает Ваша функция _ds_rx_t_bytes, а конкретно, та ее часть, которая начинается от _read_l_b.

Насколько я помню, для чтения бита нужно сделать следующее:
-захватить порт, сбросить его в ноль
-подождать интерва A - 6мкс
-освободить порт
-подождать интервал E - 9мкс
-прочитать значение
-дождаться завершения таймстампа - интервал F - 55мкс


По даташиту линию нужно опустить в ноль минимум на 1us, после чего её отпустить и ловить ответ термодатчика примерно через 10us, а потом дождаться завершения таймстампа... В общем, я с вами согласен.

Цитата
А можно я просто выложу свой ассемблерный код общения с датчиком?


Конечно можно, спасибо. Сейчас буду разбираться..

Цитата
Ну если на то пошло, то вот smile.gif
http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm


Спасибо, но насколько я понял, там код на С. А мне нужно на асме... Но ссылку взял на заметку smile.gif

Цитата
domowoj:
...и вот перевод даташита.


За русский даташит спасибо!!!

Цитата
за подробностями отправляю к чтению правильной статьи


Статью прочту, спасибо..

Спасибо всем за внимание, сейчас учитываю все советы и к вечеру поделюсь результатами.
ARV
Цитата(xemul @ Dec 8 2008, 00:19) *
На стр. 2 Вашей статьи говорится:
Это утверждение не соответствует действительности, т.к. далеко не все ванварные семейства так реагируют на подачу питания.
не ошибается тот, кто ничего не делает. укажите на устрйоства. которые так не делают - я внесу изменения. критика должна быть конструктивной.

Цитата
Вы не поверите, Вы наверное будете просто шокированы, но, будучи сделанным по документации, - у меня все работало. Правда странно?
нет, не странно. в моей статье нет противоречий документации. если стандарт требует 1 мкс и более - 6 мкс так же укладывается в эти рамки. но поясню ту часть статьи, которая основывается на моем опыте: протокол рассчитан на весьма туманные условия работы - неизвестно какая длина (и значит, емкость) линии. поэтому такие разбросы нормированных длительностей. я делаю вывод, что чем дольше держать мастером линию в 0, тем меньше останется времени внутри 15 мкс (которые достаточно четко лимитированы), за которое линия должна вернуться в 1, а значит, меньше шанс считать верный уровень из нее. чем ближе к 1 мкс время удержания мастером 0, чем больше шансов считать верное значение в оговоренный момент (не позже 15 мкс спустя "опускания" линии мастером). говоря о 1 мкс, я тем самым "даю" линии максимально возможное время "очухаться". если вы держите, скажем 6 мкс - все вроде бы соответствует, и на коротких линиях будет шикарно работать. но на длинной линии, восстанавливающейся за счет своей емкости, предположим, 10 мкс, вы всегда будете читать 0, не так ли? а по моему "алгоритму" - считаете верное значение smile.gif

предвижу возражение, что чем меньше мастер держит линию в 0, тем меньше шансов "разрядить" ее емкость до нужного уровня... и отвечу: так, да не так smile.gif 1-wire девайсы в силу своей микропотребляющей сути, возможно, и не сумеют "разрядить" линию при аналогичных ситуациях, но мастер вполне в состоянии обеспечить достаточный ток стекания заряда из линии. допускаю, что в некоторых случаях увеличение этого одиозного интервала до 2-3 мкс может улучшить работу шины. что ж, всегда есть конкретные условия, которые надо учитывать.

надеюсь, дискуссия по принципу "я прав - ты не прав" не разгорится. если у кого-то есть поправки к моей статье - я не против. если есть дельные советы - я не против. путь к совершенству бесконечен.
xemul
Цитата(ARV @ Dec 8 2008, 09:16) *
не ошибается тот, кто ничего не делает. укажите на устрйоства. которые так не делают - я внесу изменения. критика должна быть конструктивной.

Так не делает ни один ванварный девайс, предполагающий не-паразитное питание от шины.
Цитата
нет, не странно. в моей статье нет противоречий документации. если стандарт требует 1 мкс и более - 6 мкс так же укладывается в эти рамки. но поясню ту часть статьи, которая основывается на моем опыте: протокол рассчитан на весьма туманные условия работы - неизвестно какая длина (и значит, емкость) линии. поэтому такие разбросы нормированных длительностей. я делаю вывод, что чем дольше держать мастером линию в 0, тем меньше останется времени внутри 15 мкс (которые достаточно четко лимитированы), за которое линия должна вернуться в 1, а значит, меньше шанс считать верный уровень из нее. чем ближе к 1 мкс время удержания мастером 0, чем больше шансов считать верное значение в оговоренный момент (не позже 15 мкс спустя "опускания" линии мастером). говоря о 1 мкс, я тем самым "даю" линии максимально возможное время "очухаться". если вы держите, скажем 6 мкс - все вроде бы соответствует, и на коротких линиях будет шикарно работать. но на длинной линии, восстанавливающейся за счет своей емкости, предположим, 10 мкс, вы всегда будете читать 0, не так ли? а по моему "алгоритму" - считаете верное значение smile.gif

Гы-гы. Чем предполагать, может лучше глазками да бациллоскопом?
Цитата
предвижу возражение, что чем меньше мастер держит линию в 0, тем меньше шансов "разрядить" ее емкость до нужного уровня... и отвечу: так, да не так smile.gif 1-wire девайсы в силу своей микропотребляющей сути, возможно, и не сумеют "разрядить" линию при аналогичных ситуациях, но мастер вполне в состоянии обеспечить достаточный ток стекания заряда из линии. допускаю, что в некоторых случаях увеличение этого одиозного интервала до 2-3 мкс может улучшить работу шины. что ж, всегда есть конкретные условия, которые надо учитывать.

надеюсь, дискуссия по принципу "я прав - ты не прав" не разгорится. если у кого-то есть поправки к моей статье - я не против. если есть дельные советы - я не против. путь к совершенству бесконечен.

Да о чем тут дискутировать? На конце 100-метровой линии на лапше 6-мкс импульс от мастера превращается в 4-мкс. Во что превратится 1-мкс импульс, сами догадаетесь?
Но если это Ваше хобби - учитывая конкретные условия, затачивать сорцы под длину шнурков, - не буду мешать.
ARV
просмотрел 1-wire память, часы, АЦП, термометры - вроде все поддерживают паразитное питание... что я пропустил?

кстати, я в смятении - изложенные аргументы я принял, но меня странно удивила информация, которую я вычитал из документа, описывающего DS2490... там написано, что интервал чтения мастера не должен превышать 22 мкс sad.gif а как же быть с 15 мкс, определенными "по-умолчанию"?
Aesthete Animus
Цитата(ARV @ Dec 8 2008, 12:04) *
просмотрел 1-wire память, часы, АЦП, термометры - вроде все поддерживают паразитное питание... что я пропустил?

ds1821 (если память не изменяет)

Цитата(ARV @ Dec 8 2008, 12:04) *
кстати, я в смятении - изложенные аргументы я принял, но меня странно удивила информация, которую я вычитал из документа, описывающего DS2490... там написано, что интервал чтения мастера не должен превышать 22 мкс sad.gif а как же быть с 15 мкс, определенными "по-умолчанию"?

Надо будет глянуть...
ARV
Цитата(Aesthete Animus @ Dec 8 2008, 13:30) *
ds1821 (если память не изменяет)
1821 вообще недоделок какой-то... он принципиально не стандартный, если сравнивать с остальными 1-wire... даже адреса не имеет...
xemul
Цитата(ARV @ Dec 8 2008, 12:04) *
просмотрел 1-wire память, часы, АЦП, термометры - вроде все поддерживают паразитное питание... что я пропустил?

Хорошо, сформулирую иначе: если у ванварного девайса есть нога Vcc, он не будет генерить Presence при подаче питания.
Не готов сейчас просматривать даташиты на все девайсы в микробанках (MicroCAN smile.gif), но, имхо, и там найдутся предатели.
Цитата
кстати, я в смятении - изложенные аргументы я принял, но меня странно удивила информация, которую я вычитал из документа, описывающего DS2490... там написано, что интервал чтения мастера не должен превышать 22 мкс sad.gif а как же быть с 15 мкс, определенными "по-умолчанию"?

Вы не обратили внимания, что это написано применительно к Flexible mode DS2940 (возможность подстроиться под характеристики шины). Ограничение в 22 мкс вызвано сомнениями в способности ванварного слейва с паразитным питанием дотянуть 0 на шине до требуемой длительности и не упасть самому без сил (по-видимому, актуально при минимальных длительностях 1 на шине между тайм-слотами; мне до такого безобразия доходить не удавалось).
Стандартные тайминги (чуть ниже Fig.6) tLOW1 = 8 us, tDSO = 6 us.
Заметьте, еще чуть ниже: *Power-up defaults for Flexible speed: tLOW1=12µs, tDSO=7µs,
что вполне объяснимо, учитывая логику работы ванварной шины.
Я, пожалуй, приведу полностью абзац, в котором содержится удивившее Вас предложение, т.к. он достаточно аргументировано опровергает Вашу теорию о пользе 1-мкс импульса:
Цитата
If the network is large or heavily loaded, flexible speed should be selected and the Write-1 low time
(tLOW1) should be extended to more than 8 µs to allow the 1-Wire bus to completely discharge
. Since a
large or heavily loaded network needs more time to recharge, it is also recommended to delay sampling
the bus for reading
. A higher Data Sample Offset value (tDSO) will increase the voltage margin and also
provide extra energy to the slave devices when generating a long series of Write-0 time slots. However,
the total of tLOW1 + tDSO should not exceed 22 µs. Otherwise the slave device responding may have
stopped pulling the bus low when transmitting a logic 0.


Цитата(ARV @ Dec 8 2008, 13:38) *
1821 вообще недоделок какой-то... он принципиально не стандартный, если сравнивать с остальными 1-wire... даже адреса не имеет...

DS1821 имеет функциональность только термостата и термометра, но с ванварной шиной. Если со склерозом все в порядке, есть еще DS1621 с такой же функциональностью, но под SPI.
ARV
не надо увлекаться 1 мкс - я несколькими постами ранее согласился с вами.

что касается "подстройки под линию" - вы меня критиковали на счет подстройки софта ради шнурка - а тут даже в микросхемке предусмотрена подстройка...

и тем не менее, как следует понимать ситуацию с 22 мкс - если линия нагруженная. как это вяжется с декларируемыми везде и всюду 15 мкс?

наконец, можете указать на документ, где написано, что при наличии ноги VCC девайс не генерирует PRESENCE при подаче питания? если iButton и 1-Wire есть суть одно и то же (по крайней мере отдельного описания "стандарта" для 1-Wire я не нашел), то в стандарте такого упоминания нет.
Aesthete Animus
Цитата(ARV @ Dec 8 2008, 13:38) *
1821 вообще недоделок какой-то... он принципиально не стандартный, если сравнивать с остальными 1-wire... даже адреса не имеет...

Да, правильно заметил xemul, это именно темостат. А работать в качестве датчика - это его дополнительная, совершенно ненужная преблуда.
ARV
Цитата(Aesthete Animus @ Dec 8 2008, 14:16) *
Да, правильно заметил xemul, это именно темостат. А работать в качестве датчика - это его дополнительная, совершенно ненужная преблуда.

да я в курсе smile.gif первый раз его заюзал лет 7 назад. вопрос пока именно о нормальных 1-wire девайсах
xemul
Цитата(ARV @ Dec 8 2008, 14:14) *
что касается "подстройки под линию" - вы меня критиковали на счет подстройки софта ради шнурка - а тут даже в микросхемке предусмотрена подстройка...

имхо, это таки две большие разницы - рихтовать сорцы для МК (где задержки программеры обычно делают nop'ами и delay_us() - hardcoded, таксказать smile.gif), и выбрать в лист-боксе на хостовом компе желаемое время tLOW1.
Цитата
и тем не менее, как следует понимать ситуацию с 22 мкс - если линия нагруженная. как это вяжется с декларируемыми везде и всюду 15 мкс?

Ышо раз: 15 мкс - рекомендованное для Standard Mode, 22 мкс - верхнедопустимое для Flexible Mode.
Или попробуйте учесть задержку фазы на длинной линии, и все срастется.
Или понимайте это как косвенное подтверждение неприспособленности ванвари к развесистости и возможности работы с длинными пакетами без ожесточенных плясок с бубнами.
Цитата
наконец, можете указать на документ, где написано, что при наличии ноги VCC девайс не генерирует PRESENCE при подаче питания? если iButton и 1-Wire есть суть одно и то же (по крайней мере отдельного описания "стандарта" для 1-Wire я не нашел), то в стандарте такого упоминания нет.

1-Wire - шина, iButton - конструктив ванварных девайсов. По-моему, это слегка разные категории. Посмотрите appibstd.pdf у производителя - там все расписано, и ванварь с ибутоном соприкасаются, но не смешиваются.
На документ не укажу, т.к. это, как писал классик, "ума холёдьний наблюдений, и сэрдца горестний замэт".
Если Вам в даташитах на ванварные девайсы с внешним не-паразитным питанием удастся найти упоминание о Presence при подаче питания, занесу их в исключения.
_Pasha
1-wire!
Бляха-муха стока флейма Вам не стыдно?
Берем датаshit ставим средние времена и оно работает.
Aesthete Animus
Цитата(ARV @ Dec 8 2008, 14:14) *
и тем не менее, как следует понимать ситуацию с 22 мкс - если линия нагруженная. как это вяжется с декларируемыми везде и всюду 15 мкс?

Ну где везде и всюду?

http://pdfserv.maxim-ic.com/en/an/AN126.pdf
A - минимум 5, рекомендовано 6, максимум 15
E - минимум 5, рекомендовано 9, максимум 12

Тогда получаем для MasterSample (A+E):
минимум 10, рекоммендовано 15, максимум 27

22мкс вполне укладываются в этот интервал

Цитата(_Pasha @ Dec 8 2008, 14:49) *
Берем датаshit ставим средние времена и оно работает.


Неее... я лучше возьму датаsheet smile.gif
ARV
Цитата(Aesthete Animus @ Dec 8 2008, 15:06) *
Неее... я лучше возьму датаsheet smile.gif
вот так берешь один даташит, второй третий - всюду читаешь о 15 мкс - делаешь вывод, что это норма. потом выясняется, что на самом деле все не так... sad.gif
спасибо за указания на документацию. только вот кто поручится, что спустя некоторое время не выснится, что есть еще какой-то документ, переворачивающий все с ног на голову...

P.S. в "правильную статью" внес коррективы smile.gif
xemul
имхо, наиболее общая расталдычка на эту тему с временами для Standard и Overdrive режимов: http://pdfserv.maxim-ic.com/en/an/AN126.pdf "1-Wire Communication Through Software".
sonycman
Интересно, а вот допустим, есть сеть из нескольких DS18S20 с паразитным питанием. Как автоматически определить, какой датчик что измеряет?
Или просто, перед подключением, считывать и заносить адрес каждого датчика в таблицу соответствия?
Nekromant
Извиняюсь, я может не все заметил в бурных прениях но попытаюсь попасть в струю:
Может все таки попробовать написать подобный код, Но скажем на Си? тем более что библиотчека уже выложена выше в постах и попробовать сравнить результаты того что выдает датчик на асме и на Си?
И кстати не работает-т.е мы не получаем ничего или не получаем то что надо? ведь это разные вещи
ARV
Цитата(Nekromant @ Dec 9 2008, 18:31) *
Извиняюсь, я может не все заметил в бурных прениях но попытаюсь попасть в струю:
Может все таки попробовать написать подобный код, Но скажем на Си? тем более что библиотчека уже выложена выше в постах и попробовать сравнить результаты того что выдает датчик на асме и на Си?
И кстати не работает-т.е мы не получаем ничего или не получаем то что надо? ведь это разные вещи

на Си все давно сделано, все работает, как и на асме, впрочем. когда не работает, то как правило не сходится CRC.
_Pasha
Цитата(ARV @ Dec 8 2008, 16:42) *
вот так берешь один даташит, второй третий - всюду читаешь о 15 мкс

А фронты? Имхо, большая часть непоняток именно из-за этого.

Цитата(sonycman @ Dec 8 2008, 19:17) *
Как автоматически определить, какой датчик что измеряет?
Или просто, перед подключением, считывать и заносить адрес каждого датчика в таблицу соответствия?

А что, есть другие варианты? smile.gif

Цитата(Nekromant @ Dec 9 2008, 19:31) *
тем более что библиотчека уже выложена выше в постах

Она выложена в "бессмертной" теме исходники программ и библиотек. Про работу не скажу ничего: есть свое, во многих вариантах. Но оно урезано до минимально необходимого
neurox
Хм.. поставил внешний кварц на 10 MHz ничего не изменилось - все та же проблема. Попробовал увеличить задержку для начального импульса в таймслотах. Теперь запись выглядит так:
Код
_ds_write:
   sbi DDRA, 6
  
   ldi  wr_counter, 8
  
       _start_wr:      
                sbrc     ds_cmd, 0
        rjmp    _wr_one
        rjmp    _wr_zero
    
    _wr_one:
        cbi        PORTA, PA6
        
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
        rcall    _delay_1us
    
        sbi    PORTA, PA6
        
        ldi    box, 5
        rcall    _ds_s_delay   ;задержка 10us * box
        
        rjmp    _end_wr
_wr_zero:
        cbi    PORTA, PA6

        ldi    box, 5
        rcall    _ds_s_delay

        sbi    PORTA, PA6

        rjmp    _end_wr

    _end_wr:
        
        lsr    ds_cmd

        ldi    box, 3
        rcall    _ds_s_delay
        
        dec    wr_counter
        brne    _start_wr
        ret


видимо ошибка именно в данном участке, потому что конвертация температуры не происходит.. как определил, что не происходит? очень просто - во время конвертации он должен выдавать лог. 0 в линию почти 700ms... мк проверяет уровень и если 0 то выдает "." в терминал и через 100 мс заново проверяет уровень... у меня в терминал приходит лишь одна точка.. а значит датчик не ковертирует Т...
что де делать то!? я в легком отчаянии..
neurox
А вот когда я ставлю PORTA на вход, как изменяется лог. уровень в линии?
ARV
Цитата(neurox @ Dec 13 2008, 06:28) *
А вот когда я ставлю PORTA на вход, как изменяется лог. уровень в линии?
честно говоря, ваш код я не анализировал вдумчиво, но по паре команд SBI PORTA, PA6 и вашему вопросу предположил, что вы немного неверно работаете с шиной...

нормальный подход: заранее, раз и на всегда в нужный разряд вашего PORTх выводите 0 (можно ничего не выводить, после сброса там и так 0), а уровнем в 1-wire манипулируете только через DDRx. причем для "вывода" в шину высокого уровня пишите в DDRx 0, а для вывода низкого - 1. то есть по логике в вашем коде SBI PORTx, y быть не должно в принципе.

когда в этом случае порт переводится на ввод (DDRx=0), то уровень в шине поднимается к высокому за счет внешнего резистора подтяжки. когла порт переводится на вывод (DDRx=1), то в шине сразу устанавливается 0 (т.к. в PORTx уже 0).
fmdost
Цитата(ARV @ Dec 7 2008, 23:26) *
...хотите стоять на своем - не забудьте рассказать о результатах...

1111493779.gif Ню-ню.

Абсолютно правильная статья Нажмите для просмотра прикрепленного файла.
Александр Куличок
Цитата(neurox @ Dec 10 2008, 04:20) *
видимо ошибка именно в данном участке, потому что конвертация температуры не происходит.. как определил, что не происходит? очень просто - во время конвертации он должен выдавать лог. 0 в линию почти 700ms...


Возможно я не прав, но мне кажется, что Вы еще и неверно проверяете состояние линии. Вернее, признак завершения конвертации температуры. Дело в том, что при преобразовании датчик не опускает линию в "0" на 700 мс. Это помешает работе других устройств на шине. А для определения окончания конца преобразования нужно опрашивать не линию на состояние лог.0, а датчик . Т.е. периодически формировать read time slot.

Кроме того, если у Вас используются прерывания, нужно следить, чтобы они не растягивали формируемые тайминги. А на время генерации задержки 1 мкс их лучше вообще запретить.

P.S. (В добавок к посту от ARV)
Для того, чтобы Вы не запутались в уровнях на линии, рекомендую объявить 2 дефайна:
#define CLR_1W sbi DDRA,PA6
#define SET_1W cbi DDRA,PA6
neurox
Цитата(Александр Куличок @ Dec 15 2008, 06:17) *
Возможно я не прав, но мне кажется, что Вы еще и неверно проверяете состояние линии. Вернее, признак завершения конвертации температуры. Дело в том, что при преобразовании датчик не опускает линию в "0" на 700 мс. Это помешает работе других устройств на шине. А для определения окончания конца преобразования нужно опрашивать не линию на состояние лог.0, а датчик . Т.е. периодически формировать read time slot.


А ведь верно, как я сам то не додумался... smile3046.gif

Программа заработала. Просто в логике была серьезная ошибка. Считывалось всегод два бита и при сдвиге один из битов терялся... Всем спасибо за интерес к данной теме и помощь в просвещении моего тёмного разума. =)
_Pasha
Цитата(neurox @ Dec 15 2008, 15:35) *
в просвещении моего тёмного разума. =)

А если датчик не один, то готовность надо проверять как раз обращением к нему по адресу и шшупать presence pulse. Вот тут уже темень... smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.