|
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, 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
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
Сообщений в этой теме
neurox ATmega16 + DS18B20. Код на ассемблере не работает. Dec 6 2008, 04:24 oll Резистор подтягивающий 4,7К у Вас есть? Похоже так... Dec 6 2008, 04:59 domowoj Может поможет
http://radioded.ru/index.php?option=... Dec 6 2008, 06:00    xemul Цитата(ARV @ Dec 7 2008, 23:26) хотите ве... Dec 7 2008, 21:19     ARV Цитата(xemul @ Dec 8 2008, 00:19) На стр.... Dec 8 2008, 06:16      xemul Цитата(ARV @ Dec 8 2008, 09:16) не ошибае... Dec 8 2008, 08:01    Aesthete Animus Цитата(ARV @ Dec 7 2008, 23:26) хотите ве... Dec 7 2008, 23:30    Т.Достоевский Цитата(ARV @ Dec 7 2008, 23:26) ...хотите... Dec 14 2008, 03:51 Deka А можно я просто выложу свой ассемблерный код обще... Dec 6 2008, 21:08 Aesthete Animus Ну если на то пошло, то вот
http://www.maxim-ic.c... Dec 7 2008, 02:53 neurox ЦитатаРезистор подтягивающий 4,7К у Вас есть? Похо... Dec 8 2008, 04:29 ARV просмотрел 1-wire память, часы, АЦП, термометры - ... Dec 8 2008, 09:04 Aesthete Animus Цитата(ARV @ Dec 8 2008, 12:04) просмотре... Dec 8 2008, 10:30  ARV Цитата(Aesthete Animus @ Dec 8 2008, 13:3... Dec 8 2008, 10:38   Aesthete Animus Цитата(ARV @ Dec 8 2008, 13:38) 1821 вооб... Dec 8 2008, 11:16    ARV Цитата(Aesthete Animus @ Dec 8 2008, 14:1... Dec 8 2008, 11:34 xemul Цитата(ARV @ Dec 8 2008, 12:04) просмотре... Dec 8 2008, 11:04 ARV не надо увлекаться 1 мкс - я несколькими постами р... Dec 8 2008, 11:14 xemul Цитата(ARV @ Dec 8 2008, 14:14) что касае... Dec 8 2008, 11:44 Aesthete Animus Цитата(ARV @ Dec 8 2008, 14:14) и тем не ... Dec 8 2008, 12:06  ARV Цитата(Aesthete Animus @ Dec 8 2008, 15:0... Dec 8 2008, 12:42 _Pasha 1-wire!
Бляха-муха стока флейма Вам не стыдно?... Dec 8 2008, 11:49 xemul имхо, наиболее общая расталдычка на эту тему с вре... Dec 8 2008, 13:37 sonycman Интересно, а вот допустим, есть сеть из нескольких... Dec 8 2008, 15:17 Nekromant Извиняюсь, я может не все заметил в бурных прениях... Dec 9 2008, 15:31  ARV Цитата(Nekromant @ Dec 9 2008, 18:31) Изв... Dec 9 2008, 15:44 _Pasha Цитата(ARV @ Dec 8 2008, 16:42) вот так б... Dec 9 2008, 18:10 neurox Хм.. поставил внешний кварц на 10 MHz ничего не из... Dec 10 2008, 02:20 Александр Куличок Цитата(neurox @ Dec 10 2008, 04:20) видим... Dec 14 2008, 22:17  neurox Цитата(Александр Куличок @ Dec 15 2008, 06... Dec 15 2008, 11:35   _Pasha Цитата(neurox @ Dec 15 2008, 15:35) в про... Dec 15 2008, 11:43 neurox А вот когда я ставлю PORTA на вход, как изменяется... Dec 13 2008, 03:28 ARV Цитата(neurox @ Dec 13 2008, 06:28) А вот... Dec 13 2008, 06:17
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|