Страница 1 из 1
ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 18:45:34
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Подскажите пожалуйста, где пробой.
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:16:25
Satyr
А чего минус батарейки в воздухе висит ? ))
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:23:58
PRStudio
Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Хотя я могу и ошибаться в понятии "земли", ибо честно толком не осознаю зачем именно она нужна. Но все же вряд ли это решит проблему "невидимости" DS18B20
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:34:15
ChipKiller
PRStudio выкиньте батарейку и поставьте
POWER ..... а на счет земли почитайте книжку

ЗЫ Для DS18B20 также важна частота, которая выставляется в свойствах МК....
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:36:45
Alex72
поддерживаю, для начала всё же сделай нормальное питание на термодатчик, пока что он у тебя обесточен, об этом говорит синий квадратик (низкий потенциал) на выводе Vсс
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 21:08:06
Satyr
PRStudio писал(а):Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Но все же вряд ли это решит проблему "невидимости" DS18B20
Жооож -)))))))))))))))))))
Рекомендую начать не с градусника, а самых азов.
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 21:11:12
PRStudio
сделал: поставил power на VSS (при этом резистор не убирал), но это разумеется не помогло
Но на счет земли так и не нашел нормального определения

(научные сухие выдержки лишь больше запудривают мозг)
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 22:57:42
PRStudio
Ура товарищи, разобрался с землей наконец

. Переделал схему, программно задал МК 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
Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 23:46:35
CS16AMX
открою великую тайну ) в сях изучал работу 1820 и погоняв его решил выводить напрямки буфер в 3310 экран ,получилось так что я получал мусор бесполезный , он явно несходился с декодированием перечитав раз 5-7 допёр!!! программу я писал на 4 мгц в компиляторе ,а выстовлял совершенно другую фигическую тактовую частоту проверь чтоб компиллер был выставлен допустим 4-8мгц и установи в симуляторе 4,8 RС или кварцу задай как положено
Re: ATmega8: 1-wire - не видит
Добавлено: Ср май 18, 2011 00:14:21
Satyr
Еще бы такому заработать -)))
При тактовании от внутреннего генератора на кварце к PB6 и PB7 не должно быть подключено ничего кроме кварца и соотв. образом быть выставлены фьюзы
Re: ATmega8: 1-wire - не видит
Добавлено: Ср май 18, 2011 08:19:21
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();
};
}
Re: ATmega8: 1-wire - не видит
Добавлено: Чт май 19, 2011 17:11:55
Rimsky
PRStudio писал(а):Ура товарищи, разобрался с землей наконец

. Переделал схему, программно задал МК 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
Re: ATmega8: 1-wire - не видит
Добавлено: Чт май 19, 2011 19:10:21
YS
Классная кстати книжка, рекомендую. Я ее в пятом классе читал, до сих пор помню. Спасибо за ссылку, понастальгирую, пожалуй.
По теме хотел бы отметить следующее:
1. Под "землей" в жаргонном смысле понимают общую точку схемы. Т.е., все провода, оканчивающиеся знаком _|_ , в реальности будут соединены вместе. Кроме того, предполагается, что напряжения на схеме измеряются относительно потенциала этой точки.
Поэтому "минус" батареи тоже должен быть подсоединен к "земле", иначе она фактически не включена в схему.
2. Симуляторы вроде Proteus - первый шаг к резиновой женщине. Купите макетку, и отлаживайте на ней. Заодно, пока будете собирать программатор для контроллера, потренируетесь в пайке, теории и технологии.
3. Микроконтроллеры - прежде всего железо. Потому, исходя из увиденного, я также рекомендую Вам на время отвлечься от термометров, и пособирать что-нибудь попроще. Причем именно попаять (или пособирать на макетке), а не посимулировать в Proteus.