Перейти к содержанию

Склейка переменных типа int в си в CodevisionAVR


Рекомендуемые сообщения

Здравствуйте форумчане.

 


Крайне редко прибегаю к форумам.
Но тут у меня возник вопрос с Си в CodevisionAVR.

Как в этом "туземском" редакторе склеить две переменные int типа.
VisualStudio и CodevisionAVR - оказалось две разные вещи.  Хоть CodevisionAVR  и опирается на AtmelStudio который почти клон VisualStudio - но результаты и ошибки разные.
К примеру (для наглядной универсальности):

Есть переменная (пустся) - set_temp, после нажатия кнопки (выборки результата) - res_button результат заноситься в временную переменную - tmp_temp которая записывает в set_temp.
После set_temp выводиться и повторное нажатие res_button результат как-бы сдвигается.

Грубо говоря клавиатура посимвольного ввода но не с сдвигом влево, а изменением переменной (пошагово):
- нажата 1 - set_temp = 1
нажата 5 - set_temp = 15
нажата 0 - set_temp = 150
нажата 1 - set_temp = 1501

int set_temp;
int res_button;
int tmp_temp;

Нужно что-бы:

set_temp = tmp_temp;
set_temp = res_button (оператор склеивания) tmp_temp;

Ну а потом - sprintf(lcd_buffer,"%d ", set_temp); с набранными 1501

И как это правильно реализовать. Думаю ЧТО очень глупо для этого функции реализовывать.
Пытался я порыться по справочникам Си - многих операторов не увидел (как обычно справочники - не больше чем реклама). В импортных напарывался scanf("%h", count); %h - hex как оказалось, компилятор не ругается но и не выводит результат (из-за моего не правильного подхода). Что это и как его использовать потом разберусь.



Этот язык для меня вообще новый.
В php просто ставим . между переменными. В поисковике мне вообще втирают за тип char или функцию рисовать. С этим калькулятор справляется успешно.... а мне тут поисковик о функциях поет.

Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, Yurkin2015 сказал:

set_temp = res_button +10 * tmp_temp;

Наверное я что-то не правильно делаю.  У меня замещается. Значит я где-то накосячил.

А еще.... Отличный пример для понимания - компилятор выполняет слева на право / сверху вниз, Или математические правила учитывает сначала умножение и деление - потом добавление и вычитание (внезависимости от перестановки)?

Все-таки - это "шайтан-ящик".

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, 3_izmerenie сказал:

Хоть CodevisionAVR  и опирается на AtmelStudio который почти клон VisualStudio - но результаты и ошибки разные.

Покажите что делаете и какие ошибки выдаёт компилятор. Иначе будем очень долго гадать, что для Вас означает "склеить".

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 минуты назад, Alex сказал:

Покажите что делаете и какие ошибки выдаёт компилятор. Иначе будем очень долго гадать, что для Вас означает "склеить".

Делаю термостат (в селе в конюшню) для поддержания  нужной температуры - ну и параллельно учусь

 

#include <mega8.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <delay.h>
#include <alcd.h>
#include <math.h>

#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm

#define xtal 8000000L

//******* Глобальные переменные ******* 
char lcd_buffer[16]; //Буфер обмена LCD
char lcd_buffer1[16]; //Буфер обмена LCD

int result;            //Переменная хранения данных ADC0
int result_cl;         //Переменная хранения данных ADC1


int time_nav=0;
int temp_nav=0;
int prog_nav=0;

//  n,set_vr,set_temp,nav_left,nav_right,
//left=349,right=216,   res_p,set_temp,temp_temp,
int 
nav=0,nav_vr,nav_temp,

res_p,temp_temp,set_temp,

sets=416,ok=265,up=301,down=238,left=349,right=216,

but_1=197,but_2=149,but_3=121,but_4=182,but_5=141,but_6=116,
but_7=170,but_8=134,but_9=111,but_0=159,but_p=127,but_s=107;

//short int time[5]={0};  //  Массив времени
//short int i;             //  Массив времени

//short int temp[5]={0};  //  Массив температуры (режим времени)
//short int j;             //  Массив температуры (режим времени)

//short int res_p;         //результат клавиатуры
//short int nav_b;         //результат клавиатуры

char str[16];
char str1[16];

char *time="Bpm ";
char *temp="Tmp ";
char *prog="Prog ";

char *time_s="Bpm_s ";
char *temp_s="Tmp_s ";
char *prog_s="Prog_s ";

//char *set_empty="";

//char *ok="Ok";
char *reset="Reset ";
char *res_temp="Temps ";
       

int m=0; // Навигация лево - право
int i;

//********* Переменные ADC *********** 
#define FIRST_ADC_INPUT 0     //Первый кнал ADC ADC0
#define LAST_ADC_INPUT 1      //Следующийй канал ADC ADC1
#define ADC_VREF_TYPE 0x00
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; //Переменная хранения ADC данных
 

unsigned char input_index=0;

//*** Обслуживания прерывания для автоматического сканирования каналов ***
interrupt [ADC_INT] void adc_isr(void) 
    {
        //register static unsigned char input_index=0;
        adc_data[input_index]=ADCW; //Чтение результата АЦП преобразования
        if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) //Селективный выбор 
           input_index=0;                                     //следующего входа АЦП
        ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
        delay_us(10);  //Выдержка времени для стабилизации входного напряжения
        ADCSRA|=0x40; //Старт АЦП преобразования
    }

//******* Чтение результатов ADC преобразования *******
void adc_convers(void)
    {
        result= 1.87*adc_data[0];  //Запись в переменную result результата ADC 1-го канала
        result_cl= adc_data[1];  //Запись в переменную result_cl результата ADC 2-го канала
    }


void main(void)
 {
  PORTB=0x00;
  DDRB=0x00;

  PORTC=0x00;
  DDRC=0x00;

  PORTD=0x00;
  DDRD=0x00;

  ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
  ADCSRA=0xCB;
  lcd_init(16);
  #asm("sei")

 

  while (1)
  {
   adc_convers(); //Чтение результатов ADC преобразования  - клавиатура

   if (result_cl == but_1){res_p=1;}
   if (result_cl == but_2){res_p=2;}
   if (result_cl == but_3){res_p=3;}
   if (result_cl == but_4){res_p=4;}
   if (result_cl == but_5){res_p=5;}
   if (result_cl == but_6){res_p=6;}
   if (result_cl == but_7){res_p=7;}
   if (result_cl == but_8){res_p=8;}
   if (result_cl == but_9){res_p=9;}
   if (result_cl == but_0){res_p=0;}
   if (result_cl == but_p){res_p='p';}
   if (result_cl == but_s){res_p='s';}


   
/////////////////////////   Войти в установки   /////////////////////////////////////

   if (result_cl == sets)
   {
    lcd_clear();

    strcpy (lcd_buffer,temp);
    strcat (lcd_buffer,time);
    strcat (lcd_buffer,prog);

    nav=1;
    nav_temp=0;
    nav_vr=0;
   }

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

   if ((result_cl == up) && (nav==1) && (nav_temp==0) && (nav_vr==0))
   {
    lcd_clear();


    nav_vr=1;
    nav_temp=1;              
   }
/////////////////////////   Вправо   ////////////////////////////////////////////////
   if ((result_cl == right) && (nav==1))
   {
    lcd_clear();
    m++;

    if ((m==1)&&(nav==1)&&(nav_temp==0)&&(nav_vr==0)){time_nav=0;temp_nav=1;prog_nav=0;strcpy(lcd_buffer,temp_s);strcat(lcd_buffer,time);strcat(lcd_buffer,prog);}
    if ((m==2)&&(nav==1)&&(nav_temp==0)&&(nav_vr==0)){time_nav=1;temp_nav=0;prog_nav=0;strcpy(lcd_buffer,temp);strcat(lcd_buffer,time_s);strcat(lcd_buffer,prog);}
    if ((m==3)&&(nav==1)&&(nav_temp==0)&&(nav_vr==0)){time_nav=0;temp_nav=0;prog_nav=1;strcpy(lcd_buffer,temp);strcat(lcd_buffer,time);strcat(lcd_buffer,prog_s);}

    delay_ms(50);
    if (m>3){m=3;}
    if ((m==0) && (nav==1) && (nav_temp==0) && (nav_vr==0)){time_nav=0;temp_nav=0;prog_nav=0;strcpy (lcd_buffer,temp);strcat(lcd_buffer,time);strcat(lcd_buffer,prog);}
   }
/////////////////////////   Влево   ////////////////////////////////////////////////
   if ((result_cl == left) && (nav==1))
   {
    lcd_clear();
    m--;

    if ((m==1) && (nav==1) && (nav_temp==0) && (nav_vr==0)){time_nav=0;temp_nav=1;prog_nav=0;strcpy(lcd_buffer,temp_s);strcat(lcd_buffer,time);strcat(lcd_buffer,prog);}
    if ((m==2) && (nav==1) && (nav_temp==0) && (nav_vr==0)){time_nav=1;temp_nav=0;prog_nav=0;strcpy(lcd_buffer,temp);strcat(lcd_buffer,time_s);strcat(lcd_buffer,prog);}
    if ((m==3) && (nav==1) && (nav_temp==0) && (nav_vr==0)){time_nav=0;temp_nav=0;prog_nav=1;strcpy(lcd_buffer,temp);strcat(lcd_buffer,time);strcat(lcd_buffer,prog_s);}

    delay_ms(50);
    if (m<3){m=m--;}
    if (m<0){m=0;}
    if ((m==0) && (nav==1) && (nav_temp==0) && (nav_vr==0)){time_nav=0;temp_nav=0;prog_nav=0;strcpy(lcd_buffer,temp);strcat(lcd_buffer,time);strcat(lcd_buffer,prog);}
   }
/////////////////////////////////////////////////////////////////////////////////////

    if (temp_nav==1)
        {
         delay_ms(10);


         set_temp = temp_temp;
         set_temp = res_p + 10 * temp_temp;

         sprintf(lcd_buffer1,"%d ",set_temp);
        }
    else if (temp_nav==0) {}


    if (time_nav==1)
        {
         strcpy(lcd_buffer1,time);
         strcat(lcd_buffer,temp);
         strcat(lcd_buffer,prog);


        }
    else if (time_nav==0) {}


    if (prog_nav==1)
        {
         //sprintf(lcd_buffer1,"%d ", result_cl);


        }
    else if (prog_nav==0) {}

    lcd_gotoxy(0,0);
    lcd_puts(str);
    lcd_puts(lcd_buffer);

    lcd_gotoxy(0,1);
    lcd_puts(str1);
    lcd_puts(lcd_buffer1);

   }
  }
 

 

 

Клавиатуру делаю на ADC. 
FLOAT - исключил потому как Atimega8 и памяти мало. С FLOAT - этот код весит 86% (но это ведь только начало).


Ошибки только - "Warning:: global variable 'res_temp' was declared, but not referenced" . На не задействованные переменные.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, 3_izmerenie сказал:

Ошибки только - "Warning:: global variable 'res_temp' was declared, but not referenced" . На не задействованные переменные.

Это не ошибки, а предупреждения.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, 3_izmerenie said:

 set_temp = temp_temp;
         set_temp = res_p + 10 * temp_temp;

Вообще-то по логике (все программу не анализировал), чтобы происходил сдвиг влево, то нужно писать что-то типа

set_temp = set_temp * 10 + temp_temp;

А у вас - присваивается значение переменной set_temp, а в следующей строчке оно переприсваивается, а предыдущее теряется. Ну и учитывать возможное переполнение set_temp.

Или должно быть так (что одно и то же с моим примером):

temp_temp = set_temp;
set_temp = res_p + 10 * temp_temp;

Изменено пользователем KomSoft

Настоящему коту и в декабре март!

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, 3_izmerenie сказал:

сначала умножение и деление

Как обычно - сначала умножение, потом сложение, все по правилам арифметики.

Делаем просто - при нажатии на клавиатуру старое значение умножаем на 10 и добавляем новое число с клавиатуры. Переменную temp_temp  выкидываем в мусорную корзину.

 set_temp = res_p + 10 * set_temp;
 sprintf(lcd_buffer1,"%d ",set_temp);

 

Ссылка на комментарий
Поделиться на другие сайты

14 минуты назад, Yurkin2015 сказал:

Как обычно - сначала умножение, потом сложение, все по правилам арифметики.

Делаем просто - при нажатии на клавиатуру старое значение умножаем на 10 и добавляем новое число с клавиатуры. Переменную temp_temp  выкидываем в мусорную корзину.


 set_temp = res_p + 10 * set_temp;
 sprintf(lcd_buffer1,"%d ",set_temp);

 

temp_temp   - это уже крик истерики....

Значения тупо затираются.  Нажимая 3 - выводит на LCD - 3, нажимаю 5 - выводит на LCD - 5 затирая 3. И не чета ему табличка умножения.

26 минут назад, KomSoft сказал:

Вообще-то по логике (все программу не анализировал), чтобы происходил сдвиг влево, то нужно писать что-то типа

set_temp = set_temp * 10 + temp_temp;

А у вас - присваивается значение переменной set_temp, а в следующей строчке оно переприсваивается, а предыдущее теряется. Ну и учитывать возможное переполнение set_temp.

Или должно быть так (что одно и то же с моим примером):

temp_temp = set_temp;
set_temp = res_p + 10 * temp_temp;

То-то и оно. Не интересно ему умножение.  на 10-е.

На этом
set_temp = set_temp * 100 + res_p * 10 + temp_temp;

Нажимаю 5 выходит 550, потом 4-ре выходит 440.

Может я в Codevision что-то не включил?

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, 3_izmerenie сказал:

Значения тупо затираются.

Обратите внимание, что в этой строке

set_temp = res_p + 10 * set_temp;

два раза используется переменная set_temp, а переменная temp_temp вообще не используется.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Yurkin2015 сказал:

Обратите внимание, что в этой строке


set_temp = res_p + 10 * set_temp;

два раза используется переменная set_temp, а переменная temp_temp вообще не используется.

         set_temp = temp_temp;
         set_temp = res_p + 10 * temp_temp;

На данный момент стоит так.  И все равно....

Изменено пользователем 3_izmerenie
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, 3_izmerenie сказал:

На данный момент стоит так.

Я же говорю, что переменная temp_temp - не нужна. Выбросите каку !

Сделайте вот так

 if (temp_nav==1)
        {
         delay_ms(10);

         set_temp = res_p + 10 * set_temp;

         sprintf(lcd_buffer1,"%d ",set_temp);
        }

Ну, нету тут переменной temp_temp.

Ссылка на комментарий
Поделиться на другие сайты

Чет мы не понимаем друг друга. У      ВАС    set_temp не используется. Вам предлагают поменять на set_temp = res_p + 10 * set_temp;           Вот тогда будет правильно (и не использовать temp_temp).

Настоящему коту и в декабре март!

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, KomSoft сказал:

Чет мы не понимаем друг друга. У      ВАС    set_temp не используется. Вам предлагают поменять на set_temp = res_p + 10 * set_temp;           Вот тогда будет правильно (и не использовать temp_temp).

Вариант 1

         temp_temp = set_temp;
         //set_temp = res_p + 10 * set_temp; 

         set_temp = set_temp * 100 + res_p * 10 + temp_temp;


На LCD  -  не нескончаемый отсчет.

Вариант 2

         temp_temp = set_temp;
         set_temp = res_p + 10 * set_temp;

На LCD  -  не отсчет до записи от микроконтролера в LCD (загрузка информации в дисплей). 

Вариант 3

         //temp_temp = set_temp;
         set_temp = res_p + 10 * set_temp; 

На LCD  -  не отсчет до записи от микроконтролера в LCD (загрузка информации в дисплей). 

Вариант 4

         //temp_temp = set_temp;
         //set_temp = res_p + 10 * set_temp; 
         set_temp = res_p +10 * temp_temp;

Нажал 5 - вышло 5, потом 4  - вышло 4-ре (5 затерлось).

Ссылка на комментарий
Поделиться на другие сайты

Вообще это изначально костыльный подход. А как быть с 5-м нажатием? с 6-м? переменная неизбежно переполнится. Вводите посимвольно. Верней 4 переменные byte в массиве nm[0..3] вводите с клавиатуры значение нажатой кнопки в массив, прибавляя индекс пока он меньше 3-х. А если равен трём - сбросить на ноль и снова вводить первый символ...

Потом вуа-ля число получаем Ni = nm[0]*1000 + nm[1]*100 + nm[2]*10 + nm[3], если надо именно число. А выводить на дисплей можно прямо из вводимого массива, к каждому элементу добавляешь код 0x30 и получаешь ASCII код символа цифры. А если число больше 10 выводить пробел.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

38 минут назад, 3_izmerenie сказал:

На LCD  -  не отсчет до записи от микроконтролера в LCD (загрузка информации в дисплей). 

Тысяча чертей! Что означает эта странная фраза? Я ни хрена не понял! :) 

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Alexeyslav сказал:

Вообще это изначально костыльный подход. А как быть с 5-м нажатием? с 6-м? переменная неизбежно переполнится. Вводите посимвольно. Верней 4 переменные byte в массиве nm[0..3] вводите с клавиатуры значение нажатой кнопки в массив, прибавляя индекс пока он меньше 3-х. А если равен трём - сбросить на ноль и снова вводить первый символ...

Потом вуа-ля число получаем Ni = nm[0]*1000 + nm[1]*100 + nm[2]*10 + nm[3], если надо именно число. А выводить на дисплей можно прямо из вводимого массива, к каждому элементу добавляешь код 0x30 и получаешь ASCII код символа цифры. А если число больше 10 выводить пробел.

Вот есть Atmega 8. Лап мало. Памяти тоже не особо много. 
Вариант с float - приятно решает часть задач - но в током виде он жрет 86 %.
Клавиатура на 18 выводов (матричная уже пролетает).

Без float  - 53%. Вариант массива я тоже думал (побоялся за обработку массива - как сожрет памяти, а впереди еще неизвестность).

А вот по поводу "А как быть с 5-м нажатием? с 6-м? переменная неизбежно переполнится." -  да. Но ведь мне 10000 градусов поднимать не надо (мне лошадей нужно греть, а не жарить).

8 минут назад, Yurkin2015 сказал:

Тысяча чертей! Что означает эта странная фраза? Я ни хрена не понял! :) 

""На LCD  -  отсчет до записи от микроконтроллера в LCD (загрузка информации в дисплей)."" - так вернее.
Согласен. Тут оно о как получается - нажимаю в симуляторе 5 сначала 555555, потом хаотичный на набор цифр да и еще и с отрицательным "балансом" проскакивают (как будто выходит за рамки decimal ). 

А есть другие варианты?

Ссылка на комментарий
Поделиться на другие сайты

Симуляторы... Эх... измельчал народ. Для клавиатур больших есть внешние регистры, хоть 60 клавиш подключай. HC595 называются.

У вас классическая проблема, вы не выделяете событие нажатия клавиши? у вас алгоритм крутится в бесконечном цикле, проверяет клавиша нажата? да - ввести и сдвинуть, следущая итерация - то же самое... и всё это проходит в миг глазом моргнуть не успеешь, поэтому и эффект такой на дисплее.

Вам надо сначала с клавиатурой разобраться. Выведите например короткий "пик" на каждое нажатие кнопки, посмотрите как они у вас распознаются. Если будет постоянный писк в итоге - значит алгоритм работает ФИГОВО. Вам надо как минимум выделять устойчивые состояния нажатий кнопок и фиксировать их в течении 100мс, например. В варианте с АЦП проблема будет огромная при нажатии более одной кнопки, а их НАЖМУТ.

Я бы для начала реализовал бы две процедуры - KeyPressed и ReadKey.
Первая процедура - определяет нажата ли кнопка(читает АЦП, сверяет уровни и определяет какой кнопке соответствует уровень), обрабатывает возможный дребезг(ждет когда последние 10 измерений(или за период в 10мс) будут одинаковые) и выдаёт на лету результат: нажата кнопка или нет, если нажата - устанавливает признак нажатия причем исключительно только в момент перехода из состояния НЕ НАЖАТА в состояние НАЖАТА. ReadKey возвращает код последней нажатой клавиши(из переменной устанавливаемой в предыдущей процедуре) и СБРАСЫВАЕТ признак нажатия.

В основном цикле уже просто и очевидно пользоваться этими функциями.
Если KeyPressed возвращает false - проходим мимо, если true - вызываем ReadKey и делаем что-то в зависимости от кода клавиши.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Верно подсказал. Спасибо огромное. На ходу программу выровнял.
Все дело во времени (скорости).

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

Те варианты которые предлагали хлопцы - полностью рабочие и верны (но тут другое).

У ADC есть буфер, и он работает очень быстро. То что я нажал на миг - для него это 5000 запросов.
И он их выгружает. А поскольку программа "тупа" просто принимает, обрабатывает и отдает. Вот оно и выходит: - при слишком быстром переполнении буфера (меньше математических задач) - он и выводит одну цифру.
Чуть-чуть больше математики - и наблюдается 55555 и понеслась  с + и -.

По факту результат ADC не синхронизирован с работой программы которой я скармливаю.
И в этом случае "delay_ms" - не отмажемся.

"В основном цикле уже просто и очевидно пользоваться этими функциями.
Если KeyPressed возвращает false - проходим мимо, если true - вызываем ReadKey и делаем что-то в зависимости от кода клавиши." - ну да. Осталось только правильно реализовать.


И чего сразу "Симуляторы... Эх... измельчал народ."? - для меги хватит. Но я понимаю что симулятор мне не подойдет ну ни как? Слишком много разных микроконтроллеров и писать для каждого симулятор это - глупо. А для начала ознакомления пойдет. К примеру мультивибраторы, радио.... я по схеме делаю (с даташитами естественно).
Сдвиговый регистр тоже интересно. Но на 18-ти кнопках и резисторами обойдемся.

За-то практика - куда интереснее.

Я брал не пиканье (я его еще делать не умею), был светодиод - но реагировал без задержек.
"В варианте с АЦП проблема будет огромная при нажатии более одной кнопки, а их НАЖМУТ" - это вытягивать только сопротивлением (просто посчитать что-бы не совпадало - да и ляд с ним).
Да и потом - стоит кнопка "OK". Что хочешь нажимай - но без установок не отреагирует. Да и дроби еще ни кто не отменял.
Да и нажимать-то буду я. Не ну если все будет ровно, и еще кому-то понравиться....

Изменено пользователем Alex
Завязывайте бездумно вставлять цитату предыдущего поста
Ссылка на комментарий
Поделиться на другие сайты

Всё это как-то костыльно выглядит, когда можно сделать по нормальному.
Ардуинки достаточно дешёвые, не хватает одной - поставь две. Есть кстати шилды с клавиатурой для ардуины.

5000 выборок для клавиатуры, это чрезмерно. там и 100 выб/сек хватит.

Симуляторы... они с ошибками и слишком порой идеальны, на практике всё совсем по другому выходит. Эффективно использовать симуляторы можно только зная все ньюансы и в симуляцию выносить только то что точно там не будет искажено.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Согласен. Есть такое.

Но тут будет дописываться еще - контроль влажности, вентиляция.
Естественно программирование по времени.

"Ардуинки достаточно дешёвые" - ардуино делал кто-то. А у меня такой "фетиш" - мозги тренировать...

Я вот мозгую как-бы максимально легко (по весу) реализовать то что ты описывал.

Информации мало, справочники - в топку (fflush - не в каждом редакторе работает), некоторые вещи вообще выковыриваю от импортных.

Очень любопытно зачем вообще union? А-бы було?
Загнать переменную в массив (... - мерный) и получить вообще полный контроль над результатами и манипуляцией. И на кой этот union?

Ну я например не верю что в Си нет аналога . - как в php (ну это уже интерес).

-----------------------------------------------------------------------------------------------------------------
Завязывайте бездумно вставлять цитату предыдущего поста !
Alex

Ссылка на комментарий
Поделиться на другие сайты

Если бы в Си был аналог, он бы не назывался С++. Это всё относится к тем вещам, которые способны сэкономить время разработки решения. Но если вы не знаете/не понимаете как это работает то значит просто ещё не столкнулись с теми проблемами которые эта штука призвана решать. Например со сложностью проекта.

Почитал про union, понял что это такое. В паскале эта штука тоже есть только по другому реализуется. Использовать надо с великой осторожностью и полным пониманием. Иногда эта вещь весьма полезная. например, можно объявить объединение int64 и массива в 8 байт. Теперь вы легко можете принимать по UART данные побайтно и восстанавливать в памяти 64-битное число просто записывая поверх его байты, обращаясь к байтовому массиву. Можно, конечно, взять указатель, и обращаться к этой структуре побайтно... но в таком случае это будет не очевидно, не наглядно, безконтрольно и достаточно уязвимо к программным ошибкам.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

В 15.02.2019 в 01:10, Alexeyslav сказал:

ReadKey

Извиняюсь "показавшуюся лень".  Хотел реализовать через getch(). Codevision говорит - Error: undefined symbol 'getch'.

Ты не можешь носом ткнуть как поток (ADC) вывести только одно значение?

У меня такое ощущение что в Codevision вырезано все.... 

Ссылка на комментарий
Поделиться на другие сайты

Ничего не понял. Какой поток? Зачем поток? Запускаешь измерение, ждешь результат и работаешь дальше... вырезано-невырезано самому сделать нельзя? По даташиту... я этот Codevision в глаза не видел, поэтому ничего не подскажу. Может, там надо либу подключить? что за функция getch(), гуглил? аааа... это процедура ввода с консоли... а у тебя в МК есть консоль? драйвер клавиатуры? Откуда он будет знать что у тебя какая-то клавиатура есть и её конфигурацию? Чтобы такая функция заработала много чего должно быть реализовано, и соответственно у тебя ЕГО НЕТ И НЕ БУДЕТ. Если так уж хочешь, то возьми и реализуй сам эту функцию. Но тебе она не пойдёт, она по своей природе синхронная - пока кнопку не нажмешь не отпустит и весь контроллер стоять будет ожидая нажатия. Лучше подумай о варианте озвученном выше.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, Alexeyslav сказал:

это процедура ввода с консоли

Фига-се.... Просветление пошло. 
Просто по примерам getch() - пихают для работы с потоками (понял.... это не те потоки).
Теперь я начинаю немного понимать в какую сторону мне идти.

Я вчера небольшой эксперимент провел - закинул вывод из своей клавиатуры в многомерный массив (10), затем вывел это на дисплей. В результате весь массив был наполнен 5-ками (а что не влезло - то и не записалось). Но оно находиться в цикле и все-равно перезаписывается.

Я ток понял мне нужно работать не с INT (его переводить не нужно будет). А с CHAR, где все результаты  переводить sprintf - ом (а оно жрет память нещадно).

Блин... Ох и язык.

 

33 минуты назад, Alexeyslav сказал:

Зачем поток? Запускаешь измерение, ждешь результат и работаешь дальше

Поскольку он находиться в цикле - он его постоянно перезаписывает.

Резануть получилось - так он мне начал прыгать и выводить 5, 0, 5, 0 и все в одной позиции (до математических операций не доходило).

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Сила с вами прЕбудет, только в том случае, если корпуса м/сх совпадают. А вообще такие вопросы решают иногда заглядывая в datasheet на микросхемы.
    • 350 стоит по умолчанию, вшито . Я так понял. Я включил . У меня сразу лым пошёл и само жало чуть по чернело но ещё рабочее ... Я научился пользоваться термопарой , измеряю, смотрю по таблице - разница очень большая . Кручу ратио - показания меняются, это гуд. Я думал что 100% - это предел. Но они пошли и дальше ..... Отсюда вопрос может кто знает как меняется температура в какую сторону при прокрутке туда или обратно? Хотя бы примерно?
    • Была у меня книжка (что-то типа помощь сельскому радиолюбителю) и в разделе самодельные источники питания был "рецепт" батарейки: две пластины меди и цинк(алюминий, не могу точно утверждать) между ними помещалась промокашка, предварительно замоченная в солевом растворе и присыпанная с одной стороны толченым углем. Элемент позиционировался как походный и потому промокашку сушили и вкладывали между пластин, а при необходимости ее мочили и элемент начинал работать. Точно не помню технологию и могу где-то ошибаться. Так вот вопрос к сторожилам, может кто  помнит данный "рецепт" или книгу в которой он был описан?
    • Попробуйте магнитолу отремонтировать. Говорят помогает. Иногда спасает поиск профильных специалистов по месту.
    • Офигенный заход... Отлично, не смеем отговаривать, хоть это будет дорого или очень дорого и больно. ШТА? При чем тут 220В? что в вашем понимании "нормальная"? Ну так а в чем проблема? Удивительно, учитывая что это основная задача частотного преобразователя. Куда подходит? Зачем он вообще идет? Параметры это агрегата за вас искать надо? Или удосужитесь дать побольше информации? З.Ы. А нафига реактивному дигателю вообще частотник? https://ru.wikipedia.org/wiki/РД-9
    • А что там анализировать? 1) Монтируется успешно. 2) Запрашивается в функции чтения данные с сектором 0, и перед каждым не успешно найденным файлом. 3) если выкинуть отладку, то один файл находит, но чтение буфера 0 и сам буфер пустой. Где-то косяк с конфигами... Кто работал пожалуйста подскажите, чтобы меньше потратить времени... Можно конечно. Какая разница как название указывать? Через массив символов либо явно указав массив символов в виде строки.
×
×
  • Создать...