Требуется небольшая помощь с ATmega16 и DS1820

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Требуется небольшая помощь с ATmega16 и DS1820

Сообщение AJIEKCEu »

Добрых суток уважаемые...

Пожалуйста помогите мне понятьт мою ошибку, почему у меня не работает связка ATmega16 и DS1820.

Я делал на примере ExemplОв из CodeVisionAVR
Вот код:

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

; :::::::::::: вот тут я иницилизирую обмен с датчиком выбераю порт и разряд::

     #asm
   .equ __w1_port=0x12;PORTD
   .equ __w1_bit=7; PIN7
    #endasm


#include <mega16>
#include <ds1820>
#include <delay>
#include <stdio>

#define MAX_DEVICES 8
// Declare your global variables here
               





#define PA_OUT DDRA = 0xFF
#define PB_OUT DDRB = 0xFF     
#define PD_OUT DDRD = 0xFF     
     

int chisl;   
char out_p,k;
int in_port;
int temp;

void initialization(void){     
PA_OUT;//сделать весь PORTA выходом
PB_OUT;//сделать весь PORTB выходом   
PD_OUT;         
PORTD=0x00;

   
}   



    void pause(void)
{   
 int
 l=300;
met1:
  l--;
if (l > 1){goto met1;}
l=300;
met2:
  l--;
if (l > 1){goto met2;}


}

 void chislo(void)
{  ; Это тестого чтооб выводило хоть что то на светодиод при присутствии сигнала

if (chisl == 0){out_p = 0b11110101;};
if (chisl == 1){out_p = 0b00000101;};
if (chisl == 2){out_p = 0b10110011;};
if (chisl == 3){out_p = 0b10010111;};
if (chisl == 4){out_p = 0b01000111;};
if (chisl == 5){out_p = 0b11010110;};
if (chisl == 6){out_p = 0b11110110;};
if (chisl == 7){out_p = 0b10000101;};
if (chisl == 8){out_p = 0b11110111;};
if (chisl == 9){out_p = 0b11010111;};

if (chisl == 10){out_p = 0b11010111;};
if (chisl == 11){out_p = 0b11010111;};
if (chisl == 12){out_p = 0b11010111;};
if (chisl == 13){out_p = 0b11010111;};
if (chisl == 14){out_p = 0b11010111;};
if (chisl == 15){out_p = 0b11010111;};
if (chisl == 16){out_p = 0b11010111;};
if (chisl == 17){out_p = 0b11010111;};
if (chisl == 18){out_p = 0b11010111;};
if (chisl == 19){out_p = 0b11010111;};
if (chisl == 20){out_p = 0b11010111;};
if (chisl == 21){out_p = 0b11010111;};
if (chisl == 22){out_p = 0b11010111;};
if (chisl == 23){out_p = 0b11010111;};
if (chisl == 24){out_p = 0b11010111;};
if (chisl == 25){out_p = 0b11010111;};
if (chisl == 26){out_p = 0b11010111;};
if (chisl == 27){out_p = 0b11010111;};
if (chisl == 28){out_p = 0b11010111;};
if (chisl == 29){out_p = 0b11010111;};
if (chisl == 31){out_p = 0b11010111;};
if (chisl == 32){out_p = 0b11010111;};
if (chisl == 33){out_p = 0b11010111;};
if (chisl == 34){out_p = 0b11010111;};
if (chisl == 35){out_p = 0b11010111;};
}   

//Вывод на индикатооры:
void vivod(void)       
{

PORTA = 0b11110000;
chislo();
PORTB = out_p;
    pause();

}




void main(void)
{     
initialization(); /* Вызвать (== выполнить) функцию инициализации МК - т.е. настройки нужных нам устройств МК в соответствии с поставленой задачей */


 //unsigned char i,j,devices;
 
//devices=w1_search(0xf0,rom_code);


 



while (1)
     { 
       
     temp=ds1820_temperature_10(0);     
     chisl=temp;   
   
 vivod();
 pause();
     };
}

Скажите пожалуйста в чем моя ошибка?
Не идет измерение... может что с иницилизацией?
МяУУууУуУу
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

вот тут - http://sergeyk.kiev.ua/soft/led2asm/index.html

есть генератор кода чисел для 7 сегментного индикатора.
Аватара пользователя
J0kER
Открыл глаза
Сообщения: 41
Зарегистрирован: Ср фев 14, 2007 10:21:05
Откуда: Красноярск
Контактная информация:

Сообщение J0kER »

Я в програмировании не копенгаген, но вот что бросилось в глаза.

int chisl;
chislo();

Инициализируешь переиенную без буквы "o" в конце,
пытаешься оперировать переменной с оной..
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.
Контактная информация:

Сообщение moLCHec »

J0kER действительно с программрованием похоже вы не очень. переменная и функция вещи разные. С одним именем у вас их объявить и не получится и функции совершенно по боку с каким именем переменой работать главное чтоб имя лежало в пределах синтаксиса языка. AJIEKCEu конечно новую тему создать гораздо проще чем поиском поискать и найти несколько активно обсужденных тем на форуме, но всё таки попробуйте и в статьях посмотрите. И ещё вот что код выкладывать в таком виде не стоит ибо его надо приклеплять файлом иначе модераторы вам флудимость поставят или ещё ченить не приятное. Работы с датчиком в вашем коде нет и совершенно не понятно где ошибку искать. В качестве отладки могу лишь предложить самому задать в переменую в которую читаеся температура оное значение и отработать индикацию. Такая куча if далеко не рациональное решение это все можно задать массивом.
const char chisla[36]=
{
0b11110101,
...
0b11010111
};
тогда функция будет
void chislo(void)
{
out_p=chisla[chisl];
}
Настоящий кот всегда либо голоден,
либо невыспался ...
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

второе - это функция.
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

to moLCHec Дело в том что я все облазил в инете... и на вашем сайте все обыскал...
Я пытался сам код написатьь вот что вышло...

По поводу этих функций (chislo(); и т.д.): Это я для теста делал...

Дело в том что у меня сам датчик не передает код!

а эти числа тут не причем...


Помогите мне пожалуйста нормально настроить датчик
МяУУууУуУу
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.
Контактная информация:

Сообщение moLCHec »

http://www.radiokot.ru/circuit/digital/home/09/
Вот сдесь есть описание с выводом на циферки. всё что требуется это выдернуть функции чтения температуры дальше думаю сами справитесь.
Настоящий кот всегда либо голоден,
либо невыспался ...
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

moLCHec писал(а):http://www.radiokot.ru/circuit/digital/home/09/
Вот сдесь есть описание с выводом на циферки. всё что требуется это выдернуть функции чтения температуры дальше думаю сами справитесь.



Я видел эту схему, и смотрел исходный код, но там только запустался..

НО есть же стандартная процедура чтения?
Я сгенерировал код на CodeVision, далее в переменную темп считываю показания датчика
temp=ds1820_temperature_10(0);
Однако, у меня переменная темп=-9999, чтоо свидетельствует об ошибке!

Может я адрес в скобках неправельно указываю?
МяУУууУуУу
Аватара пользователя
Mamonth
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Я собрал термометр, работает. Правда не сразу запустился.
Значение -9999 - действительно ошибка чтения. Однако если она появляется, значит датчик видно и ты к нему обращаешься.
Проверь, отключены ли прерывания. Верно ли ты указал частоту контроллера в настройках. Подключен ли подтягивающий резистор на 4.7 к между питанием и сигнальной линией. Мои основные ошибки были именно в этом. Удачно поколоупать. ;)
Today fine night...
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Mamonth
Резистор я подключил, только 4.3кОМ
По поводу ошибки -9999, я отключал питание у датчика, данная ошибка как была , так и есть...
Mamonth а ты под какой МК делал?
МяУУууУуУу
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

В дополнение к уже сказанному рекомендую проверить, как настроен порт ввода-вывода, к которому подключен датчик.

А отключение питания датчика (при сохранении подключенными линий DQ и общего провода) ничего не меняет - датчик начинает работать в режиме паразитного питания. В принципе, датчику хватает всего 2-х проводов :).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

ARV Да согласен с тобой, меня тоже интересует порт D , как его настроить если я туда подключаю датчик
Вообще я думал вот настройка:
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=7 ; Pin7
#endasm


В общем вот до кокого вида я довел проограмму, резистор 4.85кОМ подключил как положено... Но к сожалению не работает, проверка показывает, чтоо нет подключенных датчиков:(

Посмотрите пожалуйста, может я действительно портД неправильно настраеваю..?


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

 #include <mega16>
 #include <1wire>
 #include <math>
 #include <stdio>
 #include <ds1820>
         
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=7
#endasm   

#define PA_OUT DDRA = 0xFF    //Для иницилиализации
#define PB_OUT DDRB = 0xFF 
 
 //Это сгенерировал кодевизион
#define MAX_DS1820 8
unsigned char ds1820_devices;
unsigned char ds1820_rom_codes[MAX_DS1820,9];
 unsigned int chisl,out_p;   



void main(void)
{     
unsigned char i;
int temp;

PA_OUT;//сделать весь PORTA выходом
PB_OUT;//сделать весь PORTB выходом
 
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
if (ds1820_devices==0) while(1);//тут вывожу чтотнибуть если нет датчиков
while (1)
      {
for (i=0;i<ds1820_devices;){ temp=ds1820_temperature_10(&ds1820_rom_codes[i][0]);};
         
  PORTA=0b11111011;     //Выводим когда ок
  PORTB= 0b11010110;
 
      };
}   
МяУУууУуУу
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Для меня ковыряться в путанице Си - просто кошмар, не могу себя заставить.
Порт, к которому подключается линия DQ датчика, настроен как выход или вход? А читать состояние надо из PinD.
Си не уважаю и без острейшей необходимости стараюсь к нему близко не приближаться, так что вопросы по Си - не ко мне, уж извините.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

ARV А Вы не могли бы написать для ATmega16 код на ассемблере, чтоб можно было вставитьт ассемблерную вставку..

А я порт D настраивал на ввод и на вывод... но всеравно результат один:(
Поидеи должно выводитьт с порта.. а потом принимать...

НО это первая практика.. так чтоо как правельно я не знаю.. поэтому и спрашиваю..
МяУУууУуУу
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.
Контактная информация:

Сообщение moLCHec »

Скольку с Си работаю и на компе и под контроллеры такого не видел
unsigned char ds1820_rom_codes[MAX_DS1820,9];
Завтра пожалуй залезу в статю и вытащу функции на Си. есть код полностью на асме под 8051 тока в книге а сканера нет.
Предлагаю уже здесь разжевать про DS-ку ввиду часто задаваемых и пинать потом сюда с меня Си с AVR асм если он согласится. Если есть халявний ящик могу просто нафоткать и отослать у меня исходящий бесплатно.
Настоящий кот всегда либо голоден,
либо невыспался ...
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

AJIEKCEu писал(а):А я порт D настраивал на ввод и на вывод... но всеравно результат один:(


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

если возможно перекинь 1-wire пока на ногу как в примере help и попробуй. может даже пример их хелпа. посмотри пример в PROTEUS one-wire - там сеть и тоже на CVAVR и работает.
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Abakt хорошо попробую.. позже отпишусь по результатам...
НО дело в том, что в примере Helpe разбирается для другой микросхемы
МяУУууУуУу
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

Вот я сделал пару кликов мышкой в мастере начального кода CVAVR именно для ds1820

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


#include <mega16>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=7
#endasm
#include <1wire>

// DS1820 Temperature Sensor functions
#include <ds1820>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

ACSR=0x80;

// 1 Wire Bus initialization
w1_init();

while (1)
      {
      // Place your code here

      };
}


Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

кроме того в хелпе написано:

Because the 1 Wire Functions require precision time delays for correct operation, the interrupts must be disabled during their execution.

при работе в 1-вая прерывания должны быть выключены.

Also it is very important to specify the correct AVR chip clock frequency in the Project|Configure|C Compiler|Code Generation menu.

Важно правильно указать частоту кварца в свойствах проекта или в мастере начального кода.
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Abakt
Хмм, странно но вот этого у меня не генерировалось: ACSR=0x80;


Because the 1 Wire Functions require precision time delays for correct operation, the interrupts must be disabled during their execution.

при работе в 1-вая прерывания должны быть выключены.


ТОесть, как так первое прерывание отключено?

Далее в непрерывнном цикле я каак понял из примера снимаю результат (ну это для нескольких):
temp=ds1820_temperature_10(&ds1820_rom_codes[i][0]);


_______________
Abakt Сейчас попробую твой код вставить.. да и учесть полностью все твои замечания!

А вот по датачиту подтягивающий резистор 4.7k , а я путем параллельного включения 2 рез. 1к далее последовательного включил 4.3к, в результате получилось 4.85к (что и подтвердил тестер)... может ли этот резистор существенно повлиять.. т.е. получается отличие от даташита на +150Ом
МяУУууУуУу
Закрыто

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