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

 
 
 
Reply to this topicStart new topic
> Подключение DS18B20 к Atmega8
Игорек
сообщение May 7 2012, 13:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-04-10
Пользователь №: 56 863



За основу взял эту статью: http://samou4ka.net/page/interfejs-1-wire-...hik-ds18b20#cut
К моему микроконтроллеру подключен 7-сегментный 3-х разрядный индикатор(d0-d7 - сегменты, b0-b2 - разряды), а также датчик температуры DS18B20 к порту c0. Хочу, чтобы если на с0 есть датчик - 7-сегментный индикатор выводил 1, нет датчика - 7 сегментный индикатор выводил 0. Ниже код в WinAVR. Почему подключенном датчике 7-сегментный индикатор выводит 0, хотя должен 1? Фьюзы стоят на 1 МГц.
Код
#include <avr/io.h>
#include <util/delay.h>

#include <avr/interrupt.h>
#define F_CPU = 1000000UL
#define W1_PORT PORTC
#define W1_DDR DDRC
#define W1_PIN PINC
#define W1_BIT 0

//функция определяет есть ли устройство на шине
unsigned int w1_find()
{
    unsigned char device;
    W1_DDR |= 1<<W1_BIT;//логический "0"
    _delay_us(485);//ждем минимум 480мкс
    W1_DDR &= ~(1<<W1_BIT);//отпускаем шину
    _delay_us(65);//ждем минимум 60мкс и смотрим что на шине
    
    if((W1_PIN & (1<<W1_BIT)) ==0x00)
        device = 1;
    else
        device = 0;
    _delay_us(420);//ждем оставшееся время до 480мкс
    return device;
}

//                              0    1    2    3    4    5    6    7    8    9

const unsigned char codes[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};



unsigned char data[3]={0x00,0x00,0x00};




int main(void)

{
unsigned int x=0;


while(1)

{
    //Conver data to codes

DDRD = 0xff;
DDRB = 0xff;
PORTB = 0xff;
x = w1_find();
PORTD = codes[x];
_delay_ms(1000);


  
}

return 1;

}


1. В чем может быть дело, подскажите куда копать. На скриншоте - осциллограмма на ножке c0.
2. Помогите разобраться с операторами функции w1_find():
W1_DDR |= 1<<W1_BIT - как я понял логическое ИЛИ между содержимым регистра W1_DDR и числом 00000001. Но чему равно содержимое регистра W1_DDR, оно же ранее нигде не задано?

Сообщение отредактировал Игорек - May 7 2012, 13:31
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Игорек
сообщение May 7 2012, 18:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-04-10
Пользователь №: 56 863



Блин, прошил фьюзы на 8 МГц, поставил в Makefile F_CPU = 8000000 и все заработало. Чертовщина какая-то...На 1 Мгц никак, на 8 работает. Почему?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 7 2012, 18:41
Сообщение #3


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Игорек @ May 7 2012, 22:16) *
Блин, прошил фьюзы на 8 МГц, поставил в Makefile F_CPU = 8000000 и все заработало. Чертовщина какая-то...На 1 Мгц никак, на 8 работает. Почему?

А изначально , какая частота была в Makefile? И под какую частоту считались delays?
Так что не поминайте черта...


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Игорек
сообщение May 7 2012, 19:07
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-04-10
Пользователь №: 56 863



Изначально в Makefile стояла частота 1Мгц, фьюзы изначально также были на 1 МГц.
Цитата(ILYAUL @ May 7 2012, 22:41) *
И под какую частоту считались delays?

Где это посмотреть?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 7 2012, 19:18
Сообщение #5


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Игорек @ May 7 2012, 23:07) *
Изначально в Makefile стояла частота 1Мгц, фьюзы изначально также были на 1 МГц.

Неужели , тогда обратимся к первоисточнику по Вашей ссылке

Код
# Processor frequency.
Typical values are:

# F_CPU = 1000000  Закоментировано

# F_CPU = 1843200
# F_CPU = 2000000
# F_CPU = 3686400
# F_CPU = 4000000
# F_CPU = 7372800
# F_CPU = 8000000
# F_CPU = 11059200
# F_CPU = 14745600
# F_CPU = 16000000
# F_CPU = 18432000
# F_CPU = 20000000
F_CPU = 4000000  А вот и частота процессора


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Игорек
сообщение May 7 2012, 19:32
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-04-10
Пользователь №: 56 863



Makefile я делал сам, из первоисточника я брал только определение функции w1_find() и директивы #define. А вобще как-то влияет ли на функции delay частота, с которой работает микроконтроллер? Скажем, если я выставлю фьюзы и Makefile на 1 МГц и вызову функцию _delay_us(10), а потом выставлю фьюзы и Makefile на 8 МГц и вызову функцию _delay_us(10) , временные задержки будут абсолютно идентичны или будут все-таки различаться?

Сообщение отредактировал Игорек - May 7 2012, 19:43
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 7 2012, 20:04
Сообщение #7


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Игорек @ May 7 2012, 23:32) *
А вобще как-то влияет ли на функции delay частота, с которой работает микроконтроллер? Скажем, если я выставлю фьюзы и Makefile на 1 МГц и вызову функцию _delay_us(10), а потом выставлю фьюзы и Makefile на 8 МГц и вызову функцию _delay_us(10) , временные задержки будут абсолютно идентичны или будут все-таки различаться?

Обязаны. Но не знаю как реализован код задержек для программы в которой Вы пишите.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Игорек
сообщение May 8 2012, 05:30
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-04-10
Пользователь №: 56 863



Спасибо за помощь!
Go to the top of the page
 
+Quote Post
kolobok0
сообщение May 11 2012, 09:04
Сообщение #9


практикующий тех. волшебник
*****

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



Цитата(Игорек @ May 8 2012, 09:30) *
Спасибо за помощь!



И ышо одно замечание. Перед тем как выдавать сброс - считайте пин от дачтика. Если там изначально будет логический ноль - то, так же можно считать что датчик не подключен wink.gif

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post

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

 


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


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