Отговори на тема  [ 3 мнения ] 
Как да извадя две числа в програмата ми на С++.АТМЕГА8 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение Как да извадя две числа в програмата ми на С++.АТМЕГА8
Здравейте ,моля за вашата помощ по програмиране на ред или на правилно конфигуриране на параметър.
Най вероятно след като променям програмата от руска схема за атмега8 на термостат,нещо не разбирам как да го направя на С++.Познанията ми са само на асемблер.ето част от програмата.
Параметъра за температурата Temperatura=T с неговите 8 бит не мога да обвържа правилно по реда на изваждане спрямо параметър Termostat.GistCooling ,който е така uint8_t GistCooling; а пък аз го изменям така
uint16_t GistCooling; и всичко по посоченото изваждане на конкретния ред се обърква.Това се прави щото
температурите се записват в програмата без десет.запетаи и стават числата ми от 8битови на 16 битови

Не променям тук нищо:
/*
--Охлаждение--
охл до 20 выкл среда нагревает
смотрим когда 25 вкл
охл до 20 выкл
--------------
охл до -20 выкл среда нагревает
смотрим когда -15 вкл
охл до -20 выкл
----Нагрев----------
наг до 20 выкл среда охлаждает
смотрим когда 15 вкл
наг до 20 выкл
--------------
наг до -20 выкл среда охлаждает
смотрим когда -25 вкл
наг до -20 выкл
--------------
*/
if (eeprom_eer)
if ( OFF_SW_WORK_ON_ERR ){
PORTDRIVE &= ~DRIVE_TEN_1;
PORTDRIVE &= ~DRIVE_COOL;
return;
}

if ((out_1wire & pwire0)==0) return;

int T;
T=((unsigned int)(temp_msb[0]<<8))|temp_lsb[0];
T=(T*5)/8;
Temperatura=T;
if ( Termostat.ohlagdenie )
{//охлаждение
if (T >= (Termostat.temperature+Termostat.gisterezis) ) PORTDRIVE |= DRIVE_TEN_1;//охлаждение
else
if (T <= Termostat.temperature) PORTDRIVE &= ~DRIVE_TEN_1;

if (ON_COOLING)
if (T <= Termostat.temperature-Termostat.GistCooling) PORTDRIVE |= DRIVE_COOL;
if (T >= Termostat.temperature) PORTDRIVE &= ~DRIVE_COOL;

}
else
{//нагрев
if (T <= (Termostat.temperature-Termostat.gisterezis) ) PORTDRIVE |= DRIVE_TEN_1;//нагрев
else
if (T >= Termostat.temperature) PORTDRIVE &= ~DRIVE_TEN_1;

if (ON_COOLING)
if (T >= Termostat.temperature+Termostat.GistCooling) PORTDRIVE |= DRIVE_COOL;
if (T <= Termostat.temperature) PORTDRIVE &= ~DRIVE_COOL;
}

state_wire=0;
}
}

По принцип
Termostat.temperature - се изменя чрез бутони от градусите на основната задавана температура
Termostat.GistCooling - диференция -изменя се чрез бутони от 0 до 20 градуса,в програмата се задава от 0 до 200- 8 битово)
Исках да променя границите на Termostat.GistCooling -от 0 до 70 градуса ,впрограмата се води с запис 0- до 700 (а това е вече 16 битово.Още в този файл по долу променям типа на числото за :Termostat.GistCooling,на 16 битово и тогава онзи ред по горе в програмата отбелязан в червено,където има изваждане ,не изважда правилно.
Т.Е.
Termostat.temperature - ПРИ ПО МАЛКА ПОЛОЖИТЕЛНА СТОЙНОСТ ОТ ТАКАВА ПО ГОЛЯМА ПОЛОЖИТЕЛНА Termostat.GistCooling- СЕ СБЪРКВА ИЗВАЖДАНЕТО,зАЩОТО ИЗВАЖДАНЕТО преминава през нула.

Ако Termostat.temperature - ако е зададена отрицателна СТОЙНОСТ ОТ ТАКАВА спрямо ПОЛОЖИТЕЛНА винаги Termostat.GistCooling- СЕ ИЗВАЖДА без проблеми.
ТОВА Е БЕЗ ДА ПРОМЕНЯМ НЕЩО :
struct {
int16_t temperature;
uint8_t gisterezis;
uint8_t ohlagdenie;
uint8_t GistCooling;
uint16_t crc;
}Termostat;

uint8_t lcd_buffer[4], znmesto, state_wire,
ViewName,
anti_dr, key, btn_speed, n_btn_sp, inc,
out_1wire, temp_lsb[2], temp_msb[2], time_wire, eeprom_eer;
uint8_t time_flag, TimeViewp;

В последствие променям само този ред

uint8_t GistCooling; както следва uint16_t GistCooling; и всичко по посоченото изваждане на конкретния ред се обърква.
Мисля ,че незадавам правилно 8 бит и 16 бит параметър,и не знам как да се случи правилно изваждане в С++


Прикачени файлове:
Коментар на файл: има зададени лимит стоиности за параметъра :
static void key_action(void)
{
.....
else
if (ViewName==4){
Param=Termostat.GistCooling;
LimitPlus=700;
LimitM=0;

TERMOSTAT.c [12.01 KiB]
248 пъти
Коментар на файл: това са оригиналните файлове
v32.c [11.61 KiB]
261 пъти
Коментар на файл: това са оригиналните файлове
v32.h [2.46 KiB]
259 пъти
Сря Окт 22, 2014 7:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Как да извадя две числа в програмата ми на С++.АТМЕГА8
Я пробвай да направиш
T, temperature; gisterezis; ohlagdenie; GistCooling; всичките на int16_t

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Окт 22, 2014 8:13 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение Re: Как да извадя две числа в програмата ми на С++.АТМЕГА8
Много благодаря.Получи се .
А как се. чете тоэи ред .
( OFF_SW_WORK_ON_ERR ) - така е дефиниран входА на ПРОЦЕСОРА.
Какво става с изходите .


if (eeprom_eer)
if ( OFF_SW_WORK_ON_ERR ){
PORTDRIVE &= ~DRIVE_TEN_1;
PORTDRIVE &= ~DRIVE_COOL;
return;


Чет Окт 23, 2014 10:07 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни