virtuality 0 25 июля, 2006 Опубликовано 25 июля, 2006 · Жалоба Николай, советую проверить работоспособность датчика на готовом примере в CodeVision. Если и там у вас ничего работать не будет - значит проблема железе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CyberNik 0 26 июля, 2006 Опубликовано 26 июля, 2006 (изменено) · Жалоба Ну вот, купил специально второй датчик для проверок в CodeVision #include <mega16.h> // 1 Wire Bus functions #asm .equ __w1_port=0x1B;PORTA .equ __w1_bit=4 #endasm #include <1wire.h> #include <ds18b20.h> #include <stdio.h> void main(void) { // USART initialization UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x0C; // 1 Wire Bus initialization w1_init(); if (ds18b20_init(NULL,0,0,DS18B20_12BIT_RES)) { while (1) { /* measure and display the temperature(s) */ printf("t=%+.3f\xf8C\n\r", ds18b20_temperature(NULL)); }; } else printf("error!"); while (1); } выдает ошибку на обоих датчиках... от куда беруться такие напряжения (4.28В, см. выше)? Какие есть идеи? Просто схема подключения элементарная, ну где там можно ошибиться.... Изменено 26 июля, 2006 пользователем Labinskiy Nikolay Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virtuality 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Может у вас ошибка не в съеме информации с датчика, а в передаче ее? Я так понял вы через UART передаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CyberNik 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Да, через УАРТ, но там ошибок нету, я через гиперткрминал посылаю команды контроллеру на которые он успешно отвечает мигая светодиодами и т.д., и одна из этих команд - опрос датчика... Дебагил по шагам через JTAG ICE и мерял напряжения на ножках... До сих пор не пойму почему там не появляется на выходе 0... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Balun 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба /* Multipoint thermometer with LCD display using the Maxim DS18B20 1 Wire bus temperature sensors CodeVisionAVR C Compiler (C) 2000-2005 HP InfoTech S.R.L. www.hpinfotech.ro Chip: ATmega8515 Memory Model: SMALL Data Stack Size: 128 bytes THE ATmega8515 CLOCK FREQUENCY MUST BE 3.6864 MHz The DS18B20 sensors are connected to bit 6 of PORTA of the ATmega8515 as follows: [DS18B20] [STK500 PORTA HEADER] 1 GND - 9 GND 2 DQ - 7 PA6 3 VDD - 10 +5V All the temperature sensors must be connected in parallel AN 4.7k PULLUP RESISTOR MUST BE CONNECTED BETWEEN DQ (PA6) AND +5V ! */ #asm .equ __w1_port=0x1b .equ __w1_bit=6 #endasm /* Use an 2x16 alphanumeric LCD connected to PORTC as follows: [LCD] [STK500 PORTC HEADER] 1 GND- 9 GND 2 +5V- 10 VCC 3 VLC- LCD contrast control voltage 0..1V 4 RS - 1 PC0 5 RD - 2 PC1 6 EN - 3 PC2 11 D4 - 5 PC4 12 D5 - 6 PC5 13 D6 - 7 PC6 14 D7 - 8 PC7 */ #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> // LCD driver routines #include <ds18b20.h> #include <delay.h> #include <stdio.h> char lcd_buffer[33]; /* maximum number of DS18B20 connected to the 1 Wire bus */ #define MAX_DEVICES 8 /* DS18B20 devices ROM code storage area */ unsigned char rom_code[MAX_DEVICES][9]; main() { unsigned char i,j,devices; lcd_init(16); lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo"); delay_ms(2000); lcd_clear(); /* detect how many DS18B20 devices are connected to the 1 Wire bus */ devices=w1_search(0xf0,rom_code); sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices); lcd_puts(lcd_buffer); delay_ms(2000); /* display the ROM codes for each device */ if (devices) { for (i=0;i<devices;i++) { sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(2000); lcd_clear(); for (j=0;j<8;j++) { sprintf(lcd_buffer,"%02X ",rom_code[i][j]); lcd_puts(lcd_buffer); if (j==3) lcd_gotoxy(0,1); }; delay_ms(5000); }; } else while (1); /* stop here if no devices were found */ /* configure each DS18B20 device for 12 bit temperature measurement resolution */ for (i=0;i<devices;) if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES)) { sprintf(lcd_buffer,"Init error for\ndevice #%u",i); lcd_clear(); lcd_puts(lcd_buffer); while (1); /* stop here if init error */ }; /* measure and display the temperature(s) */ while (1) { j=1; for (i=0;i<devices;i++) { sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0])); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(500); }; }; } У меня вот этот пример из кодевижена работает. Посмотрите на эту строчку (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES)) Вроду нада поискать датччики и определмить их адрес, ну уж потом делать инит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CyberNik 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Вроду нада поискать датччики и определмить их адрес, ну уж потом делать инит Это если на 1wire шине их несколько, если же датчик один, его поиск (чтение заводского ROM кода) не обязателен. Но я все равно проверю, спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться