реклама на сайте
подробности

 
 
> DS18b20 неправильно показывает температуру, Когда работает софтовый USB(от obdev)
Br.Misha
сообщение Nov 5 2009, 14:02
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



Здраствуйте!
Вобщем хочу я сделать USB термомерт используя мегу8 и DS18b20. Вобщем написал програмку, а когда запустил то по USB(CDC) начали приходить неверные данные с термометра, сначала грешил на DS18b20 но когда подключил его к другому девайсу то он там работал нормально. Потом я отключил USB (в самом коде) и отправлял даные с датчика на UART, на компе было видно реальную температуру. Дальше я написал программу так, чтобы юсб был включен но даные передавались на ЮАРТ и тут ошибка повториласьsad.gif
Вобщем насколько я понял, то комп постоянно отправляет даные на мегу8 и очень часто вызываеться прерывание по INT0 даже тогда, когда меряеться температура а так как задержки между отправкой и приемом команд к DS маленькие, несколько микросекунд(хотя задержка для измерения температуры датчиком минимум 750мс) то или при отправке комманды долго передается бит и DS перезагружаеться, или когда принимаються то МК невовремя реагирует на комманды и получает неправильные данные. Пробовал отключать глобольно прерывания(cli) перед измерением температуры и включать(sei) после измерения но тогда МК вообще не шлет даные по ЮСБ и не отвечает на комманды с ЮСБ(например когда отправляю "1" то он должен прислать "one", 2 - "two") . Ещё пробовал делать так:
------- отключил прерывания перед отправкой комманд к DS чтобы он измерил температуру.
------- включил после этих комманд потому что далее должна быть задержка 800мс.
------- спустя 800 мс отключал, отправлял комманду чтения температуры, когда он присылал даные опять включал
------- эфект тот же!

Кароче мне нада сделать так,чтобы как то отключать ЮСБ на время измерения температуры ну или ещё что нибутьsmile.gif.

Частота 12Мгц, питание от ЮСБ. Вот клавный файл и библиотека для измерения температуры которую я скачал с инета, немного переделал после чего она работает отлично, правда тока на 1 датчик http://upwap.ru/619341 .

Заранее спасиба!!!!!!!

вот кстате те самые даные с термометра:

+031.1
+125.7
+127.5
+031.3
+023.7
-000.7
+127.1
+021.3
+031.1
-000.7
-000.7
-000.7
-000.7
-000.7
+125.7
-000.7
-000.7
+119.7
+063.7
-000.7
-000.7
+125.6
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Br.Misha
сообщение Nov 6 2009, 01:02
Сообщение #2


Местный
***

Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646



фух блин...... переделал код но опять не работает...... вот что я написал:

CODE
#include <avr/io.h>
#include "therm_ds18b20.h"
#include "ascii_conv.h"

volatile char THERM_DQ = 0;
/*
void therm_delay(uint16_t delay)
{
while(delay--) asm volatile("nop");
}
*/

uint8_t therm_reset()
{
uint8_t i;
//Pull line low and wait for 480uS
ds_cbi(THERM_PORT,THERM_DQ);
ds_sbi(THERM_DDR,THERM_DQ);
//_delay_us(480);
TCNT1 = 0;
while(TCNT1<(480*12));
//Release line and wait for 60uS
ds_cbi(THERM_DDR,THERM_DQ);
//_delay_us(60);
TCNT1 = 0;
while(TCNT1<(60*12));
//Store line value and wait until the completion of 480uS period
i=(THERM_PIN & (1<<THERM_DQ));
//_delay_us(420);
TCNT1 = 0;
while(TCNT1<(420*12));
//Return the value read from the presence pulse (0=OK, 1=WRONG)
return i;
}

void therm_write_bit(uint8_t bit)
{
//Pull line low for 1uS
ds_cbi(THERM_PORT,THERM_DQ);
ds_sbi(THERM_DDR,THERM_DQ);
//_delay_us(1);
TCNT1 = 0;
while(TCNT1<12);
//If we want to write 1, release the line (if not will keep low)
if(bit) ds_cbi(THERM_DDR,THERM_DQ);
//Wait for 60uS and release the line
//_delay_us(60);
TCNT1 = 0;
while(TCNT1<(60*12));
ds_cbi(THERM_DDR,THERM_DQ);
}

uint8_t therm_read_bit(void)
{
uint8_t bit=0;
//Pull line low for 1uS
ds_cbi(THERM_PORT,THERM_DQ);
ds_sbi(THERM_DDR,THERM_DQ);
//_delay_us(1);
TCNT1 = 0;
while(TCNT1<12);
//Release line and wait for 14uS
ds_cbi(THERM_DDR,THERM_DQ);
//_delay_us(14);
TCNT1 = 0;
while(TCNT1<(14*12));
//Read line value
if(THERM_PIN&(1<<THERM_DQ)) bit=1;
//Wait for 45uS to end and return read value
//_delay_us(45);
TCNT1 = 0;
while(TCNT1<(45*12));
return bit;
}

uint8_t therm_read_byte(void)
{
uint8_t i=8, n=0;
while(i--)
{
//Shift one position right and store read value
n>>=1;
n|=(therm_read_bit()<<7);
}
return n;
}

void therm_write_byte(uint8_t byte)
{
uint8_t i=8;
while(i--)
{
//Write actual bit and shift one position right to make the next bit ready
therm_write_bit(byte&1);
byte>>=1;
}
}

void therm_read_temperature(char *buffer, volatile char PIN_DS)
{
THERM_DQ = PIN_DS;
// Buffer length must be at least 12bytes long! ["+XXX.XXXX C"]
uint8_t temperature[2];
// uint16_t temper_16bit;
int8_t digit;
uint16_t decimal;
//Reset, skip ROM and start temperature conversion
therm_reset();
therm_write_byte(THERM_CMD_SKIPROM);
therm_write_byte(THERM_CMD_CONVERTTEMP);
//Wait until conversion is complete
//while(!therm_read_bit());
//_delay_ms(750);
for (volatile char gggg=0;gggg<151;gggg++)
{
TCNT1 = 0;
while(TCNT1<(5000*12));
}
//Reset, skip ROM and send command to read Scratchpad
therm_reset();
therm_write_byte(THERM_CMD_SKIPROM);
therm_write_byte(THERM_CMD_RSCRATCHPAD);
//Read Scratchpad (only 2 first bytes)
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
//Store temperature integer digits and decimal digits
digit=temperature[0]>>4;
digit|=(temperature[1]&0x07)<<4;
//Store decimal digits
decimal=temperature[0]&0xf;
decimal*=5;
if (temperature[1]>0xFB) digit = 127-digit;

buffer[0] = to_ascii(digit/100);
buffer[1] = to_ascii((digit%100)/10);
buffer[2] = to_ascii(digit%10);
buffer[3] = '.';
buffer[4] = to_ascii((decimal%100)/10);

}


Обьясняю что наделал:
Частота 12000000 Гц получаеться что timer1 с пределителем на 1 будет делать 12 тиков каждую микросекунду.
Теперь чтобы сделать задержку в 1 микросекунду нада написать: TCNT1 = 0;while(TCNT1<(1*12)); тоесть теперь спустя 12 тиков(1мкс) програма будет выполняться дальше а так как таймер1 будет тикать постоянно, даже когда выполняеться прерывание INT0 то задержка будет более точной чем писать просто через _delay_us. А чтобы сделать иную задержку нада заменить 1 на нужное кол-во микросекунд(тока не больше 5400).
Тут как и раньше с выключеным ЮСБ работает а с включеным нет.
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Br.Misha   DS18b20 неправильно показывает температуру   Nov 5 2009, 14:02
- - Андрей Лютько   Во время чтения/записи данных по шине 1-Wire yужно...   Nov 5 2009, 14:43
- - _Pasha   Цитата(Br.Misha @ Nov 5 2009, 18:02) Ещё ...   Nov 5 2009, 14:44
- - Br.Misha   вобщем сделал на "молекулярном уровне": ...   Nov 5 2009, 15:56
|- - _Pasha   Цитата(Br.Misha @ Nov 5 2009, 19:56) вобщ...   Nov 5 2009, 21:10
- - Br.Misha   Мужики, ну помогите, мож тут ещё че не так? Я уже ...   Nov 5 2009, 19:06
|- - xemul   Цитата(Br.Misha @ Nov 5 2009, 22:06) мож ...   Nov 5 2009, 21:00
- - Андрей Лютько   C OBDEV не использовал. В файле usbdrvasm есть ст...   Nov 5 2009, 20:57
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 04:02) Обья...   Nov 6 2009, 07:43
- - Br.Misha   но почему когда выполняеться _delay_us он не може...   Nov 6 2009, 09:03
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 12:03) но п...   Nov 6 2009, 09:45
- - _Pasha   Раз Вы таки не поняли, показываю. Измените эти две...   Nov 6 2009, 10:38
- - Rst7   Господа, о чем вы? Понятное дело, что единственный...   Nov 6 2009, 11:33
- - Br.Misha   _Pasha, я понял и делал так уже, юсб не отвечал по...   Nov 6 2009, 13:36
|- - xemul   Цитата(Br.Misha @ Nov 6 2009, 16:36) Rst7...   Nov 6 2009, 13:44
- - Rst7   Цитатано я не совсем понял что вы написали. Разъя...   Nov 6 2009, 13:41
- - Br.Misha   Блин..... у меня почему то так и не получилось ре...   Nov 7 2009, 10:30
- - Rst7   ЦитатаRst7, а у вас есть рабочая либа для работы с...   Nov 7 2009, 11:11
- - Br.Misha   гы....странно. какой та код маленький......   Nov 7 2009, 11:17
- - Br.Misha   такс.... переделал я вашу либу, вот что получилось...   Nov 7 2009, 13:43
|- - Андрей Лютько   Цитата(Br.Misha @ Nov 7 2009, 17:43) но н...   Nov 7 2009, 22:27
|- - demiurg_spb   Цитата(Br.Misha @ Nov 7 2009, 16:43) ... ...   Nov 8 2009, 12:34
- - Br.Misha   блин, я пару часов назад написал тут сообщение. ку...   Nov 8 2009, 17:35
- - Rst7   Цитатакуда оно пропало? Не знаю. Мне уведомление ...   Nov 8 2009, 18:38
|- - zltigo   Цитата(Rst7 @ Nov 8 2009, 21:38) так что ...   Nov 8 2009, 22:37
- - Rst7   ЦитатаНикаких глюков. Понятно. 2 Br.Misha: Посм...   Nov 9 2009, 06:41
- - Br.Misha   Rst7, всё работает правильно!!! Extrac...   Nov 15 2009, 11:32
- - microsin   Один умный человек как-то скрестил V-USB с протоко...   Mar 2 2010, 14:45


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 16:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016