реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> ATmega16 + DS18B20. Код на ассемблере не работает.
neurox
сообщение Dec 6 2008, 04:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638



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

Прикрепленный файл  ds18b20_test.rar ( 1.76 килобайт ) Кол-во скачиваний: 417


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

Код
_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 генераторе в меге?

Прикрепленный файл  ds18b20_test.rar ( 1.76 килобайт ) Кол-во скачиваний: 417
Go to the top of the page
 
+Quote Post
oll
сообщение Dec 6 2008, 04:59
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463



Резистор подтягивающий 4,7К у Вас есть? Похоже так ногой порта управлять нельзя. Гляньте мой алгоритм -может поможет.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
domowoj
сообщение Dec 6 2008, 06:00
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Может поможет
http://radioded.ru/index.php?option=com_co...19&Itemid=1

и вот перевод даташита.

Сообщение отредактировал domowoj - Dec 6 2008, 06:05
Прикрепленные файлы
Прикрепленный файл  DS18B20_RU.pdf ( 1013.8 килобайт ) Кол-во скачиваний: 129
 


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 6 2008, 12:48
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



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 - четыре, так что в той функции нужно провести всего один такт.
Go to the top of the page
 
+Quote Post
Deka
сообщение Dec 6 2008, 21:08
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



А можно я просто выложу свой ассемблерный код общения с датчиком? Там кроме обычного обмена есть функция проверки CRC. Код снабжён подробными коментариями и я думаю разобраться будет несложно. Да и адаптировать к своему коду тоже.
Прикрепленные файлы
Прикрепленный файл  DS18B20.zip ( 3.25 килобайт ) Кол-во скачиваний: 104
 
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 7 2008, 02:53
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Ну если на то пошло, то вот smile.gif
http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 7 2008, 11:50
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Aesthete Animus @ Dec 6 2008, 15:48) *
2neurox
Меня смущает Ваша функция _ds_rx_t_bytes, а конкретно, та ее часть, которая начинается от _read_l_b.

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 7 2008, 12:56
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(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) *
за подробностями отправляю к чтению правильной статьи

Ну да, дать ссылку на собственную же статью и утверждать в ее "правильности", это что, теперь такая новая шутка?
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 7 2008, 20:26
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

если надо, чтобы все заработало, просто сделайте мастером 0 в течение 1 мкс, и через 9-13 мкс (не позже) считывайте линию. хотите стоять на своем - не забудьте рассказать о результатах.

Сообщение отредактировал ARV - Dec 7 2008, 20:30


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 7 2008, 21:19
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

На стр. 2 Вашей статьи говорится:
Цитата
Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс присутствия, называемый «Presence pulse»
Это утверждение не соответствует действительности, т.к. далеко не все ванварные семейства так реагируют на подачу питания.
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 7 2008, 23:30
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(ARV @ Dec 7 2008, 23:26) *
хотите верьте, хотите нет, но много проектов, сделанных в соответствии с рекомендациями из моей статьи (он основана на чтении даташита и моем опыте)

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

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

Вы не поверите, Вы наверное будете просто шокированы, но, будучи сделанным по документации, - у меня все работало. Правда странно? sad.gif
Go to the top of the page
 
+Quote Post
neurox
сообщение Dec 8 2008, 04:29
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638



Цитата
Резистор подтягивающий 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:
...и вот перевод даташита.


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

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


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

Спасибо всем за внимание, сейчас учитываю все советы и к вечеру поделюсь результатами.
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 8 2008, 06:16
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(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 мкс может улучшить работу шины. что ж, всегда есть конкретные условия, которые надо учитывать.

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 8 2008, 08:01
Сообщение #14



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(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-мкс импульс, сами догадаетесь?
Но если это Ваше хобби - учитывая конкретные условия, затачивать сорцы под длину шнурков, - не буду мешать.
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 8 2008, 09:04
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



просмотрел 1-wire память, часы, АЦП, термометры - вроде все поддерживают паразитное питание... что я пропустил?

кстати, я в смятении - изложенные аргументы я принял, но меня странно удивила информация, которую я вычитал из документа, описывающего DS2490... там написано, что интервал чтения мастера не должен превышать 22 мкс sad.gif а как же быть с 15 мкс, определенными "по-умолчанию"?

Сообщение отредактировал ARV - Dec 8 2008, 09:19


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016