|
DS18b20 неправильно показывает температуру, Когда работает софтовый USB(от obdev) |
|
|
|
Nov 5 2009, 14:02
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Здраствуйте! Вобщем хочу я сделать USB термомерт используя мегу8 и DS18b20. Вобщем написал програмку, а когда запустил то по USB(CDC) начали приходить неверные данные с термометра, сначала грешил на DS18b20 но когда подключил его к другому девайсу то он там работал нормально. Потом я отключил USB (в самом коде) и отправлял даные с датчика на UART, на компе было видно реальную температуру. Дальше я написал программу так, чтобы юсб был включен но даные передавались на ЮАРТ и тут ошибка повторилась  Вобщем насколько я понял, то комп постоянно отправляет даные на мегу8 и очень часто вызываеться прерывание по INT0 даже тогда, когда меряеться температура а так как задержки между отправкой и приемом команд к DS маленькие, несколько микросекунд(хотя задержка для измерения температуры датчиком минимум 750мс) то или при отправке комманды долго передается бит и DS перезагружаеться, или когда принимаються то МК невовремя реагирует на комманды и получает неправильные данные. Пробовал отключать глобольно прерывания(cli) перед измерением температуры и включать(sei) после измерения но тогда МК вообще не шлет даные по ЮСБ и не отвечает на комманды с ЮСБ(например когда отправляю "1" то он должен прислать "one", 2 - "two") . Ещё пробовал делать так: ------- отключил прерывания перед отправкой комманд к DS чтобы он измерил температуру. ------- включил после этих комманд потому что далее должна быть задержка 800мс. ------- спустя 800 мс отключал, отправлял комманду чтения температуры, когда он присылал даные опять включал ------- эфект тот же! Кароче мне нада сделать так,чтобы как то отключать ЮСБ на время измерения температуры ну или ещё что нибуть  . Частота 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
|
|
|
|
|
 |
Ответов
|
Nov 6 2009, 01:02
|
Местный
  
Группа: 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 Правил форума.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|