|
ATmega16 + DS18B20. Код на ассемблере не работает. |
|
|
|
Dec 6 2008, 04:24
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 6 2008, 04:59
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463

|
Резистор подтягивающий 4,7К у Вас есть? Похоже так ногой порта управлять нельзя. Гляньте мой алгоритм -может поможет.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 6 2008, 12:48
|

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

|
2 neuroxМеня смущает Ваша функция _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 - четыре, так что в той функции нужно провести всего один такт.
|
|
|
|
|
Dec 7 2008, 12:56
|

Местный
  
Группа: Свой
Сообщений: 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)  за подробностями отправляю к чтению правильной статьиНу да, дать ссылку на собственную же статью и утверждать в ее "правильности", это что, теперь такая новая шутка?
|
|
|
|
|
Dec 7 2008, 20:26
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Dec 7 2008, 21:19
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

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

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

|
Цитата(ARV @ Dec 7 2008, 23:26)  хотите верьте, хотите нет, но много проектов, сделанных в соответствии с рекомендациями из моей статьи (он основана на чтении даташита и моем опыте) Я и вижу, статья основана только на чтении даташита, а не на следовании оному. Притом, чтении невнимательном, как я уже отмечал выше. Естесственно, Вам равно никто не может запретить делать так, как Вам заблагорассудилось. Но, в таком случае, незачем утверждать о правильности своих действий. Цитата(ARV @ Dec 7 2008, 23:26)  если надо, чтобы все заработало, просто сделайте мастером 0 в течение 1 мкс, и через 9-13 мкс (не позже) считывайте линию. хотите стоять на своем - не забудьте рассказать о результатах. Вы не поверите, Вы наверное будете просто шокированы, но, будучи сделанным по документации, - у меня все работало. Правда странно?
|
|
|
|
|
Dec 8 2008, 04:29
|
Участник

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

|
Цитата Резистор подтягивающий 4,7К у Вас есть? Похоже так ногой порта управлять нельзя. Гляньте мой алгоритм -может поможет. Да, резистор есть. Просто в силу моей неграмотности, я не знаю что происходит с лог. уровнем в линии, когда ставишь ногу микроконтроллера на вход. Поэтому на всякий случай я ставил её в 1 а потом уже отпускал линию... Цитата Меня смущает Ваша функция _ds_rx_t_bytes, а конкретно, та ее часть, которая начинается от _read_l_b.
Насколько я помню, для чтения бита нужно сделать следующее: -захватить порт, сбросить его в ноль -подождать интерва A - 6мкс -освободить порт -подождать интервал E - 9мкс -прочитать значение -дождаться завершения таймстампа - интервал F - 55мкс По даташиту линию нужно опустить в ноль минимум на 1us, после чего её отпустить и ловить ответ термодатчика примерно через 10us, а потом дождаться завершения таймстампа... В общем, я с вами согласен. Цитата А можно я просто выложу свой ассемблерный код общения с датчиком? Конечно можно, спасибо. Сейчас буду разбираться.. Цитата Спасибо, но насколько я понял, там код на С. А мне нужно на асме... Но ссылку взял на заметку  Цитата domowoj: ...и вот перевод даташита. За русский даташит спасибо!!! Цитата за подробностями отправляю к чтению правильной статьи Статью прочту, спасибо.. Спасибо всем за внимание, сейчас учитываю все советы и к вечеру поделюсь результатами.
|
|
|
|
|
Dec 8 2008, 06:16
|

Профессионал
    
Группа: Свой
Сообщений: 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, не так ли? а по моему "алгоритму" - считаете верное значение  предвижу возражение, что чем меньше мастер держит линию в 0, тем меньше шансов "разрядить" ее емкость до нужного уровня... и отвечу: так, да не так  1-wire девайсы в силу своей микропотребляющей сути, возможно, и не сумеют "разрядить" линию при аналогичных ситуациях, но мастер вполне в состоянии обеспечить достаточный ток стекания заряда из линии. допускаю, что в некоторых случаях увеличение этого одиозного интервала до 2-3 мкс может улучшить работу шины. что ж, всегда есть конкретные условия, которые надо учитывать. надеюсь, дискуссия по принципу "я прав - ты не прав" не разгорится. если у кого-то есть поправки к моей статье - я не против. если есть дельные советы - я не против. путь к совершенству бесконечен.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Dec 8 2008, 08:01
|
    
Группа: Свой
Сообщений: 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, не так ли? а по моему "алгоритму" - считаете верное значение  Гы-гы. Чем предполагать, может лучше глазками да бациллоскопом? Цитата предвижу возражение, что чем меньше мастер держит линию в 0, тем меньше шансов "разрядить" ее емкость до нужного уровня... и отвечу: так, да не так  1-wire девайсы в силу своей микропотребляющей сути, возможно, и не сумеют "разрядить" линию при аналогичных ситуациях, но мастер вполне в состоянии обеспечить достаточный ток стекания заряда из линии. допускаю, что в некоторых случаях увеличение этого одиозного интервала до 2-3 мкс может улучшить работу шины. что ж, всегда есть конкретные условия, которые надо учитывать. надеюсь, дискуссия по принципу "я прав - ты не прав" не разгорится. если у кого-то есть поправки к моей статье - я не против. если есть дельные советы - я не против. путь к совершенству бесконечен. Да о чем тут дискутировать? На конце 100-метровой линии на лапше 6-мкс импульс от мастера превращается в 4-мкс. Во что превратится 1-мкс импульс, сами догадаетесь? Но если это Ваше хобби - учитывая конкретные условия, затачивать сорцы под длину шнурков, - не буду мешать.
|
|
|
|
|
Dec 8 2008, 09:04
|

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

|
просмотрел 1-wire память, часы, АЦП, термометры - вроде все поддерживают паразитное питание... что я пропустил? кстати, я в смятении - изложенные аргументы я принял, но меня странно удивила информация, которую я вычитал из документа, описывающего DS2490... там написано, что интервал чтения мастера не должен превышать 22 мкс  а как же быть с 15 мкс, определенными "по-умолчанию"?
Сообщение отредактировал ARV - Dec 8 2008, 09:19
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|