Зарегистрирован: Вс май 15, 2011 22:13:25 Сообщений: 18
Рейтинг сообщения:0
По доброму учебнику дошел я ажно до 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); // Пишем, что совсем хреново }
Заголовок сообщения: Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:23:58
Родился
Зарегистрирован: Вс май 15, 2011 22:13:25 Сообщений: 18
Рейтинг сообщения:0
Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Хотя я могу и ошибаться в понятии "земли", ибо честно толком не осознаю зачем именно она нужна. Но все же вряд ли это решит проблему "невидимости" DS18B20
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Заголовок сообщения: Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 20:36:45
Прорезались зубы
Карма: 4
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 08, 2008 11:21:11 Сообщений: 201 Откуда: Пермь
Рейтинг сообщения:0
поддерживаю, для начала всё же сделай нормальное питание на термодатчик, пока что он у тебя обесточен, об этом говорит синий квадратик (низкий потенциал) на выводе Vсс
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 21:08:06
Друг Кота
Карма: 26
Рейтинг сообщений: 108
Зарегистрирован: Чт ноя 04, 2010 01:56:36 Сообщений: 7439 Откуда: г. Москва
Рейтинг сообщения:0
PRStudio писал(а):
Ну как бы земля тоже минус (исходя из того как я понимаю что такое земля), а так как другие элементы подключены к земле, то это минус и остался неиспользованным. Но все же вряд ли это решит проблему "невидимости" DS18B20
Жооож -))))))))))))))))))) Рекомендую начать не с градусника, а самых азов.
Заголовок сообщения: Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 21:11:12
Родился
Зарегистрирован: Вс май 15, 2011 22:13:25 Сообщений: 18
Рейтинг сообщения:0
сделал: поставил power на VSS (при этом резистор не убирал), но это разумеется не помогло Но на счет земли так и не нашел нормального определения (научные сухие выдержки лишь больше запудривают мозг)
Заголовок сообщения: Re: ATmega8: 1-wire - не видит
Добавлено: Вт май 17, 2011 22:57:42
Родился
Зарегистрирован: Вс май 15, 2011 22:13:25 Сообщений: 18
Рейтинг сообщения:0
Ура товарищи, разобрался с землей наконец . Переделал схему, программно задал МК 8мГц, повесил на него кварц в 8мГц (Суть кварца немного понимаю, однако куда вешать не знаю, поэтому повесил как все - на SC1-SC2 (PB-PB7)), и знаете что - все незаработало , "градусник" отказывается быть обнаруженным. Я не могу даже предположить от чего он не желает работать.
открою великую тайну ) в сях изучал работу 1820 и погоняв его решил выводить напрямки буфер в 3310 экран ,получилось так что я получал мусор бесполезный , он явно несходился с декодированием перечитав раз 5-7 допёр!!! программу я писал на 4 мгц в компиляторе ,а выстовлял совершенно другую фигическую тактовую частоту проверь чтоб компиллер был выставлен допустим 4-8мгц и установи в симуляторе 4,8 RС или кварцу задай как положено
Еще бы такому заработать -))) При тактовании от внутреннего генератора на кварце к PB6 и PB7 не должно быть подключено ничего кроме кварца и соотв. образом быть выставлены фьюзы
вот мой код 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(); };
Ура товарищи, разобрался с землей наконец . Переделал схему, программно задал МК 8мГц, повесил на него кварц в 8мГц (Суть кварца немного понимаю, однако куда вешать не знаю, поэтому повесил как все - на SC1-SC2 (PB-PB7)), и знаете что - все незаработало , "градусник" отказывается быть обнаруженным. Я не могу даже предположить от чего он не желает работать.
Классная кстати книжка, рекомендую. Я ее в пятом классе читал, до сих пор помню. Спасибо за ссылку, понастальгирую, пожалуй.
По теме хотел бы отметить следующее:
1. Под "землей" в жаргонном смысле понимают общую точку схемы. Т.е., все провода, оканчивающиеся знаком _|_ , в реальности будут соединены вместе. Кроме того, предполагается, что напряжения на схеме измеряются относительно потенциала этой точки.
Поэтому "минус" батареи тоже должен быть подсоединен к "земле", иначе она фактически не включена в схему.
2. Симуляторы вроде Proteus - первый шаг к резиновой женщине. Купите макетку, и отлаживайте на ней. Заодно, пока будете собирать программатор для контроллера, потренируетесь в пайке, теории и технологии.
3. Микроконтроллеры - прежде всего железо. Потому, исходя из увиденного, я также рекомендую Вам на время отвлечься от термометров, и пособирать что-нибудь попроще. Причем именно попаять (или пособирать на макетке), а не посимулировать в Proteus.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения