Перейти к содержанию

Ds18b20+atmega16+cvavr=не Работает


snayperAlfa

Рекомендуемые сообщения

  • Ответов 50
  • Создана
  • Последний ответ

Топ авторов темы

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Еще раз спасибо, Alex! Все работает отлично. Но есть новая проблема, не хочет работать DS18B20 на расстоянии 60 м. Нет ли на форуме информации что сделать для того, чтобы можно было читать температуру с DS18B20 на большом расстоянии? ROM-code определяется нормально.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Alex, я уменьшил сопротивление, но пока подключена микросхема по 3-х проводной линии. Не работает. Завтра переключу на 2-х проводную. А в чем преимущество 2-х проводной линии по сравнению с 3-х проводной?

Ссылка на комментарий
Поделиться на другие сайты

ИМХО, только в экономии проводов :)

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

Вот тут http://forum.eldigi.ru//index.php?showtopic=868 результаты моих экспериментов с длинным проводом.

Ссылка на комментарий
Поделиться на другие сайты

А можно немного подробней рассказать, пожалуйста? И если я использую стандартную библиотеку от Codevision, не придется ли мне писать свою библиотеку для правильной реализации задержек?

Изменено пользователем serj_sl
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

подскажите пожалуйста, в строке .equ __w1_port=0x18 ;PORTB что значит число 18, просто я только недавно начал изучать МК и не могу понять почему при компиляции вылазят эти ошибки: " ds18b20_temp.asm(2100):invalid redefinition of '_w1_port' " и " ds18b20_temp.asm(2101):invalid redefinition of '_w1_bit' "

Ссылка на комментарий
Поделиться на другие сайты

Уважаемые! Бьюсь над решением проблемы уже часа три! Как переключить датчик в 12 битный режим?

вот так пробовал:

 ds18b20_init( 0, 30, 60, DS18B20_12BIT_RES );

и так:

ds18b20_init(0,-35,35,DS18B20_12BIT_RES);

а так , вовсе ошибка вываливается.............

ds18b20_init( &rom_code[2][0], DS18B20_12BIT_RES ); 

версия "кодовоговижина" - 2.05.3

Мне нужно отображать десятые градусы. А отображается только целые...


 sprintf(buffer, "Td=%d.%d\xdfC",temp0/10 , temp0 % 10 ); // колл. этапов
 lcd_gotoxy(0,1);
 lcd_puts(buffer);

....................

                         temp0=ds18b20_temperature(&rom_code[0][0]);  
						 if (temp0>1000)
								 {         
									 temp0=40960-temp0; 
									 temp0=-temp0;      
								 }
								 else
								 {
								 temp0*=10;
								 }

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Первые два правильные, в чем проблема-то? Инициализацию вообще можно не делать, по умолчанию ds18b20 работает в 12 битном режиме.

temp0 какой тип данных имеет? В библиотеке ds18b20.lib функция ds18b20_temperature возвращает значение типа float.

Попробуйте вот так:

	 
	  temp0=ds18b20_temperature(0)*10;  
	  if (temp0>1000)
	  {			   
		 temp0=40960-temp0;		    
		 temp0=-temp0;			    
	  }
		   // else temp0*=10;
	 sprintf(buffer, "Td=%d.%d\xdfC",temp0/10, temp0%10); // колл. этапов
	 lcd_clear();
	 lcd_gotoxy(0,1);
	 lcd_puts(buffer);	   
	 delay_ms(1500);			 
}

Будет работать, но будет проблема с отрицательными числами

Поэтому лучше делать как надо и использовать float:

float temp0;
------------------------------------------
temp0=ds18b20_temperature(0);  
	  if (temp0>1000)
	  {			   
		 temp0=4096.0-temp0;		    
		 temp0=-temp0;			    
	  }
		   // else temp0*=10;
	 sprintf(buffer, "Td=%.1f\xdfC",temp0); // колл. этапов
	 lcd_clear();
	 lcd_gotoxy(0,1);
	 lcd_puts(buffer);	   
	 delay_ms(1500); 

Изменено пользователем IIIytNIK

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

Ссылка на комментарий
Поделиться на другие сайты

Тип данных у меня int . ваш вариант увеличит температуру в 10раз.

float - попробую. Но мне лучше инт использовать. Буду ещё в ком порт слать данные.

А проблема в том, что нету десятых градусов. Проверил экспериментальным путём. Проблема именно в датчике!

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Тип данных у меня int . ваш вариант увеличит температуру в 10раз.

Нет. Чтобы перевести float в int нужно умножить значение переменной на 10^x, где x - количество требуемых знаков после запятой. Функция ds18b20_temperature возвращает значение типа float. Переменная temp0 типа int. В вашем случае при операции присваивания temp0=ds18b20_temperature(&rom_code[0][0]); переменной temp0 будет присвоена ТОЛЬКО целая часть. Например если ds18b20_temperature возвращает 12.34, то переменной temp0 присвоится только 12.

Поэтому, чтобы получить хотя бы один знак после запятой, нужно умножить значение температуры на десять, и только после этого выполнить операцию присваивания. Т.е. temp0=ds18b20_temperature(0)*10. ds18b20_temperature*10 = 123.4, а переменной temp0 присвоится 123.

А в дальнейшем, при выводе на дисплей, в качестве целой части выводим temp0/10. Так как temp0 у нас int, то temp0/10=12. И в качестве дробной выводим остаток от деления на 10 temp0%10.

А проблема в том, что нету десятых градусов. Проблема именно в датчике!

Не может быть такой проблемы у датчика. Почему - читайте даташит и смотрите в каком виде датчик передает температуру. Если бы проблема была в датчике он бы выдавали либо нули, либо околесицу.

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо огромное! Я всё понял :))) дома буду - исправлю!

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Добрый день Всем! Прошу помочь!

Пишу в данную тему, так как часть примера брал отсюда.

Начну с того что решил подключить несколько датчиков температуры. Но использовать МК Atmega32U4, и прошивать его через USB, и выводить всю информацию на LCD. С подключением дисплея, с прошивкой проблем не оказалось, хотя собирал с нуля и не думал что все пройдет гладко. Но когда дошел до датчиков. Первое с чем столкнулся мк не видит ром код, что только не пробовал и подключал по 1 датчику и по несколько, сопротивление менял от 1,8 до 4,7. Подключал как по паразитному питанию так и по 3-х проводной схеме. Использую Codevision 2.05. оговорюсь что компилит он странно и не все функции работают, примеров для 2,05 с работой Codevision я не увидел, и работа с внутренней библиотекой как то странно. если вставить

#asm

.equ __w1_port=0x05 / порт B

.equ __w1_bit=6

#endasm

#include <1wire.h>

То необходимо туже функцию отключить в компиляторе. Для LCD не прописываю все отлично работает. Тут не получается.

Если подать запрос

temp[0]=ds18b20_temperature(&rom_code[0]);

if (temp>1000){

temp[0]=4096-temp[0];

temp[0]=-temp[0];

}

sprintf(lcd_buffer,"t=%i.%u\xdfC",temp[0],temp[0]%1);

lcd_clear();

lcd_puts(lcd_buffer);

delay_ms(2000);

Или подобный получаю температуру -14095,0 градусовС.

Хотя температуру показывает когда поиск устройств пишет Devices =0.

Добавляю полный код программы.

#include <mega32u4.h>				 // 1 Wire Bus interface functions
#include <delay.h>
#include <stdio.h>
#include <1wire.h>					 // DS1820 Temperature Sensor functions
#include <ds1820.h>				 // maximum number of DS1820 devices
								 // connected to the 1 Wire bus
#include <ds18b20.h>
#define MAX_DS18b20 8				 // number of DS1820 devices
								 // connected to the 1 Wire bus
								 // DS1820 devices ROM code storage area,
								 // 9 bytes are used for each device
								 // (see the w1_search function description in the help)
// Alphanumeric LCD Module functions
#include <alcd.h>
// Declare your global variables here
char lcd_buffer[33];
#define MAX_DEVICES 8
/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];
unsigned char devices,i;

int temp[8];
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;
// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;
// PLL initialization
// PLL Enabled: Off
PLLCSR=0x00;
PLLFRQ=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// Timer/Counter 4 initialization
// Clock: Timer4 Stopped
// Mode: Normal top=OCR4C
// OC4A output: OC4A=Disc. /OC4A=Disc.
// OC4B output: OC4B=Disc. /OC4B=Disc.
// OC4D output: OC4D=Disc. /OC4D=Disc.
// Fault Protection: Off
// Fault Protection Noise Canceler: Off
// Fault Protection triggered on Falling Edge
// Timer4 Overflow Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare D Match Interrupt: Off
// Fault Protection Interrupt: Off
// Dead Time Prescaler: 1
// Dead Time Rising Edge: 0.000 us
// Dead Time Falling Edge: 0.000 us
// Set Timer4 synchronous operation
PLLFRQ&=0xcf;
TCCR4A=0x00;
TCCR4B=0x00;
TCCR4C=0x00;
TCCR4D=0x00;
TC4H=0x00;
TCNT4=0x00;
TC4H=0x00;
OCR4A=0x00;
TC4H=0x00;
OCR4B=0x00;
TC4H=0x00;
OCR4C=0x00;
TC4H=0x00;
OCR4D=0x00;
DT4=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT6: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// PCINT0 interrupt: Off
// PCINT1 interrupt: Off
// PCINT2 interrupt: Off
// PCINT3 interrupt: Off
// PCINT4 interrupt: Off
// PCINT5 interrupt: Off
// PCINT6 interrupt: Off
// PCINT7 interrupt: Off
PCMSK0=0x00;
PCICR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 3 Interrupt(s) initialization
TIMSK3=0x00;
// Timer/Counter 4 Interrupt(s) initialization
TIMSK4=0x00;
// USART1 initialization
// USART1 disabled
UCSR1B=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// USB Controller initialization
// USB Mode: Disabled
// USB Pad Regulator: Off
// OTG (VBUS) Pad: Off
// VBUS Transition interrupt: Off
UHWCON=0x00;
USBCON=0x00;
USBINT=0; // Clear the interrupt flag
// 1 Wire Bus initialization
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 7
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.

//w1_init(); !!!!!!!!!!!!!!!!!
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
//ds1820_devices=w1_search(0xf0,ds1820_rom_codes); //поиск датчиков на линии 1-wire
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16

lcd_init(16);
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer," devices=%u",devices);	 // devices = 1 ): ???
	 lcd_clear();				
	 lcd_puts(lcd_buffer);		
	 delay_ms(2000);			

while (1)
 {

 temp[0]=ds18b20_temperature(&rom_code[i][0]);

 if (temp>1000){			
	 temp[0]=4096-temp[0];		
		 temp[0]=-temp[0];			
	 }
	 sprintf(lcd_buffer,"t=%i.%u\xdfC",temp[0],temp[0]%1);
	 lcd_clear();				
	 lcd_puts(lcd_buffer);		
	 delay_ms(2000);			
 };
}

Ссылка на комментарий
Поделиться на другие сайты

А как на счёт разобраться с протоколом и написать собственные функции для работы с датчиком ?

Все проблемы от непонимания происходящего и от лени разбираться...

Ссылка на комментарий
Поделиться на другие сайты

Если бы было лень разбираться, взял бы готовый проект, любого термометра, на 8515 или 2313 или 8535 таких полно на просторах! И не игрался бы с подключение по USB. Подключил бы все по их схемах прошил +писать свои функции когда есть готовая библиотека в CVAVR? Придумывать велосипед.

А как на счёт разобраться с протоколом и написать собственные функции для работы с датчиком ?

Все проблемы от непонимания происходящего и от лени разбираться...

Да и когда не можете помочь, зачем вообще отписывать?

Ссылка на комментарий
Поделиться на другие сайты

писать свои функции когда есть готовая библиотека в CVAVR? Придумывать велосипед
Ну ну.. Только что-то этот велосипед не едет нихрена :D
Да и когда не можете помочь, зачем вообще отписывать?
Т.е. советы уже в помощь не входят ?

Совсем обнаглел народ - готовое им сразу подавай :big_boss:

Ссылка на комментарий
Поделиться на другие сайты

И не поймёте, пока интерфейс и протокол не выучите. Всякие готовые библы от компиляторов (особенно таких, как CVAVR) - мины, причём не из железа, а из г..на :)

Что Вам можно ещё посоветовать, как не вставать осциллографом или анализатором на шину и искать проблему ? Но совет такой бесполезен :)

Ссылка на комментарий
Поделиться на другие сайты

Все заработало находит 4 датчика, проблема оказалась даже стыдно писать =( Короче все оказалось очень просто если ставить частоту 4 все работает ок, ставлю 16, нифига, хотя написано что работает от 4, а не тут то было. Такое начинается, вообщем, ALEX, прав читайте протоколы, и главное даташит очень внимательно, про задержки.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...