слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Код: Выделить всё
#define COEFFICIENT (0.89)
#define EEPROM_VAL ((unsigned int)((COEFFICIENT * 1024.0) + 0.5)) // получается 911
eeprom unsigned int division_factor = EEPROM_VAL;
unsigned long K_div;
Код: Выделить всё
:020000008F036CКод: Выделить всё
K_div = division_factor; Неверно используете приведение к типу при вычислении eeprom_val .DataLife писал(а):ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
Неверно используете приведение к типу при вычислении eeprom_val .[/uquote]DataLife писал(а):ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
В протеусе считывается 36611. В реальном железе, судя по поведению программы - тоже.WiseLord писал(а):Вообще-то, последовательность двух байтов 8F03 в eeprom - это как раз 911
Код: Выделить всё
K_div = EEPROM_VAL;Код: Выделить всё
K_div = division_factor; Код: Выделить всё
/*****************************************************
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#define MAX_DS18B20 2
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];
unsigned char lcd_buffer_1[16];
unsigned char lcd_buffer_2[16];
/*температурная функция*/
int temper[2];
int H;
void temperature(void) // функция по работе с термо-датчиком
{
for (H=0;H<ds18b20_devices;H++)
{
temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей
if (temper[H]>10000) //если датчик выдаёт больше 1000*10
{
temper[H]=40960-temper[H]; //отнимаем от данных 4096*10
temper[H]=-temper[H]; //и ставим знак "минус"
}
delay_ms(10);
}
}
void main(void)
{
w1_init();
ds18b20_init(0,-30,80,DS18B20_12BIT_RES);
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
lcd_init(16);
lcd_clear();
if (ds18b20_devices == 0)
{
lcd_gotoxy(0,1);
lcd_putsf("No sensors!");
}
while (1)
{
temperature();
sprintf(lcd_buffer_1, "T1 = %i.%u\xdfC", temper[0]/10, temper[0]%10);
sprintf(lcd_buffer_2, "T2 = %i.%u\xdfC", temper[1]/10, temper[1]%10);
lcd_gotoxy(0,0);
lcd_clear();
lcd_puts(lcd_buffer_1);
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer_2);
}
}
Код: Выделить всё
#define abs(v) ((v)<0?-(v):(v))
Код: Выделить всё
if (temper[H]>10000) //если датчик выдаёт больше 1000
{
temper[H]=~ temper[H]+1; //инвертируем
sig = 1; // выбрасываем флаг того, что у нас минусовая температура
}Какая-то абсолютно ненужная магия чисел. Зачем? Датчик в первых двух байтах ROM уже выдаёт нормальное число (с точки зрения знака) для температуры: 16 * T.DataLife писал(а):Код: Выделить всё
temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей if (temper[H]>10000) //если датчик выдаёт больше 1000*10 { temper[H]=40960-temper[H]; //отнимаем от данных 4096*10 temper[H]=-temper[H]; //и ставим знак "минус" }
только никак не ROM - то, что выдает датчик, это содержимое так называемой блокнотной памяти - scratchpadWiseLord писал(а):в первых двух байтах ROM