DS18B20 и семисегментник.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

DS18B20 и семисегментник.

Сообщение prw07 »

При такой записи temp=ds18b20_temperature(&rom_codes[0][0]);
в каком виде в переменной temp хранятся данные? Как посмотреть значение этой переменной? Proteus не показывает.
Вот весь код:

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

#include <mega8.h> 
#asm 
.equ __w1_port=0x15 ;PORTC      //сообщаем куда подключен датчик 
.equ __w1_bit=0 
#endasm 
#include <1wire.h> 
#include <ds18b20.h>  
//                              0    1    2    3    4    5    6    7    8    9 
const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
#define MAX_DS1820 2                      //определяем количество устройств на линии 1-wire  (в данном случае 2 датчика)
unsigned char rom_codes[MAX_DS1820][9];    //Определяем массив данных-кодов датчиков - по 9 символов в каждой записи
#include <stdio.h>                                                  
#include <delay.h> 

int temp,x;                   //  temp -  датчик

void main(void) 
{ 
unsigned char devices;         //переменная в которой хранится количество присоеденённых датчиков 

devices=w1_search(0xf0,rom_codes);      //ищим датчики 

PORTB=0x00;                //PortB,PortD - выходы
DDRB=0xff; 
PORTD=0x00;
DDRD=0xff;    

while (1) 
{ 
//#asm("cli");
temp=ds18b20_temperature(&rom_codes[0][0]);           //в  temp заносим данные  датчика
//#asm("sei");

x=temp;         
PORTB=0x00;            
PORTD=0b11111110;      
PORTB=codes[x];        


}; 
}
В архиве экспериментальный проект в CVAVR и Протеусе.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение ARV »

prw07 писал(а):в каком виде в переменной temp хранятся данные? Как посмотреть значение этой переменной? Proteus не показывает.
данные хранятся в виде 16-битного целого числа со знаком
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение Danko »

prw07, а открыть файл ds18b20.h и посмотреть как объявлена функция религия не позволяет ?
ds18b20.h писал(а):float ds18b20_temperature(unsigned char *addr);
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Аватара пользователя
andrey_artemov
Встал на лапы
Сообщения: 136
Зарегистрирован: Сб авг 15, 2009 21:26:50
Откуда: Пенза
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение andrey_artemov »

Чтобы протеус показывал значения переменных, то в свойствах проекта нужно в пункте С Compiler убрать галочку с пункта "Automatic Global Register Allocation".
Реклама
Эиком - электронные компоненты и радиодетали
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

Всем ОГРОМНОЕ спасибо.
Не сердитесь за явно глупые вопросы. Я с МК и Си только начал знакомство. Это больше хобби. В свободное от работы время изучаю.
Чтобы протеус показывал значения переменных, то в свойствах проекта нужно в пункте С Compiler убрать галочку с пункта "Automatic Global Register Allocation".
Попробую так, но мне подсказали еще одно решение: определить переменную как volatile. Тогда работает.
И почему-то переменная temp все время равна -9999. Причем при изменении в протеусе значения датчика значение этой переменной не изменяется. Понимаю, что где-то ошибка а где понять не могу. Ткните носом пожалуйста. Только не очень больно.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение ARV »

Danko писал(а):prw07, а открыть файл ds18b20.h и посмотреть как объявлена функция религия не позволяет ?
ds18b20.h писал(а):float ds18b20_temperature(unsigned char *addr);
тип результата функции роли не играет, если вы впихиваете его в переменную типа int - храниться будет именно в том формате, что я говорил
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение Danko »

Согласен.

Но если человек изучает Си, то лучше либо использовать явное приведение типов, либо не играться с этим.

Мы ведь не на Басике пишем. :)
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

С этим все понятно, но непонятно почему после операции temp=ds18b20_temperature(&rom_codes[0][0]); в переменную temp заносится число -9999 и оно не изменяется при изменении значения датчика в протеусе. Скорее всего неправильно составлен код. Но не пойму как нужно.
Можете подсказать?
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение Danko »

prw07, скажите Ваш проект будет реализован в железе ?

или это учебный виртуальный проект.

Если второе, то рекомендую сначала отработать динамическую индикацию используя прерывания.

А работу DS18B20 лучше изучать используя знакосинтезирующие LCD.

Да и еще почитайте про представление отрицательных чисел в двоичном коде.

Ну и напоследок: в Протеусе фузы тоже нужно устанавливать.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

это чисто теория.
Прерывания и динамическую индикацию оставил на потом. Сначала хочу разобраться с этим. С LCD уже разобрался. Работает.
Если в переменной не изменяется значение, то какая разница отрицательное это значение или положительное?
Как фузы в Протеусе могут влиять на значения датчика температуры?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение ARV »

Danko писал(а):Согласен.
Но если человек изучает Си, то лучше либо использовать явное приведение типов, либо не играться с этим.
Мы ведь не на Басике пишем. :)
явное приведение типов требуется далеко не всегда, и в общем-то говорит о не очень аккуратном коде, т.е. невысокой квалификации программиста. а делать явное приведение типов в тех случаях, когда такое преоьбразование делается автоматически - вообще бессмысленно, дурной тон.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение Danko »

prw07,
мой пост выше - это рекомендации в общем.

И если это для Вас мелочи, то извините :(

В программе не бывает мелочей.

Я думал, что Вы хотите научится, а похоже для Вас главное чтобы термометр температуру показывал.
ARV писал(а):явное приведение типов требуется далеко не всегда, и в общем-то говорит о не очень аккуратном коде, т.е. невысокой квалификации программиста. а делать явное приведение типов в тех случаях, когда такое преобразование делается автоматически - вообще бессмысленно, дурной тон.
Ну Вы еще скажите, что по тексту программы не нужно использовать табуляцию. И вообще всю Си-программу можно писать в одну строку все равно в бинарнике все одной кучей.

Я использую явное приведение типов больше для наглядности и для того-чтобы заткнуть рот компилятору на его лишние в этом случае предупреждения.
керниган б. ричи д. писал(а):...
Изображение
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: DS18B20 и семисегментник.

Сообщение zhu4er »

prw07 писал(а):это чисто теория.
Прерывания и динамическую индикацию оставил на потом. Сначала хочу разобраться с этим. С LCD уже разобрался. Работает.
Если в переменной не изменяется значение, то какая разница отрицательное это значение или положительное?
Как фузы в Протеусе могут влиять на значения датчика температуры?
Вы так никогда не научитесь...
Даже у стен есть уши...
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

zhu4er писал(а):
prw07 писал(а):это чисто теория.
Прерывания и динамическую индикацию оставил на потом. Сначала хочу разобраться с этим. С LCD уже разобрался. Работает.
Если в переменной не изменяется значение, то какая разница отрицательное это значение или положительное?
Как фузы в Протеусе могут влиять на значения датчика температуры?
Вы так никогда не научитесь...
Вы не поняли. То что индикацию и прерывания я оставил на потом, это означает, что я не хватаюсь за все сразу. Для начала разберемся с более простым, а потом будем усложнять задачу.
И если это для Вас мелочи, то извините
Я ничего подобного не говорил.
Я думал, что Вы хотите научится, а похоже для Вас главное чтобы термометр температуру показывал.
Термометр - это шаг для познания науки.
это чисто теория
я имею ввиду, что не планировал делать железяку, а пытаюсь изучить принцип и Си.

Теперь по моему вопросу. Ошибку нашел.
Danko, Вы были правы :
в Протеусе фузы тоже нужно устанавливать.
В CVAVR была выставлена частота 8MHz, а в протеусе 1MHz. После "уравнивания" частот все заработало. Но все-равно глюк протеуса остался: если в процессе отладки изменить показания датчика, то при следующем проходе в переменную temp записывается -9999, если пройти еще один цикл, то снова работает правильно.

А вот теперь самое время поговорить о динамической индикации и прерываниях:
В нете видел много примеров динамической индикации и все реализованы через прерывания.
Вопрос: какое преимущество использования прерывания, если проще для программиста реализовать в подобном виде?:

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

сonst unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
PORTB=0x00;            
PORTD=0b11111110;      
PORTB=codes[код];
delay(время);
PORTB=0x00;            
PORTD=0b11111101;      
PORTB=codes[код];
delay(время);
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение ARV »

если вы считаете, что предложенный вами пример ПРОЩЕ, сразу добавьте в него какую-либо функцию, которая требует заметного времени, например, генерацию звука или еще чего-то похожего. даже функция измерения температуры в вашем CVAVR сделана так, что длится почти 1 секунду. и как при этом ваша простая индикация будет работать?

прерывания позволяют делать несколько дел ПАРАЛЛЕЛЬНО, т.е. практически одновременно, без накладок.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

понял. Спасибо.
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

очередной вопрос по динамике:

Прерывание на индикацию происходит каждые 40mS (25Гц). А измерение температуры занимает около 1 секунды. Если на это время запрещать прерывания, то индикаторы будут тухнуть. Как быть в данном случае? Вводить запрет прерываний в самом модуле для датчика? В какой процедуре?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение ARV »

prw07 писал(а):очередной вопрос по динамике:

Прерывание на индикацию происходит каждые 40mS (25Гц). А измерение температуры занимает около 1 секунды. Если на это время запрещать прерывания, то индикаторы будут тухнуть. Как быть в данном случае? Вводить запрет прерываний в самом модуле для датчика? В какой процедуре?
займитесь поиском по форуму - эта тема обсасывалась тут раз двести. ваша проблема - типичная проблема всех, кто купился на готовые библиотеки CVAVR и не хочет думать сам.

выход только один - использовать готовые нормальные библиотеки для работы с 1-wire устройствами или делать их самостоятельно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: DS18B20 и семисегментник.

Сообщение prw07 »

спасибо и на том. Буду искать.
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: DS18B20 и семисегментник.

Сообщение Danko »

файл ds18b20.lib

все строки содержащие w1_write(0x__);
w1_read();
w1_init();


нужно обернуть запретом и разрешением т.е.

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

#asm("cli")
w1_write(0x__);
#asm("sei")
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Закрыто

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