ATmega8: 1-wire - не видит

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
PRStudio
Родился
Сообщения: 18
Зарегистрирован: Вс май 15, 2011 22:13:25

ATmega8: 1-wire - не видит

Сообщение PRStudio »

По доброму учебнику дошел я ажно до 1-wire. Там предложен вариант работы AVRки и DS1820. Решил я побаловаться (отработать дескать навыки), подключил к МК к LCD для индикации процессов. Подключил DS18B20. Написал в CVAVR код, теоретически который должен проинициализировать устройства 1-wire. Создал я три строки для индикации на LCD: 1 - устройства найдены, 2-не найдены, 3 - просто для теста, для отображения температуры. Но вот проблема, мой же код, говорит что устройства отсутствуют. Порты вроде подключил правильно, да и сам датчик вроде подключен.

Собственно сам исходник:

Код: Выделить всё

#include <mega8.h> //Включаем библиотеку для работы с микроконтроллером ATMega8 
#include <delay.h>   // Задержки
#include <stdlib.h>  // Переводим int в char
 #asm
    .equ __lcd_port=0x18 ;PORTB LCD   
    .equ __w1_port=0x12 ;PORTD DS18B20
    .equ __w1_bit=0 ; BIT0 DS18B20
 #endasm

#include <lcd.h> //Включаем библиотеку для работы с LCD
#include <1wire.h> // 1-wire
#include <ds18b20.h> // DS18B20
 
 

 char _str1[]="Devices found!"; // Выводим на экран если 1-wire нашло
 char _str2[]="No devices!";    // Если нет
 unsigned char _temp[];         // Где хранится температура
 int temper;                    // Температура с датчика
 
 void main(void)
 {
 
 temper=ds18b20_temperature( 0 ); // Получаем температуру с датчика
 itoa(temper, _temp );            // Переводим int в char для возможности вывода на LCD
 
                                  // Инициализируем ЖК
 lcd_init(16);                    // В начало ЖК
 lcd_gotoxy(0,0);
 
    if (w1_init()){  // Если устройства 1-wire нашло
        lcd_clear();  // Чистим ЖК
        lcd_puts(_str1); // Пишим, что что-то есть на ЖК
    } else { lcd_puts(_str2); // Если 1-wire устройств не обнаружено
             lcd_puts(_temp); // Пишем, что совсем хреново
    }


 }


И конечно же схема:
http://s008.radikal.ru/i306/1105/31/cf11b21d344c.jpg
Подскажите пожалуйста, где пробой.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: ATmega8: 1-wire - не видит

Сообщение Satyr »

PRStudio писал(а):И конечно же схема:
http://s008.radikal.ru/i306/1105/31/cf11b21d344c.jpg
Подскажите пожалуйста, где пробой.

А чего минус батарейки в воздухе висит ? ))
PRStudio
Родился
Сообщения: 18
Зарегистрирован: Вс май 15, 2011 22:13:25

Re: ATmega8: 1-wire - не видит

Сообщение PRStudio »

Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Хотя я могу и ошибаться в понятии "земли", ибо честно толком не осознаю зачем именно она нужна. Но все же вряд ли это решит проблему "невидимости" DS18B20
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega8: 1-wire - не видит

Сообщение ChipKiller »

PRStudio выкиньте батарейку и поставьте POWER ..... а на счет земли почитайте книжку :)

ЗЫ Для DS18B20 также важна частота, которая выставляется в свойствах МК....
Аватара пользователя
Alex72
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пн сен 08, 2008 11:21:11
Откуда: Пермь
Контактная информация:

Re: ATmega8: 1-wire - не видит

Сообщение Alex72 »

поддерживаю, для начала всё же сделай нормальное питание на термодатчик, пока что он у тебя обесточен, об этом говорит синий квадратик (низкий потенциал) на выводе Vсс
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: ATmega8: 1-wire - не видит

Сообщение Satyr »

PRStudio писал(а):Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Но все же вряд ли это решит проблему "невидимости" DS18B20

Жооож -)))))))))))))))))))
Рекомендую начать не с градусника, а самых азов.
PRStudio
Родился
Сообщения: 18
Зарегистрирован: Вс май 15, 2011 22:13:25

Re: ATmega8: 1-wire - не видит

Сообщение PRStudio »

сделал: поставил power на VSS (при этом резистор не убирал), но это разумеется не помогло
Но на счет земли так и не нашел нормального определения :) (научные сухие выдержки лишь больше запудривают мозг)
PRStudio
Родился
Сообщения: 18
Зарегистрирован: Вс май 15, 2011 22:13:25

Re: ATmega8: 1-wire - не видит

Сообщение PRStudio »

Ура товарищи, разобрался с землей наконец :wink: . Переделал схему, программно задал МК 8мГц, повесил на него кварц в 8мГц (Суть кварца немного понимаю, однако куда вешать не знаю, поэтому повесил как все - на SC1-SC2 (PB-PB7)), и знаете что - все незаработало :) , "градусник" отказывается быть обнаруженным. Я не могу даже предположить от чего он не желает работать.

Переделанная схема:
http://s43.radikal.ru/i102/1105/d0/433c75cd2172.jpg

В исходник добавил:

Код: Выделить всё

 #asm  
     $crystal = 8000000 ; Добавил частоту 8 мГц
    .equ __lcd_port=0x18 ;PORTB LCD   
    .equ __w1_port=0x12 ;PORTD DS18B20
    .equ __w1_bit=0 ; BIT0 DS18B20
 #endasm
CS16AMX
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 30, 2010 00:50:40

Re: ATmega8: 1-wire - не видит

Сообщение CS16AMX »

открою великую тайну ) в сях изучал работу 1820 и погоняв его решил выводить напрямки буфер в 3310 экран ,получилось так что я получал мусор бесполезный , он явно несходился с декодированием перечитав раз 5-7 допёр!!! программу я писал на 4 мгц в компиляторе ,а выстовлял совершенно другую фигическую тактовую частоту проверь чтоб компиллер был выставлен допустим 4-8мгц и установи в симуляторе 4,8 RС или кварцу задай как положено
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: ATmega8: 1-wire - не видит

Сообщение Satyr »

PRStudio писал(а):Переделанная схема:
http://s43.radikal.ru/i102/1105/d0/433c75cd2172.jpg

Еще бы такому заработать -)))
При тактовании от внутреннего генератора на кварце к PB6 и PB7 не должно быть подключено ничего кроме кварца и соотв. образом быть выставлены фьюзы
CS16AMX
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 30, 2010 00:50:40

Re: ATmega8: 1-wire - не видит

Сообщение CS16AMX »

вот мой код 100% запустится ,но тут ещё не корректированы градусы 25 град будут как 32 ,а дальше линейность ,вобщем попробуй с таким кодом прогнать
#include <mega8.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
#include <delay.h>
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18B20 3
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds18b20_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];
#include <n3310lcd.c>
#include <stdio.h>

// Declare your global variables here
float temper;
int temper_int,temper_fl,min=0;

void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper; // отбор целой части от температуры
if(temper<0) // при отрицательной температуре
{
temper_fl=(temper-temper_int-0.0625)*10; // дробная часть
temper_int=-((temper_int*10)+temper_fl); // температура*10
min=1; // минус
}else // при положительной
{
temper_fl=(temper-temper_int)*10; // дробная часть
temper_int=(temper_int*10)+temper_fl;// температура*10
min=0; // плюс
}

}
void main(void)
{
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим

LcdInit();
LcdMode(2);
while (1 )
{
// Place your code here
delay_ms(500);
temperature(); // вызываем функцию температуры
LcdClear(); // очищаем LCD
if(min==1) // если минус
{
sprintf(lcd_buf,"-%u.%u\x80C",temper_int,temper_int%10); //вывод отрицательной температуры
}else
{
sprintf(lcd_buf,"+%u.%u\x80C",temper_int,temper_int%10); // вывод положительной
}
LcdStringBold(1,2);
LcdUpdate();
};

}
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: ATmega8: 1-wire - не видит

Сообщение Rimsky »

PRStudio писал(а):Ура товарищи, разобрался с землей наконец :wink: . Переделал схему, программно задал МК 8мГц, повесил на него кварц в 8мГц (Суть кварца немного понимаю, однако куда вешать не знаю, поэтому повесил как все - на SC1-SC2 (PB-PB7)), и знаете что - все незаработало :) , "градусник" отказывается быть обнаруженным. Я не могу даже предположить от чего он не желает работать.

Переделанная схема:
http://s43.radikal.ru/i102/1105/d0/433c75cd2172.jpg

В исходник добавил:

Код: Выделить всё

 #asm  
     $crystal = 8000000 ; Добавил частоту 8 мГц
    .equ __lcd_port=0x18 ;PORTB LCD   
    .equ __w1_port=0x12 ;PORTD DS18B20
    .equ __w1_bit=0 ; BIT0 DS18B20
 #endasm


При всем уважении. Я бы Вам посоветовал для начала почитать http://lib.mexmat.ru/books/25487
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: ATmega8: 1-wire - не видит

Сообщение YS »

Классная кстати книжка, рекомендую. Я ее в пятом классе читал, до сих пор помню. Спасибо за ссылку, понастальгирую, пожалуй. :)

По теме хотел бы отметить следующее:

1. Под "землей" в жаргонном смысле понимают общую точку схемы. Т.е., все провода, оканчивающиеся знаком _|_ , в реальности будут соединены вместе. Кроме того, предполагается, что напряжения на схеме измеряются относительно потенциала этой точки.

Поэтому "минус" батареи тоже должен быть подсоединен к "земле", иначе она фактически не включена в схему.

2. Симуляторы вроде Proteus - первый шаг к резиновой женщине. Купите макетку, и отлаживайте на ней. Заодно, пока будете собирать программатор для контроллера, потренируетесь в пайке, теории и технологии.

3. Микроконтроллеры - прежде всего железо. Потому, исходя из увиденного, я также рекомендую Вам на время отвлечься от термометров, и пособирать что-нибудь попроще. Причем именно попаять (или пособирать на макетке), а не посимулировать в Proteus.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»