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

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


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

Вы что-то катастрофически делаете не так. Какой поток, какой резануть? Где вообще могут быть какието проблемы в алгоритме  - запустил-подождал-считал? Какие нули? с символами ВАМ работать как раз не нужно, вам их потом обратно в числа превращать... работайте сразу с числами 0...9 а всё остальное считайте NAN.

чтобы набыло бесконечных 5-5-5-5-5-5-5 вам надо отслеживать установившиеся ИЗМЕНЕНИЯ.

Было "отпущено" стало 5 - это изменение, нажатие кнопки. было 5 стало 5 - кнопка ещё держится, нет изменений. было 5 стало "отпущено" - это отпускание кнопки.

Но если делать это прямо с измерениями с АЦП будет проблема из-за дребезга и помех, поэтому чтобы получить устойчивое значение оно должно быть зарегистрировано как минимум 5 раз с периодом опроса АЦП скажем 2мс. И потом уже это знаение пропускать через алгоритм выше.

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

с символами ВАМ работать как раз не нужно

То-ж и я думаю.

Я сильно отклонился от правильного курса.
Запутался. Смотрю на разные варианты, и кидает в разные стороны.

А ты говоришь Ардуино. Там много рабочих примеров... но разве это я сделал? И какой из меня программист получиться?  Так, ребенок - который собрал лего.

Наверное я в подполье пойду (а то тут психовать начнут).
Еще-же очень сильно путает: - в программировании чистая математика, а в программировании микроконтроллеров еще-же и побайтовые сдвиги присутствуют...

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В 14.02.2019 в 22:37, 3_izmerenie сказал:

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

Проблема в том что вы пытаетесь написать какую-то СУПер ПРОГрамму, а надо написать алгоритм работы термостата (АРТ), в вашем случае.

Напишите этот АРТ по русски сначала!

Пока нет алгоритма который вам надо закодировать (на каком бы то ни было алгоритмическом языке), вы так и будете генерировать поток вычислительного бреда, коим является приведенная вами программа, к сожалению :( .

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

24 минуты назад, ruhi сказал:

Проблема в том что вы пытаетесь написать какую-то СУПер ПРОГрамму

Нисколечко.

Я пытаюсь понять как "алгоритм работы термостата " поставить в шаблон (который потом  когда нужно - пойдет как лекало) и при этом не переполнять буфер переменной.
Для начала я не знаю алгоритм поведения переполнения (какой будет эффект переполнения переменной - может оно проц повесит в итоге в какой-то неизвестный момент). 
 

31 минуту назад, ruhi сказал:

Пока нет алгоритма который вам надо закодировать (на каком бы то ни было алгоритмическом языке), вы так и будете генерировать поток вычислительного бреда, коим является приведенная вами программа, к сожалению

У меня проблема возникает с ADC клавиатурой. 
 

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

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

я не знаю алгоритм поведения переполнения

а теперь вы пытаетесь оперировать терминами смысла которых не понимаете:

у переполнения нет поведения! Это результат операции суммирования при ограниченной разрядности! А вот как вы обрабатываете (хотите обработать) этот результат в вашем алгоритме непонятно чего, совершенно не понятно, простите за тофтологию.

Я догадываюсь что вы хотите как то оптимизировать ввод и отображение 4-х значного числа (значения температуры), расскажите по русски свою задумку!

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

Я догадываюсь что вы хотите как то оптимизировать ввод и отображение 4-х значного числа (значения температуры), расскажите по русски свою задумку!

Ну да.

Если я не ошибаюсь, я где-то это написал.

Мне нужно задать параметры при которых программа будет сравнивать что когда ей делать.
И делать мне это нужно именно через АЦП. Потому как я хочу в дальнейшем реализовать свою давнюю мечту (5-ти осевой ЧПУ фрезер - слишком дорого покупать).

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

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

Мне нужно задать параметры при которых программа будет сравнивать что когда ей делать.
И делать мне это нужно именно через АЦП.

так напишите что у вас, последовательно (?) приходит с(из) АЦП (и как понять что что то с АЦП пришло) и что должна сравнивать программа каждый раз(?) когда оно с АЦП приходит - просто рассмотрите пример с конкретными(типовыми) значениями и с привязкой ко времени или к событиям нажатия кнопок (?) !

Я вас уверяю у вас пропадет 95% вопросов, а с оставшимися 5% вам легко будет помочь!

Изменено пользователем ruhi
дополнил

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

20 минут назад, ruhi сказал:

так напишите что у вас, последовательно (?)

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


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

int 
nav=0,nav_vr,nav_temp,

block_res_p,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;

 


//********* Переменные 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;

//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-го канала
    }
 

while {
adc_convers();

if (result_cl == but_1){res_p=1;}


 

    if (temp_nav==1) // это проверка правильности навигации
        {
         delay_ms(10);

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

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

}

Как-то так в двух словах.

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

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

Как-то так в двух словах.

вы в первую очередь, для себя (и ведь ни я, ни кто другой угадывать это не будет), должны рассказать как эта конструкция должна работать (как вы предполагаете она должна работать):

то есть в каких пределах и какие вы ожидаете входные воздействия, и

какие и как должны изменяться выходные сигналы 

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

1 час назад, ruhi сказал:

то есть в каких пределах и какие вы ожидаете входные воздействия, и

int result - подключен к термодатчику.
int result_cl -  подключен к АЦП клавиатуре.

При нажатии на цифру 1.
f (result_cl == but_1){res_p=1;  " сюда какой-то нейтральный код который ни к чему не подвязан так как ему нужно будет не только температуру задавать но и время выставлять"}

 

delay_ms(10); - задержка (типа анти дребезг)

temp_temp=set_temp;  - пустая приравниваемая к временной переменной
set_temp = res_p + 10 * temp_temp;  пустая должна задать результат от временной " 1, 11, 111, 1111"

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

set_temp - после чего идет дальше в арифметическую обработку (дальше программа выполняет другие процессы  отталкиваясь от set_temp).

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

Какой-то мусор. Вроде же задача не такая сложная.

Считать значение напряжения при помощи АЦП, пройтись по таблице посмотреть в какой из диапазонов попадает измеренная величина и получить номер клавиши которую нажали, или сделать вывод что ни одна не нажата. Это часть дела.
Всё бы хорошо, но нам надо знать не только тот факт что в некий момент клавиша была нажата, но нам нужно отследить момент нажатия и отпускания. И заодно избавится от неопределённости одного момента. Ведь с некоторой вероятностью считывания может произойти в момент наличия помехи или момент перехода в момент нажатия кнопки. Поэтому как минимум нужно пропустить определённые нажатые кнопки через фильтр - принимать во внимание номер нажатой кнопки только если два последовательных измерения на расстоянии не менее 10мс друг от друга дают одну и ту же кнопку. Кстати, для начала можно это всё(измерение-поиск_по_таблице-определение номера кнопки) уместить в одну функцию и в дальнейшем работать с ней. Назовём её ReadKey у которой на выходе, скажем, будет номер удерживаемой кнопки 0...9 или число больше 10 означающее удерживание какой-то ещё кнопки, или отсутствие нажатия(например, число "-1").
С этой абстракцией будет уже гораааздо легче работать в дальнейшем.

И так, допустим у нас есть бесконечный цикл(который обычно называют главным циклом программы, или суперлупом) в котором мы каждые 10мс вызываем процедуру ReadKey. И очень важно, чтобы это делалось с интервалом не менее 10мс(ну или 100мс, как удобней или надо будет посмотреть подобрать по отзывчивости на нажатие и количества ложняков).

Что нам теперь осталось сделать чтобы избавится от помех и дребезга? Да просто сравнить только что считанное значение с предыдущим, которое предусмотрительно будет сохранено в конце основного цикла, ну или не в конце - главное чтобы не ранее кода обработки клавиатуры.

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

Теперь нам надо выделить "фронты". Это делается аналогично предыдущему коду - запоминаем предыдущее очищенное от дребезга значение и сравниваем с текущим. Тут уже есть 4 разных варианта. 1) текущее и предыдущее = "не нажато"(-1?) - ничего не делаем. 2) предыдущее значение = нет клавиши, текущее = <№кнопки> - это собственно сам момент нажатия, а номер нажатой кнопки понятно где брать. 3) предыдущее значение = <№кнопки>, текущее = "не нажато"(-1?) - это момент отпускания кнопки и 4) предыдущее значение = <№кнопки>, текущее = <№кнопки> - состояние "нажатия" кнопки и нам тоже НЕ ИНТЕРЕСНО, причем номера кнопок МОГУТ отличаться, когда не отпуская одну кнопку нажимаешь вторую потом первую отпускаешь - код от этого ломаться не должен и поведение программы должно быть определённым.

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

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

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

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

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

Какой-то мусор. Вроде же задача не такая сложная.

Спасибо огромное что подсказал.

Все получилось.

На цифрах я добавил так: - 
delay_ms(35);temp_temp = set_temp;set_temp = res_p + 10 * set_temp;

if (result_cl == but_1){res_p=1;delay_ms(35);temp_temp = set_temp;set_temp = res_p + 10 * set_temp;}

Было if (result_cl == but_1){res_p=1;}


Я просто только-что сделал, и только-что прочитал что ты описал.
Все отлично кроме одного запланированного.
Сейчас только лимит на 4 символа поставить и продолжать к выполнению второй части кода.

Сколько там до меня доходило? Блин аж стыдно.  Но я только учусь. Я просто пихал в обработчик дисплея (перед выводом на дисплей).

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

18 часов назад, 3_izmerenie сказал:

int result - подключен к термодатчику.
int result_cl -  подключен к АЦП клавиатуре.

пока ты это по русски не написал, меня клинило :) и я не мог понять, что это с разных каналов, хотя оно конечно очевидно, но в виде кода оно почему-то не откладывалось, кстати.

Стыдится тут нечего, это такая штука что любого, периодически, на чем нибудь клинит :).

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

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

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

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

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

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

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

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

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