Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср ноя 19, 2025 05:58:46

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7702 ]     ... , , , 270, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 13:43:19 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
не понял, какие типы переменных у вас.

Код:
typedef uint8_t typ8;
typedef struct
{
   typ8 secund;
   typ8 minut;
   typ8 hour;
   typ8 den_nedeli;
   typ8 chislo;
   typ8 mecyac;
   typ8 yahr;
   typ8 status_registr;
}rtc;
rtc *PtrRTC_struct;
rtc RTC_struct={0};
rtc *PtrRTC_struct=&RTC_struct;
typ8 TWI_buffer[8]={0};


не увидел доступа к полю структуры...
вот таким образом решил получить доступ
Код:
*(PtrRTC_struct+i);
беру адрес структуры перемещаюсь на нужный адрес поля (типы полей учитываю,так как у нас все поля одного типа они должны располагаться равномерно) и разименовываю полученный адрес. или такое только с массивами прокатывает?

!!!с кодом выше предидущая ошибка пропала. указатель на структуру было не правильно использовал
ща только вот эта Ошибка incompatible types when assigning to type 'typ8' from type 'rtc'
ругается вот на это
Код:
TWI_buffer[i]=*(PtrRTC_struct+i);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 13:55:07 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2128
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18425
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
я вам не рекомендовал бы пока что использовать арифметику указателей, т.к. она, мягко говоря, не совсем очевидна.
PtrRTC_struct+1 это совсем не переход на 1-е поле структуры... а переход на первый байт ЗА этой структурой...

для обращения ПОБАЙТНО к памяти, выделенной под структуру, надо использовать указатель на БАЙТ, а не указатель на структуру

для "занесения" структуры в массив байтов используйте функцию memcpy, а не самодельные циклы

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 14:26:00 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
я вам не рекомендовал бы

понял :write:
надо использовать указатель на БАЙТ
как получить этот указатель можно?или сначала в массив , а потом работать с эти массивом?

Добавлено after 6 minutes 27 seconds:
memcpy
это же то, что мне и нужно!!! :beer: :music:

хотя пишут memmove "безопаснее" :roll:

Добавлено after 14 minutes 43 seconds:
для "занесения" структуры в массив
а мне нужно нуе всю структуру заносить, а только допустим 2,3,5 поле, то как быть? пока предполагаю два раза использовать функцию?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 14:34:48 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2128
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18425
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
как получить этот указатель можно?
Код:
uint8_t *u8_ptr = (void*)&RTC_struct;

ROMan2947 писал(а):
хотя пишут memmove "безопаснее"
memmove может копировать без проблем данные между "пересекающимися" областями. в вашем случае такого пересечения нет и не может быть, поэтому лучше memcpy - она быстрее.
ROMan2947 писал(а):
а мне нужно нуе всю структуру заносить, а только допустим 2,3,5 поле, то как быть?
Код:
TWI_bufferх[0] = RTC_struct.minut;
TWI_bufferх[1] = RTC_struct.chislo;
TWI_bufferх[2] = RTC_struct.yahr;

P.S. ужас-то какой у вас в идентификаторах творится... там и английский, там и транслит... там и помесь заглавных с прописными... нечитаемый код будет

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 14:50:48 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
....
огромное спасибо!!!! :)
ужас-то какой
:oops:

Добавлено after 7 minutes 22 seconds:
Код:
TWI_bufferх[0] = RTC_struct.minut;
TWI_bufferх[1] = RTC_struct.chislo;
TWI_bufferх[2] = RTC_struct.yahr;


по-вашему запись понятна!это круто,но по-мне это банально.
а если так:
Код:

 memcpy(TWI_buffer,&(PtrRTC_struct->minut),1);
 memcpy(TWI_buffer,&(PtrRTC_struct->chislo),1);
 memcpy(TWI_buffer,&(PtrRTC_struct->yahr),1);

:tea:

Добавлено after 1 minute 47 seconds:
Код:
uint8_t *u8_ptr = (void*)&RTC_struct;

это что-то новое :shock:

P.S Все больше складывается впечатление, что СИ безграничен!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 15:06:07 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2128
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18425
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ROMan2947 писал(а):
это круто,но по-мне это банально.
вам шашечки, или ехать?

вызов функции трижды для копирования 3 байт - это настолько не банально, что даже и не знаю, что сказать... наверное, это как если вы купите два бревна для того, чтобы выстрогать 2 палочки для суши...

Добавлено after 2 minutes 12 seconds:
тем более что в вашем примере вы все три байта из структуры пишите на одно и то же место в массиве. на самом деле все будет куда круче
Код:
memcpy(&TWI_buffer[0],&(PtrRTC_struct->minut),1);
 memcpy(&TWI_buffer[1],&(PtrRTC_struct->chislo),1);
 memcpy(&TWI_buffer[2],&(PtrRTC_struct->yahr),1);

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 15:17:57 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
купите два бревна для ...
конкретно для этого
случая сравнение у Вас точное :)))

в вашем примере вы...
мне вот любопытно сколько Гб или Тб кода нужно написать, чтоб не делать такие детские ошибки :oops: :facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 15:32:20 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4891
Откуда: Минск
Рейтинг сообщения: 1
Ещё можно было бы union использовать:
Код:
typedef union
{
    struct {
        typ8 secund;
        typ8 minut;
        typ8 hour;
        typ8 den_nedeli;
        typ8 chislo;
        typ8 mecyac;
        typ8 yahr;
        typ8 status_registr;
    };
    typ8 buf[8];
}rtc;

Тогда обращение RTC_struct.minut и RTC_struc.buf[1] будет, по сути, одним и тем же. Памяти эта структура занимать больше не будет, естественно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 15:39:17 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Ещё можно было бы union использовать:
Благодарю,но пока ни разу не пользовал union, туманное представление как с ним работать. будем разбираться как это штука работает. :tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 16:19:02 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4891
Откуда: Минск
Рейтинг сообщения: 4
Так же как и обычный struct, только все перечисленные элементы лежат в одной области памяти. Запись в одну из переменных, соответственно, затрагивает все их.

Кстати, это ещё часто бывает удобно для перевода двухбайтовых переменных в однобайтовые.
Код:
typedef union {
    struct {
        uint8_t a;
        uint8_t b
    };
    uint16_t w;
} Test;

Test t;

t.a = 0x23;
t.b = 0x5A;


Теперь в test.w лежит число 0x5A23;

(тут, конечно нужно учитывать архитектуру - LittleEndian (AVR/ARM(обычно)) и BigEndian (x86). Во втором случае в test.w будет лежать 0x235A

Иногда так проще, чем делать что-то вроде a = (w & 0xFF00) >> 8; b = (w & 0x00FF);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 19:06:36 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2128
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18425
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
WiseLord писал(а):
LittleEndian (AVR/ARM(обычно)) и BigEndian (x86)
так никогда и не мог понять, что кроется за этими индейцами, но уверен на 100500%, что размещение данных в x86 точно такое же, как в AVR - первым идет самый младший байт, затем по старшинству... поэтому у вас явная ошибка в разделении

мотороловские процы отличались порядком размещения байтов, 68ххх кажется, и были нюансы в древнейших ЭВМ, о которых, наверное, и вспоминать не стоит...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт мар 30, 2018 19:24:16 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4891
Откуда: Минск
Рейтинг сообщения: 1
Да, с x86 я, похоже, ошибся.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 00:23:24 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
И снова непонятки :write: вызываю три функции для чтения данных с ds1307 по очереди.
1-функция считывает время.
2-функция считывает дату.
3-регистр настроек.
функция READ_TWR во всех функциях чтения отрабатывает великолепно.считанные данные сохраняются в буфер TWI_buffer
затем функцией memcpy нужно данные перенести в структуру PtrRTC_struct.

Код:
read_Time_RTC();  // 1      
read_Data_RTC();  // 2      
read_status_RTC();// 3


при таком раскладе все ништяг. все данные по порядку переносятся в структуру.
Код:
void read_Time_RTC(void)
{
   READ_TWR(ADDRESS_RTC,0x00,3);
   memcpy(PtrRTC_struct,TWI_buffer,3);
}
void read_Data_RTC(void)
{
   READ_TWR(ADDRESS_RTC,0x03,4);
   memcpy(&(PtrRTC_struct->den_nedeli),TWI_buffer,4);
}
void read_status_RTC(void)
{
    READ_TWR(ADDRESS_RTC,0x07,1);
   memcpy(&(PtrRTC_struct->status_registr),TWI_buffer,1);
}

но я изначально автоматом указатель на структуру в в функции read_Time_RTC для emcpy указал вот так
memcpy(&PtrRTC_struct,TWI_buffer,3);
в общем картина выглядела:
Код:
void read_Time_RTC(void)
{
   READ_TWR(ADDRESS_RTC,0x00,3);
   memcpy(&PtrRTC_struct,TWI_buffer,3);
}
void read_Data_RTC(void)
{
   READ_TWR(ADDRESS_RTC,0x03,4);
   memcpy(&(PtrRTC_struct->den_nedeli),TWI_buffer,4);
}
void read_status_RTC(void)
{
    READ_TWR(ADDRESS_RTC,0x07,1);
   memcpy(&(PtrRTC_struct->status_registr),TWI_buffer,1);
}


при такой записи ни одна функция не переносит данные в структуру, стоит только ликвидировать //read_Time_RTC(); // 1 так остальные начинают выполнять свои обязанности.что за чудное явление? как практически независимые функции взаимосвязаны?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 00:40:27 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4891
Откуда: Минск
Рейтинг сообщения: 1
Судя по "->", PtrRTC_struct - это указатель. на структуру, поэтому в memcpy его нужно без & передавать. Всё нормально.

P.S. А status_registr, например, это уже поле структуры, поэтому его адрес - уже нужно с амперсандом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 01:14:00 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
это указатель.

да это указатель

уже поле структуры
надо это зарубить.... :write: а то вечно сомнения появляются как нужно делать..

Но вопрос меня интересует вот какой, почему если я в одной функции неправильно написал, то и остальные перестают работать, хоть в них все верно написано? где их зависимость?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 08:34:43 
Потрогал лапой паяльник
Аватар пользователя

Карма: 20
Рейтинг сообщений: 121
Зарегистрирован: Вс янв 19, 2014 22:41:55
Сообщений: 353
Рейтинг сообщения: 0
так никогда и не мог понять, что кроется за этими индейцами

Не англосаксы мы - бэкграунд не тот. То не индейцы, а "тупоконечники" и "остроконечники" из известного у них литературного произведения. ;-)

Добавлено after 13 minutes 58 seconds:
Но вопрос меня интересует вот какой, почему если я в одной функции неправильно написал, то и остальные перестают работать, хоть в них все верно написано? где их зависимость?

Нужно не "зарублять" - а понимать физический смысл происходящих операций над данными. Если функции зависят друг от друга - то известно: мусор на входе -> мусор на выходе. Если в конкретном случае "перестать работать" - несобираемость компилятором из-за того, что типы вдруг перестали совпадать - dura compiler, но это его работа - целостность продукта поддерживать.

_________________
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 09:27:16 
Говорящий с текстолитом
Аватар пользователя

Карма: 33
Рейтинг сообщений: 148
Зарегистрирован: Вс июн 24, 2012 16:07:00
Сообщений: 1590
Откуда: Лен.Обл.
Рейтинг сообщения: 1
Цитата:
из известного у них литературного произведения.


Которое знаем и мы. "Путешествия Гулливера". :)

_________________
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб мар 31, 2018 13:32:05 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Нужно не "зарублять" - а понимать физический смысл происходящих операций над данными.
это точно!!!
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 03, 2018 11:43:49 
Друг Кота
Аватар пользователя

Карма: 52
Рейтинг сообщений: 2110
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 7053
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (2)
хочу увеличить наглядность алгоритма конечных автоматов. - т.е. весь код запускается циклично по таймеру, и в зависимости от его внутренних флагов выполняются его различные ветви, чтобы код успел выполниться до следующего запуска из него исключаются циклы и задержки, но задержки нужны, их я изначально делал так
Спойлер
Код:
void GetTemp(void)
 {
 static   unsigned int StepGetTemp = 0;     
 static   unsigned char TermH, TermL;
 switch (StepGetTemp)
  {    /*DelyGetTemp=750*Speed_temp;*/   case 0:              //это разделители, чтобы подпрограмма не выполнялась слишком долго, а перезапускалась и при перезапуске продолжалась с места остановки
   DS18B20_init();                                            // Инициализация DS18B20   
  StepGetTemp=1; DelyGetTemp=0;   break; case 1:                                             
   write_18b20(0xCC);                                         // Проверка кода датчика
  StepGetTemp=2; DelyGetTemp=0;   break; case 2:
   write_18b20(0x44);                                         // Запуск температурного преобразования
  StepGetTemp=3; DelyGetTemp=850*Speed_temp; break; case 3:   // Пауза >750 мс
   DS18B20_init();                                            // Инициализация DS18B20
  StepGetTemp=4; DelyGetTemp=0;   break; case 4:                                           
   write_18b20(0xCC);                                         // Проверка кода датчика
  StepGetTemp=5; DelyGetTemp=0;   break; case 5:
   write_18b20(0xBE);                                         // Считываем содержимое ОЗУ
  StepGetTemp=6; DelyGetTemp=0;   break; case 6:
   TermL = read_18b20();                                      // Читаем младший байт блокнота
  StepGetTemp=7; DelyGetTemp=0;   break; case 7:
   TermH = read_18b20();                                      // Читаем старший байт блокнота     
  StepGetTemp=8; DelyGetTemp=0;   break; case 8:
   //if (Term<0) Term=(-Term)|0x80;                             //Выворачиваем температуру для вывода на экран.
    Temperature=(((TermH<<8)+TermL)*10)>>4;
    if (OK_Flag != 0) {Temperature = -2000; Count=0;};   
    Count+=(~Count)? 1:0;                                    //это моё- счет правильныхъ измерений - для исключения ложных переключений компрессора
  default: StepGetTemp=0;
 DelyGetTemp=1000*Speed_temp;                                //задержка перед следующим измерением 1сек
  };                                                           
 }

//и в коде циклично выполняется
if (DelyGetTemp){DelyGetTemp--;}else{GetTemp();};
если нужна задержка - выходим и пропустив нужное количество запусков заходим и продолжаем с точки, на которой вышли. Получается не очень наглядно,
вот я и пытаюсь сделать этот алгоритм нагляднее: пока вышло так
Спойлер
Код:
#define DelayCoeff 4.096   //количество вызовов за миллисекунду
#define StartDelay(x,t)  if (t) {(t)--;} else {switch (x){case 0:
#define Delay(num,te,x,t)  (x)=(num); (t)=(te)*DelayCoeff; break; case(num):
#define EndDelay(te,x,t) (t)=(te)*DelayCoeff; default: (x)=0;};};


void GetTemp(void)
 {
 static   unsigned int StepGetTemp = 0;     
 static   unsigned char TermH, TermL;
 StartDelay(StepGetTemp,DelyGetTemp)                          //это разделители, чтобы подпрограмма не выполнялась слишком долго, а перезапускалась и при перезапуске продолжалась с места остановки
   DS18B20_init();                                            // Инициализация DS18B20   
  Delay(1,0,StepGetTemp,DelyGetTemp)                                             
   write_18b20(0xCC);                                         // Проверка кода датчика
  Delay(2,0,StepGetTemp,DelyGetTemp)
   write_18b20(0x44);                                         // Запуск температурного преобразования                                         
  Delay(3,850,StepGetTemp,DelyGetTemp)                        // Пауза >750 мс
   DS18B20_init();                                            // Инициализация DS18B20
  Delay(4,0,StepGetTemp,DelyGetTemp)                                           
   write_18b20(0xCC);                                         // Проверка кода датчика
  Delay(5,0,StepGetTemp,DelyGetTemp)
   write_18b20(0xBE);                                         // Считываем содержимое ОЗУ
  Delay(6,0,StepGetTemp,DelyGetTemp)
   TermL = read_18b20();                                      // Читаем младший байт блокнота
  Delay(7,0,StepGetTemp,DelyGetTemp)
   TermH = read_18b20();                                      // Читаем старший байт блокнота     
  Delay(8,0,StepGetTemp,DelyGetTemp)
   //if (Term<0) Term=(-Term)|0x80;                             //Выворачиваем температуру для вывода на экран.   
    Temperature=(((TermH<<8)+TermL)*10)>>4;
    if (OK_Flag != 0) {Temperature = -2000; Count=0;};   
    Count+=(~Count)? 1:0;                                    //это моё- счет правильныхъ измерений - для исключения ложных переключений компрессора
  EndDelay(1000,StepGetTemp,DelyGetTemp)                     //задержка перед следующим измерением 1сек
  };                                                           
 }
 
 //и в коде циклично выполняется
GetTemp();
в дефайнах подстановка:
num- номер задержки по порядку (числовая константа)
te- время задержки (числовая константа)
x и t - служебные переменные (указатель адреса возврата и счетчик задержки)
уже красивее чем было, но до идеала далеко, может, у кого есть варианты поизящней? с удовольствием приму на вооружение :)

_________________
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 03, 2018 11:50:34 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4591
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ivanoff-iv писал(а):
если нужна задержка - выходим и пропустив нужное количество запусков заходим и продолжаем с точки, на которой вышли.

Вы изобретаете велосипед. Возьмите ОСРВ, она сама всё за Вас сделает.

PS: Если Вы уже дошли до подобных алгоритмов - самое время начать юзать ОСРВ. Потом, как говорится - "за уши не оттащишь" :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7702 ]     ... , , , 270, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y