AVR на Си++

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18679
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Еще ни разу не сталкивался с публичными проектами, где применение С++ было бы действительно необходимым, если исключать какие-то внутренние предпосылки программистов личностного характера. Си более чем достаточно.
По-моему, вы маетесь ерундой, стараясь решать простые задачи сложными методами.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

Дело в том что задач создания библиотек с нужным мне в работе функционалом далось решить давно, хотелось бы улучшить. Не так давно сделал вариант с вложенными объектами не через внешний define а через вариативный макрос в самом теле класса. Типа objcts( A a, B b) и тд сколько надо, а он находит всё нужное для включения в цепочку вызова этих объектов. И так не тратиться озу на таблицы и списки между прочим и можно в одной цепочке вызова например вызвать у всех зарегистрированных в ней объектов разных классов методы с одинаковым названием и параметрами.

Про наследование то же не говорить, пробовал, тоже есть траты озу.

Попробую попозже с другого пк скинуть пример, код который что то выдаёт и размер оперативки с полученными командами асма, увидите о чём речь.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="mazda",url="/forum/viewtopic.php?p=3228073#p3228073"]есть вопрос по объектам как их вызывать одного типа как бдто бы они в цепочке но что бы не в цепочке тоесть может их стоит как то хитро разместить на памяти в озу но тогда подскажжите пожлйста как это сделать[/uquote]
Зашел тут в вашу веточку. У меня есть решение - я в обьекте размещаю указатель на обьект того же типа. Во время начальной инициализации я по всех своих обьектах создаю связи через эти указатели. Можно строить деревья, можно кольца. Например есть у нас обьект - страница меню. И есть кнопки вверх, вниз, вправо, влево... я в обьекте имею 4 указателя на другие страницы. В конструкторе пишем такое: nextPagePtr = this; Если нужен переход то при начальной инициализации в указатели прописываем другие страницы.
Если создать кольцо, то можно в простой процедурке допустим опрашивать разные spi слейвы не заморачиваясь с массивами и проверками на конец массива типа if(i > x) i = 0;
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ярослав555 писал(а):У меня есть решение - ...
Это решение давно уже всем известно и используется в односвязных (и не только) списках. Без них списки, в принципе, не возможны.
Достаточно просто погуглить.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3232536#p3232536"]Это решение давно уже всем известно и используется в односвязных (и не только) списках. Без них списки, в принципе, не возможны.
Достаточно просто погуглить.[/uquote]
Да я и не претендую на открытие Америки. Но как я понял, у топик стартера и объекты не одинаковые. Надо описывать преобразование типов... фигня всё это. Я вот своих при любом удобном случае пилю слезать с АВРок на СТМки. Я как программист готов. Только платы переделать. Как только будем новый прибор делать так ультиматум поставлю))) Меня уже достало 2-4к оперативки за неадекватные деньги.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3232513#p3232513"][uquote="mazda",url="/forum/viewtopic.php?p=3228073#p3228073"]есть вопрос по объектам как их вызывать одного типа как бдто бы они в цепочке но что бы не в цепочке тоесть может их стоит как то хитро разместить на памяти в озу но тогда подскажжите пожлйста как это сделать[/uquote]
Зашел тут в вашу веточку. У меня есть решение - я в обьекте размещаю указатель на обьект того же типа. Во время начальной инициализации я по всех своих обьектах создаю связи через эти указатели. Можно строить деревья, можно кольца. Например есть у нас обьект - страница меню. И есть кнопки вверх, вниз, вправо, влево... я в обьекте имею 4 указателя на другие страницы. В конструкторе пишем такое: nextPagePtr = this; Если нужен переход то при начальной инициализации в указатели прописываем другие страницы.
Если создать кольцо, то можно в простой процедурке допустим опрашивать разные spi слейвы не заморачиваясь с массивами и проверками на конец массива типа if(i > x) i = 0;[/uquote]

спасибо за совет, я так делал, сделал как вложенный объект и ставил в любые классы но памяти тратиться больше чем если через макросы делать, так что от этого варианта я отказался

и делал в двх вариантах, один для объектов одного класса и там только указатель, и вариант для цепей объектов разных классов, там ещё хранился адрес функции которая была для каждого класса своя, статическая, принимала адрес объекта, преобразовывала в адрес объекта своего класса и в нём вызывала интерфейсный метод, работает хорохо но память тратит ещё больше
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="mazda",url="/forum/viewtopic.php?p=3232559#p3232559"]сделал как вложенный объект[/uquote]
ну вложенные объекты это не совсем то что я делал. Вы создавали в классе 1 переменные типа класс 2. Я в классе 1 создавал указатель на объект класса 1. У меня оперативка расходовалась на указатель - 1 указатель = +2 байта оперативки. Ну в общем ситуация такова, что если хотим упростить себе работу, то теряем оперативку. Если оперативки мало, то тогда приходится ручками больше писать - тогда уже флеш расходуется. Обычно оперативки у меня 2-4кб, а флеша 32-64кб. Вот и ищу золотую середину.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="mazda",url="/forum/viewtopic.php?p=3232559#p3232559"]спасибо за совет, я так делал, сделал как вложенный объект и ставил в любые классы но памяти тратиться больше чем если через макросы[/uquote]
Если занудствовать, то буквально следуя общепринятой терминологии, "вложенный" объект целиком помещается в объекте, который его включает. Что, согласитесь, слабо напоминает подразумеваемые выше связные списки. Как-то у нас не получается даже сформулировать задачу под которую вы хотите свой код плюсами отрефакторить. :-( Тёмный лес и только волки по кустам с непонятными намерениями шебуршатъ ... :-) Озвучьте "ТЗ" хотя-бы.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

а никто не говорит что у этого дела есть какая-то конкретная цель. Необходимость цели это миф, художественная выдумка если хотите, главное делать, делать много и по крупному, на плюсах.

Добавлено after 19 minutes 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3228875#p3228875"]Еще ни разу не сталкивался с публичными проектами, где применение С++ было бы действительно ... ерундой, стараясь решать простые задачи сложными методами.[/uquote] Лучше и не скажешь.

У меня промышленная техника с прошивками на си++ на аврках, с военной приёмкой, тоесть по вашей логике, даже если я неправильно выбрал язык кто нибудь потом посмотрит и скажет "я видел какие то там аппараты с прошивками на си++, с военной приёмкой и чем то ещё значит так нужно", но это же не так.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="mazda",url="/forum/viewtopic.php?p=3232859#p3232859"]художественная выдумка если хотите, главное делать, делать много и по крупному, на плюсах.[/uquote]
не, выдумку не хотим, знаний хотим, мето́ду хотим с "маркосами" по "вложенным" "объектам" посмотреть-пообсуждать, что рвёт связаные списки как ворона попугая. А по-крупному мы и сами умеем, на 4 гигах-то много ума не надоть.
[заманушливо так] На шаблоны, кстати, не смотрели со своим AVR-ом? ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

шаблоны макросами и создаю, на днях постараюсь показать

Добавлено after 3 minutes 37 seconds:
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3233028#p3233028"]... на 4 гигах-то много ума не надоть...[/uquote]

зачем же вы так передёргиваете и искажаете смысл сказанного мной выше, для разных задач разное железо, и на своём уровне в каждой области можно подойти с умом к решению самых любых задач.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="mazda",url="/forum/viewtopic.php?p=3233302#p3233302"]шаблоны макросами и создаю, на днях постараюсь показать[/uquote]
Я имел ввиду шаблоны не те, которые #define, а те, что template<typename ... >. Последние, кроме как размягчать и клинить [в частности мои] мозги при попытке их осмысления иногда "таки, да" могут приходиться весьма кстати.

[uquote="mazda",url="/forum/viewtopic.php?p=3233302#p3233302"]зачем же вы так передёргиваете и искажаете смысл сказанного мной выше, для разных задач разное железо[/uquote]
Прошу простить великодушно, сентенция самоиронизировала над моими замечаниями про взгляд на мир человека с навесным SDRAM-ом, кой существенно отличается от взгляда располагающего штатными сиротскими килобайтами на всё про всё. И никак не с целью "победить" вас любой ценой.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3233787#p3233787"]Я имел ввиду шаблоны не те, которые #define, а те, что template<typename ... >. Последние, кроме как размягчать и клинить [в частности мои] мозги при попытке их осмысления иногда "таки, да" могут приходиться весьма кстати.[/uquote]

#define - макрос
template - шаблон
именно это я и имел ввиду

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3233787#p3233787"]Прошу простить великодушно, сентенция самоиронизировала над моими замечаниями про взгляд на мир человека с навесным SDRAM-ом, кой существенно отличается от взгляда располагающего штатными сиротскими килобайтами на всё про всё. И никак не с целью "победить" вас любой ценой.[/uquote]

"человек с навесным SDRAM-ом", где он нависает у него? )

Не понял про "победить", я и под ПК с виндой пишу. Как правило в моих проектах есть "верх" и "низ", тоесть ПК и куча мк
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Встал на лапы
Аватара пользователя
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Сообщение CyberVad »

Лучше объясните - на кой чёрт этот замороч с плюсами: классы, наследники, инкапсуляция методов, полиморфизм и прочий бред? Почему нельзя написать просто на си?
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

сейчас попробую намутить пример
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="CyberVad",url="/forum/viewtopic.php?p=3233946#p3233946"]Лучше объясните - на кой чёрт этот замороч с плюсами: классы, наследники, инкапсуляция методов, полиморфизм и прочий бред? Почему нельзя написать просто на си?[/uquote]
Очевидно же, плюсы просто лучше. Даже если на них писать практически как на С, все равно добавляется множество мелких улучшений.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Reflector",url="/forum/viewtopic.php?p=3233964#p3233964"]Очевидно же, плюсы просто лучше. Даже если на них писать практически как на С, все равно добавляется множество мелких улучшений.[/uquote]



createpad(HC595_CLK, C,0);
createpad(HC595_DATA, C,1);
createpad(HC595_LOAD, C,2);

volatile void HC595(unsigned char output_data)
{
unsigned char i = 0;

for( i = 0 ; i<8 ; i++ )
{
HC595_DATA( _write , tst_ram_flag( output_data , i ) );
HC595_CLK( _write , _L );
HC595_CLK( _write , _H );
};

HC595_LOAD( _write , _L );
HC595_LOAD( _write , _H );

return;
}

unsigned char count = 0;

thread
(
HC595_thread,
1,
,
{
HC595( ++count == 255 ? ({ count = 0; 255; }) : count );
PORTA = count;
};
);

int main(void)
{
cli();
adc_calibration_state=2;
inition;
sei();

while(1)
{
system;
}
}



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

bool sin_vH;
bool pwm_abel_request;
bool pwm_abel_status;
bool pwm_request;
bool pwm_status;

_param(param_access::no,pwm_en,on,_p_var(off););
_param(param_access::no,pwm_state,on,_p_var(off););

#define LCD_RS 1


long temp_voltage = 0;
_expresion(float,voltage,0.0);
_expresion(float,F_voltage,0.0);

long temp_current = 0;
_expresion(float,F_current,0.0);

float F_voltage_medin_buffer=0.0;
_expresion(float,F_voltage_medin,0.0);

float F_current_medin_buffer=0.0;
_expresion(float,F_current_medin,0.0);

unsigned char f_vcm_counter=0;

_expresion(float,power,0.0);

_expresion(unsigned char,f_source,0);
_flash_text_array(f_source_txt,f_source,{ fta(0,"USER"); fta(1,"CALC"); });

const unsigned int user_min_f = 2000;
const unsigned int user_max_f = 20000;

_volume(unsigned int,start_f,user_max_f);

_volume(unsigned int,frequnce_tune_step,20);

_expresion(unsigned int,user_f,0);
_expresion(unsigned int,calc_f,0);
_expresion(unsigned int,work_f,0);

unsigned int last_work_f=0;

inline void f_init()
{
user_f = start_f.eep();
calc_f = start_f.eep();
work_f = start_f.eep();
return;
};

_volume( float,power_hysteresis_level, 10.0);
_expresion( float,power_handler, 0.0);

_volume(float, user_q,50);
_volume(unsigned int, t_work,50);
_volume(unsigned int, t_pause,50);
inline void t_pause_q_calc(){t_pause=(unsigned int)(((float)t_work.ram())/10.0+((float)t_work.ram())*(100.0/user_q.ram()-1.0));return;}
inline void t_pause_q_init(){t_pause_q_calc();call_line(save);global_data_change=0;return;}

_volume(unsigned long,t1,1000);
_volume(unsigned long,t2,1000);
_volume(unsigned long,t3,1000);
_volume(unsigned long,t4,1000);
_volume(unsigned long,t5,1000);

create_adc(sens_v,0,aaa,1);
create_adc(sens_c,1,aaa,1);
createpad( v_cap_reset_extern_call,A,2);
createpad(shutdown_out,A,3);
create_adc(sens_w,5,aaa,20);
createpad(pl1,A,6);
createpad(pl2,A,7);
createpad( v_cap_reset,B,7);

createpad(d4p,B,0);
createpad(d5p,B,1);
createpad(d6p,B,2);
createpad(d7p,B,3);
createpad(enp,B,4);
createpad(rwp,B,5);
createpad(rsp,B,6);

createpad( Q6,C,4);
createpad( Q5,C,3);
createpad( Q4,C,2);
createpad( Q3,C,1);
createpad( Q2,C,0);
createpad( Q1,D,7);
createpad(relay_led,D,4);
createpad(pwm_led,D,6);

#define main_interface_draw_thread_input_block \
input(shutdown_external_request, A,4,true,0);\
input(_external_calibration_mode, D,0,true,0);\
input(_up, D,1,true,0);\
input(_right, D,2,true,0);\
input(_pwm_switcher, D,3,true,0);\
input(_relay_switcher,D,5,true,0);\
input(_centr, C,5,true,0);\
input(_down, C,6,true,0);\
input(_left, C,7,true,0);\

create_flag(qprog_request);
create_flag(qprog_abel_request);
create_flag(qprog_abel_status);
create_flag(qshutdown_request);
create_flag(qshutdown_ready);
unsigned char qvar=0;
unsigned char qsvar=0;
inline void qprogcall(){_set_flag(qprog_request);return;}
create_timer(qtimer,qprogcall,0);
inline void qtimer_init(){qtimer.time=10;return;}

inline void q_disable_prog(){ Q1(_write,_L);Q2(_write,_L);Q3(_write,_L);Q4(_write,_L);Q5(_write,_L);Q6(_write,_L);return;}

inline void work_t1_prog(){ /*Q1(_write,_H);Q2(_write,_L);Q3(_write,_L);Q4(_write,_H);Q5(_write,_H);Q6(_write,_H);*/return;}
inline void work_t2_prog(){ Q1(_write,_H);Q2(_write,_L);Q3(_write,_L);Q4(_write,_L);Q5(_write,_H);Q6(_write,_H);return;}
inline void work_t3_prog(){ Q1(_write,_L);Q2(_write,_H);Q3(_write,_H);Q4(_write,_L);Q5(_write,_H);Q6(_write,_H);return;}
inline void work_t4_prog(){ Q1(_write,_L);Q2(_write,_L);Q3(_write,_H);Q4(_write,_L);Q5(_write,_H);Q6(_write,_L);return;}

inline void shutdown_t1_prog(){ Q1(_write,_H);Q2(_write,_L);Q3(_write,_L);Q4(_write,_H);Q5(_write,_L);Q6(_write,_H);return;}
inline void shutdown_t2_prog(){ Q1(_write,_H);Q2(_write,_L);Q3(_write,_L);Q4(_write,_L);Q5(_write,_L);Q6(_write,_H);return;}
inline void shutdown_t3_prog(){ Q1(_write,_L);Q2(_write,_H);Q3(_write,_H);Q4(_write,_L);Q5(_write,_L);Q6(_write,_H);return;}
inline void shutdown_t4_prog(){ Q1(_write,_L);Q2(_write,_L);Q3(_write,_H);Q4(_write,_L);Q5(_write,_L);Q6(_write,_H);return;}
inline void shutdown_t5_prog(){ Q1(_write,_L);Q2(_write,_H);Q3(_write,_L);Q4(_write,_H);Q5(_write,_L);Q6(_write,_L);return;}

inline void qprog_process()
{
if(_tst_flag(qprog_request))
{
_clr_flag(qprog_request);
if(_tst_flag(qprog_abel_request))
{
_set_flag(qprog_abel_status);
}
else
{
_clr_flag(qprog_abel_status);
}

if(_tst_flag(qprog_abel_status))
{
relay_led(_write,_H);
if(_tst_flag(qshutdown_request))
{
switch(qsvar)
{
case 0:{qtimer.time=t1.eep();shutdown_t1_prog();qsvar=1;break;}
case 1:{qtimer.time=t2.eep();shutdown_t2_prog();qsvar=2;break;}
case 2:{qtimer.time=t3.eep();shutdown_t3_prog();qsvar=3;break;}
case 3:{qtimer.time=t4.eep();shutdown_t4_prog();qsvar=4;break;}
case 4:{qtimer.time=t5.eep();shutdown_t5_prog();qsvar=5;break;}
case 5:{_set_flag(qshutdown_ready);break;}
}
}
else
{
switch(qvar)
{
case 0:{qtimer.time=t1.eep();work_t1_prog();qvar=1;break;}
case 1:{qtimer.time=t2.eep();work_t2_prog();qvar=2;break;}
case 2:{qtimer.time=t3.eep();work_t3_prog();qvar=3;break;}
case 3:{qtimer.time=t4.eep();work_t4_prog();qvar=4;break;}
case 4:{qtimer.time=t1.eep();work_t1_prog();qvar=1;break;}
}
}
}
else
{
qtimer.time=5; relay_led(_write,_L); q_disable_prog(); if(_tst_flag(qshutdown_request))_set_flag(qshutdown_ready);
}
}
return;
};
unsigned char v_cap_charging_pause=0;

void lcd_port_output2(unsigned char data)
{
rsp(_write,getbit(data,0));
rwp(_write,getbit(data,1));
d4p(_write,getbit(data,4));
d5p(_write,getbit(data,5));
d6p(_write,getbit(data,6));
d7p(_write,getbit(data,7));
enp(_write,1);_delay_us(200);
enp(_write,0);_delay_us(200);
return;
}

void lcd_reset(void) { lcd_port_output2(0xFF); lcd_port_output2(0x30); lcd_port_output2(0x30); lcd_port_output2(0x30); lcd_port_output2(0x20); return; }
void lcd_cmd(char cmd) { lcd_port_output2(cmd & 0xF0); lcd_port_output2((cmd << 4) & 0xF0); return; }
void lcd_init (void) { lcd_reset(); lcd_cmd(0x28); lcd_cmd(0x0C); lcd_cmd(0x06); lcd_cmd(0x80); return; }
void lcd_data(unsigned char dat) { lcd_port_output2((dat & 0xF0)|LCD_RS); lcd_port_output2(((dat << 4) & 0xF0)|LCD_RS); return;}

unsigned char lcd16x2( char*buffer,char*canvas,unsigned char x_size,unsigned char n )
{
char s=0;
if( (s=buffer[n]) != canvas[n] ) {canvas[n]=s; lcd_cmd(0x80+n);lcd_data(s);};
if( (s=buffer[n+16]) != canvas[n+16] ) {canvas[n+16]=s; lcd_cmd(0xc0+n);lcd_data(s);};
if(n<x_size-1)n++; else n=0;
return n;
}

template<unsigned char x_size,unsigned char y_size>class lcd_display
{
public:
const static unsigned int canvas_size=x_size*y_size;
char*buffer;
char canvas[canvas_size];
unsigned char n;
const unsigned int format=x_size*100+y_size;

lcd_display(char*set_buffer)
{
buffer = set_buffer;
n = 0;
for(unsigned char i = 0;i<canvas_size;i++)canvas=0;
}
void layout()
{
switch(format)
{
case 1602:{n=lcd16x2(buffer,canvas,x_size,n);break;}
};
return;
};
};
inline void pwm_timer_callback();

create_timer(pwm_work_timer,pwm_timer_callback,0);

inline void pwm_timer_callback()
{
if(pwm_en.on())
{
pwm_en.set_off();
pwm_work_timer.time = t_pause.eep();
}
else
{
pwm_en.set_on();
pwm_work_timer.time = t_work.eep();
}
return;
}

inline volatile void PWM_release()
{
static unsigned char pwm_var = 0;

if( pwm_en.on() ) switch(pwm_var)
{
case 1:{ pwm_var=0; pl2(_write,_L);pl1(_write,_H); break;}
case 0:{ pwm_var=1; pl1(_write,_L);pl2(_write,_H); break;}
}
else
{
pl2(_write,_L);pl1(_write,_L);
}
return;
}

create_line_point(second_fst,_pwm_release,PWM_release(););

inline void relay_process_init(){if(v_cap_reset_extern_call(_read,_H)!=0)sin_vH=true;else sin_vH=false;return;}

inline void relay_process()
{

if( sin_vH )
{
if(v_cap_reset_extern_call(_read,_H)==0) { sin_vH = false; qprog_process(); }
}
else
{
if(v_cap_reset_extern_call(_read,_H)!=0) { sin_vH = true; qprog_process(); }
}

return;
}


unsigned char ps=0;
thread(tick_thread,1,,{v_cap_charging_pause++; ps++;});
thread(scan_thread,2,,{call_line(scan);});

enum
{
list_win,
control_win,
work_programm_win,
relay_win
};

void main_save_interface();

unsigned char main_menu(unsigned char page);
unsigned char work(unsigned char);
window(main_window,main_menu,control_win,16,2,10,main_save_interface,work);

lcd_display<16,2> main_lcd_display(main_window.local_buffer);

thread(main_interface_layout_thread,3,, { main_lcd_display.layout(); } );

thread(main_interface_draw_thread,40,
main_interface_draw_thread_input_block
,
{
adc_status_request = adc_work;
call_line(display_use);
if( adc_status_request == adc_calibration ) adc_status=adc_calibration; else adc_status=adc_work;
}
);

void main_save_interface()
{
emsg( main_window, save_interfacing, 1,
if(_left.click()) window_core::left_cursor();
if(_right.click()) window_core::right_cursor();
tf("YES", 0, 2,0,0,1,left)
{
if(_centr.click())
{
call_line(save);
ems_esc=true;
};
};
tf("SAVE?", 6,10,0,0,0,left);
tf("NO", 14,15,0,0,1,right)
{
if(_centr.click())
{
call_line(init);
ems_esc=true;
}
};
);
return;
}
bool shutdown_request=false;
inline void shutdown_process()
{
_set_flag(qshutdown_request);
if(_tst_flag(qshutdown_ready)) { shutdown_out(_write,_H); while(1); }
return;
}

inline unsigned char work(unsigned char page)
{
if(_pwm_switcher.click())
{
if(pwm_en.off())
{
pwm_en.set_on();
pwm_work_timer.time = t_work.eep();
pwm_work_timer.wake();
pwm_led(_write,_H);
}
else
{
pwm_en.set_off();
pwm_work_timer.slep();
pwm_led(_write,_L);
};
};

if(_relay_switcher.click()) _inv_flag(qprog_abel_request);

if(shutdown_external_request.click()){relay_led(_write,_H); shutdown_request=true;}

if(shutdown_request)shutdown_process();

return page;
}

unsigned char main_menu(unsigned char page)
{
switch(page)
{
case list_win:
{
window_core::set_zdepth(1);
window_core::storing_page_position(memory<list_win,4>());
window_core::set_content_dimentions(0,0,window_core::x_win_size,window_core::y_win_size);

window_core::window_list_style();
if( _up.click() ) window_core::up_window(1);
if( _down.click() ) window_core::down_window(1);

tf(" Control", 0,15,0,0,1,left){if( _centr.click() ) page = control_win; };
tf(" Config", 0,15,1,0,1,left){if( _centr.click() ) page = work_programm_win; };
tf(" Relay", 0,15,2,0,1,left){if( _centr.click() ) page = relay_win; };

break;
};
case control_win:
{
window_core::set_zdepth(0);
window_core::set_content_dimentions(0,0,window_core::x_win_size,window_core::y_win_size);
window_core::set_field_absolute_style();
window_core::cursor_set_flash_state( 0 );

if( _centr.click() ) page = list_win;

if(_up.click())f_source=0;
if(_down.click())f_source=1;
if(f_source.ram()==0)user_f=conf<unsigned int>(user_f.ram(), (unsigned int)1560, (unsigned int)2000, (unsigned int)20000, _right.click(), _left.click());
tf(power_handler, 0, 3,0,0,0,left);
tf(power, 0, 3,1,0,0,left);
tf(f_source_txt, 5,10,0,0,0,left);
tf(work_f, 5,10,1,0,0,left);
tf(F_voltage_medin, 11,15,0,0,0,left);
tf(F_current_medin, 11,15,1,2,0,left);

break;
};
case work_programm_win:
{
window_core::set_zdepth(0);
window_core::set_content_dimentions(0,0,window_core::x_win_size,window_core::y_win_size);
window_core::window_list_style();
if( _up.click() ) window_core::up_window(1);
if( _down.click() ) window_core::down_window(1);
if( _centr.click() ) page = list_win;

tf(" Quality", 0, 9,0,0,1,left){ user_q=conf<float>(user_q.ram(), 5, 5, 100,_right.click(),_left.click()); t_pause_q_calc(); };
tf(user_q, 11,15,0,0,0,right);
tf(" Pause Time ms", 0, 9,1,0,1,left);{ t_pause=conf<unsigned int>(t_pause.ram(), 7, 5, 60,_right.click(),_left.click()); if(global_data_change==0)global_data_change=1; };
tf(t_pause, 11,15,1,0,0,right);
tf(" Work Time ms", 0, 9,2,0,1,left){ t_work=conf<unsigned int>(t_work.ram(), 7, 5, 60,_right.click(),_left.click()); t_pause_q_calc(); };
tf(t_work, 11,15,2,0,0,right);
tf(" P hysteresis", 0, 9,3,0,1,left){ power_hysteresis_level=conf<float>(power_hysteresis_level.ram(), 5.0, 5.0, 200.0,_right.click(),_left.click()); };
tf(power_hysteresis_level, 11,15,3,0,0,right);
tf(" F step", 0, 9,4,0,1,left){ frequnce_tune_step=conf<unsigned int>(frequnce_tune_step.ram(), 50, 0, 2000,_right.click(),_left.click()); };
tf(frequnce_tune_step, 11,15,4,0,0,right);
tf(" F start", 0, 9,5,0,1,left){ start_f=conf<unsigned int>(start_f.ram(), 50, user_min_f, user_max_f,_right.click(),_left.click()); };
tf(start_f, 11,15,5,0,0,right);
break;
};
case relay_win:
{
window_core::set_zdepth(0);
window_core::set_content_dimentions(0,0,window_core::x_win_size,window_core::y_win_size);
window_core::window_list_style();
if( _up.click() ) window_core::up_window(1);
if( _down.click() ) window_core::down_window(1);
if( _centr.click() ) page = list_win;

tf(" Time 1", 0, 9,0,0,1,left){ t1=conf<unsigned long>(t1.ram(), 1000, 1000, 100000,_right.click(),_left.click()); };
tf(t1, 11,15,0,0,0,right);
tf(" Time 2", 0, 9,1,0,1,left){ t2=conf<unsigned long>(t2.ram(), 1000, 1000, 100000,_right.click(),_left.click()); };
tf(t2, 11,15,1,0,0,right);
tf(" Time 3", 0, 9,2,0,1,left){ t3=conf<unsigned long>(t3.ram(), 1000, 1000, 100000,_right.click(),_left.click()); };
tf(t3, 11,15,2,0,0,right);
tf(" Time 4", 0, 9,3,0,1,left){ t4=conf<unsigned long>(t4.ram(), 1000, 1000, 100000,_right.click(),_left.click()); };
tf(t4, 11,15,3,0,0,right);
tf(" Time 5", 0, 9,4,0,1,left){ t5=conf<unsigned long>(t5.ram(), 1000, 1000, 100000,_right.click(),_left.click()); };
tf(t5, 11,15,4,0,0,right);
break;
};
};
return page;
};

bool ready_cv =false;
unsigned char var2=0;
const float vcc = 5.0;
const float adc_lim = 1024.0;
const float adc_smoos_level = 1.0;
const float diod_drop_v = 0.42;
const float c_schem_base = 2.28;
const float c_orig_max = 20.0;
const float c_schem_equal_max = 2.0;
const float c_schem_calib_base = 0.0;
const float c_schem_calib_angle = 1.0;
const float v_schem_base = 2.5;
const float v_orig_max = 311.12;
const float v_schem_equal_max = 1.92;
const float v_schem_calib_base = 0.0;
const float v_schem_calib_angle = 0.972;
bool access_w=false;
void calc()
{
bool ready_v = sens_v.ready(),ready_c = sens_c.ready(),ready_w = sens_w.ready();
if(ready_w){access_w=true; power_handler = sens_w.readbyte()*2000.0*5.0/1024.0/20.0/5.0;}

if(ready_c && ready_v) ready_cv=true;

if( ( ready_c || ready_v ) && ready_cv)
{
switch(var2)
{
case 10:
{
if(ready_v && ready_c)
{
temp_voltage = sens_v.readbyte(); temp_current = sens_c.readbyte();
float tv = (float)temp_voltage*vcc/(adc_lim*adc_smoos_level) + diod_drop_v - v_schem_base; if(tv<0.0)tv=0.0;
float tc = (float)temp_current*vcc/(adc_lim*adc_smoos_level)-2.2; if(tc<0.0)tc=0.0;

F_voltage = (((tv*v_orig_max/v_schem_equal_max))*v_schem_calib_angle)*0.707106+v_schem_calib_base;
F_current = ((6.0*tc/(3.575-2.2))+0.08)*0.94;

power = F_voltage.ram()*F_current.ram();

if(access_w)
{
float delta=power.ram()-power_handler.ram();
if( delta > power_hysteresis_level.eep() )
{
if(calc_f.ram()<user_max_f) calc_f=calc_f.ram()+frequnce_tune_step.eep();
}
else
{
if( (delta*(-1.0)) > power_hysteresis_level.eep() )
{
if(calc_f.ram()>user_min_f) calc_f = calc_f.ram()-frequnce_tune_step.eep();
if(calc_f.ram()<user_min_f) calc_f = user_min_f;
}
}
}
if(f_source.ram()==0)work_f = user_f.ram(); if(f_source.ram()==1)work_f = calc_f.ram();

if(work_f.ram()!=last_work_f){last_work_f=work_f.ram();timer1_steps_to_do_exesys_from_frequence(work_f.ram());}

var2 = 0;
}
break;
}
case 0: { if(v_cap_reset_extern_call(_read,_H)==0){var2=2;v_cap_reset(_write,_H);ps=0;} break; }
case 2: { if(ps>0){var2=4;v_cap_reset(_write,_L);}break;}
case 4: { if(v_cap_reset_extern_call(_read,_H)!=0){var2=5;v_cap_charging_pause=0;}break;}
case 5: { if(v_cap_charging_pause>24){ sens_v.readbyte();sens_c.readbyte(); var2=10;}break;}
}
}
f_vcm_counter++;
F_voltage_medin_buffer=F_voltage.ram()+F_voltage_medin_buffer;
F_current_medin_buffer=F_current.ram()+F_current_medin_buffer;
if(f_vcm_counter>250)
{
f_vcm_counter=0;
F_voltage_medin=F_voltage_medin_buffer*0.004;F_voltage_medin_buffer=0.0;
F_current_medin=F_current_medin_buffer*0.004;F_current_medin_buffer=0.0;
}

return;
}
thread(calc_thread,2,,{ calc(); });

int main(void)
{
cli();
setbit(sh_cp,sh_cp_pin,1);
setbit(st_cp,st_cp_pin,0);
setbit(ddr_sh_cp,sh_cp_pin,1);
setbit(ddr_st_cp,st_cp_pin,1);
setbit(ddr_ds, ds_pin, 1);
DDRA=0b00000000;
PORTA=0b00000000;
DDRB=0b11111111;
DDRD=0b11111110;
adc_calibration_state=2;
//call_line(init);
t_pause_q_init();
f_init();
relay_process_init();
qtimer_init();
lcd_init();
pwm_en.set_off();
pwm_work_timer.slep();
//timer0_init();
//timer1_init();
//call_line(system_init);
//call_line(init);
//call_line(system_interrupt_init_fast_access);
timer1_steps_to_do_exesys_from_frequence(1000);
inition;
sei();

sens_c.enable();
sens_v.enable();
sens_w.enable();
while(1)
{
system;
adc_entering_point;
relay_process();
}
}

Добавлено after 7 minutes 50 seconds:
сишники не прочтут


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

const unsigned int adc_pos_in_smooth = 50;
create_adc(adc_pos_in,2,aaa,adc_pos_in_smooth);

createpad(ap,B,5);
createpad(am,A,3);
createpad(bp,B,7);
createpad(bm,A,4);
createpad(h_pwm,B,6);

#ifdef __y_axis
#define DCmotor_template DCmotor3
#else
#define DCmotor_template DCmotor2
#endif

DCmotor_template<ap,am,bp,bm,h_pwm,
_external_pwm,
_external_pos,
_stopebal,
_power_limited_by_pos,
_auto_fix_en,
_forw_fix_at_stop,
_back_fix_at_stop,
_fix_by_dir_acc,
_tune_stay_velocity,
_ir_hesteresis,
_tune_ir_offset,
_tune_power_min,
_tune_power_max,
_tune_power_stb_min,
_tune_power_stb_max,
_tune_power_stb_back_min,
_tune_power_stb_back_max,
_tune_power_fix_at_stop,
_ready_feet,
_tune_top_settle_level,
_tune_bot_settle_level,
caret_stoper,
caret_stoper_power,
caret_reterner_pos,
forw_caret_reterner_power,
back_caret_reterner_power,
caret_reterner_velocity,
tune_power_slice,
tune_power_down,
_measuring_velocity_step_uM,
_power_by_velocity,
_tune_power_forw,
_tune_power_back,
_reversed,
_steped_targeting,
_stop_at_vibrating,
_vibrating_level,
_spetial_dir_acc_at_fix,
_vibrtion_power_limiter_en,
_returner_power_limiter_en,
_target_power_stab_append_en,

_fh_en,
_tune_fh,
_bh_en,
_tune_bh,

_vbr_acc,
_vbr_offtime_acc,
_tune_vbr_offtime_pwr_plus_acc,
_step_en,
_step_dis,
_st_pw_acc,
_unvbr_acc,
_vel_access,
_dir_access,
_fix_dir_access,
_timer_to_fix_dir_access,
_pow_access,
_stay_access,
_feel_stay_acc,

_end_switch_en,
_forw_switch_en,
_back_switch_en,
_forw_calibrate_standart,
_back_calibrate_standart,
_forw_end_switch_active_level,
_forw_end_switch_pull,
_forw_end_switch_pad,
_back_end_switch_active_level,
_back_end_switch_pull,
_back_end_switch_pad
>motor(true);

signed long int __temp = 0;

___B8B( bus,
a0, atmega32_dip40_pin26,
a1, atmega32_dip40_pin27,
a2, atmega32_dip40_pin28,
a3, atmega32_dip40_pin28,
d0, atmega32_dip40_pin20,
d1, atmega32_dip40_pin19,
d2, atmega32_dip40_pin18,
d3, atmega32_dip40_pin21,
d4, atmega32_dip40_pin22,
d5, atmega32_dip40_pin23,
d6, atmega32_dip40_pin24,
d7, atmega32_dip40_pin25,
mosi, atmega32_dip40_pin33,
miso, atmega32_dip40_pin34,
type, atmega32_dip40_pin35,
_address,
B8B_DEVICE_TYPE::slave,
_slave ( DCM_B8B_PORT::target , __temp is_signed_long_from_master; motor.new_target = __temp; motor.target_updated=true; motor.target_busy=true; PORTB|=1; )
_slave ( DCM_B8B_PORT::calibr , motor.standart_calibrate(); PORTB&=~1; )
,
_slave ( DCM_B8B_OUT::flags , B8B_slave_say ( motor.flags() ); motor.target_updated=false; )
//_slave ( DCM_B8B_OUT::flags , B8B_slave_say ( motor.flags()&~1 ); motor.target_updated=true; )
);

signed long int adc_byteresult_k = 2;//102 / adc_pos_in_smooth;

float adc_voltge_k = 2222.2222;

inline void ext_adc_pos()
{
if( adc_pos_in.ready() )
{
float temp = adc_pos_in.read();//напряжение
signed long int pos = (signed long int)( temp*adc_voltge_k );
motor.ir( pos );
}
return;
}


#ifndef __z_axis
createpad(encoder_a,D,2);createpad(encoder_b,D,3);encoder<encoder_a,encoder_b>pos_encoder(true);
//create_line_point(int0call,int0_le_,if( !_adc_pos ){ pos_encoder.int0f(); }; );
//create_line_point(int1call,int1_le_,if( !_adc_pos ){ pos_encoder.int1f(); }; );
create_line_point(int0call,int0_le_,if( !_adc_pos ){ pos_encoder.scan(); }; );
create_line_point(int1call,int1_le_,if( !_adc_pos ){ pos_encoder.scan(); }; );
#endif

create_line_point(system_loop, motor_run, motor.r2(); );
create_line_point(system_loop, adc_run, if( _adc_pos ){ ext_adc_pos(); });
create_line_point( main_fst, _pwm, motor.tick=true; motor.exesys_frequence = main_fst_frequence; );
create_line_point(second_fst, _pwm, motor.PWM(); );


thread(standart_system_thread_bus8_entering_point,2,, bus8_entering_point; );

void ir(signed long int pos){motor.ir(pos);return;}
void ir_(signed long int pos){return;}
int main(void)
{
cli();
//interrupt0disable();//не использовать с pos_encoder.scan();
//interrupt1disable();//не использовать с pos_encoder.scan();
#ifndef __z_axis
if( !_adc_pos )pos_encoder.ir=ir; else pos_encoder.ir=ir_;
#endif
DDRB|=2;
adc_calibration_state=1;
if( _adc_pos ) adc_pos_in.enable();
inition;
bus.set_address(_address);
sei();
while(1)
{
system;
}
}
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="mazda",url="/forum/viewtopic.php?p=3233966#p3233966"]сишники не прочтут[/uquote]
Если рекламируешь язык, нужно было подобрать маленький, но емкий пример, чтобы сишники прочли и подумали, что тоже так хотят, даже если не до конца понимают что там происходит :)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Reflector",url="/forum/viewtopic.php?p=3233976#p3233976"]Если рекламируешь язык[/uquote]
Не рекламирую.

[uquote="Reflector",url="/forum/viewtopic.php?p=3233976#p3233976"]нужно было подобрать маленький, но емкий пример[/uquote]
Первый пример, другие скинуть не могу ввиду их актуальности в работе, аписать специально пример нет времени, но постараюсь.


[uquote="Reflector",url="/forum/viewtopic.php?p=3233976#p3233976"]чтобы сишники прочли и подумали, что тоже так хотят[/uquote]
Не захотят, кто захотел давно изучили и используют.


Про "сишники не поймут", это же просто подколка такая, хотя вы всё равно не поймёте.

Думаю читать никто и не станет, сделают как всегда, не прочтут не разберутся а просто напишут "всё нет, под мк правильно писать на си и всё тут", это уже дело пройденное.

Добавлено after 35 minutes 39 seconds:
Ivanoff-iv не поймёт пятую строку в третьем примере
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="mazda",url="/forum/viewtopic.php?p=3233966#p3233966"]

Код: Выделить всё

#ifdef __y_axis
	#define DCmotor_template DCmotor3
#else
	#define DCmotor_template DCmotor2
#endif

DCmotor_template<
	ap,
	am,
	bp,
	bm,
	h_pwm,
	_external_pwm,
	_external_pos,
[...]
	_back_end_switch_pull,
	_back_end_switch_pad>
motor(true);
[/uquote]

[Надеясь, что ДЦМотор2 и ДЦМотор3 реальные шаблоны а не выхлоп препроцессора] Шаблоны ДЦМотор2 и ДЦМотор3 настолько абсолютно разные, что 2 и 3 не могли стать 78-ым параметром, позволив частично специализировать реально отличающийся функционал? Хотя, конечно, при списочном составе параметров количеством в пол-роты о специализации страшно и помышлять. Каждый из 77-и реально настолько вариативен, что заслужил честь быть в этом списке?
Шаблоны С++ они ведь как дети - как маленькие так классные и прикольные, но имеют тенденцию быстро расти, а уж как подрастают - превращаются в несносных, неуправляемых негодяев.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

Вернуться в «AVR»