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

3_izmerenie

Members
  • Постов

    17
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Киев

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры
  • Оборудование
    тестер

Достижения 3_izmerenie

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Спасибо огромное что подсказал. Все получилось. На цифрах я добавил так: - 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 символа поставить и продолжать к выполнению второй части кода. Сколько там до меня доходило? Блин аж стыдно. Но я только учусь. Я просто пихал в обработчик дисплея (перед выводом на дисплей).
  2. 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).
  3. #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); } } Как-то так в двух словах.
  4. Ну да. Если я не ошибаюсь, я где-то это написал. Мне нужно задать параметры при которых программа будет сравнивать что когда ей делать. И делать мне это нужно именно через АЦП. Потому как я хочу в дальнейшем реализовать свою давнюю мечту (5-ти осевой ЧПУ фрезер - слишком дорого покупать).
  5. Нисколечко. Я пытаюсь понять как "алгоритм работы термостата " поставить в шаблон (который потом когда нужно - пойдет как лекало) и при этом не переполнять буфер переменной. Для начала я не знаю алгоритм поведения переполнения (какой будет эффект переполнения переменной - может оно проц повесит в итоге в какой-то неизвестный момент). У меня проблема возникает с ADC клавиатурой.
  6. То-ж и я думаю. Я сильно отклонился от правильного курса. Запутался. Смотрю на разные варианты, и кидает в разные стороны. А ты говоришь Ардуино. Там много рабочих примеров... но разве это я сделал? И какой из меня программист получиться? Так, ребенок - который собрал лего. Наверное я в подполье пойду (а то тут психовать начнут). Еще-же очень сильно путает: - в программировании чистая математика, а в программировании микроконтроллеров еще-же и побайтовые сдвиги присутствуют...
  7. Фига-се.... Просветление пошло. Просто по примерам getch() - пихают для работы с потоками (понял.... это не те потоки). Теперь я начинаю немного понимать в какую сторону мне идти. Я вчера небольшой эксперимент провел - закинул вывод из своей клавиатуры в многомерный массив (10), затем вывел это на дисплей. В результате весь массив был наполнен 5-ками (а что не влезло - то и не записалось). Но оно находиться в цикле и все-равно перезаписывается. Я ток понял мне нужно работать не с INT (его переводить не нужно будет). А с CHAR, где все результаты переводить sprintf - ом (а оно жрет память нещадно). Блин... Ох и язык. Поскольку он находиться в цикле - он его постоянно перезаписывает. Резануть получилось - так он мне начал прыгать и выводить 5, 0, 5, 0 и все в одной позиции (до математических операций не доходило).
  8. Извиняюсь "показавшуюся лень". Хотел реализовать через getch(). Codevision говорит - Error: undefined symbol 'getch'. Ты не можешь носом ткнуть как поток (ADC) вывести только одно значение? У меня такое ощущение что в Codevision вырезано все....
  9. Согласен. Есть такое. Но тут будет дописываться еще - контроль влажности, вентиляция. Естественно программирование по времени. "Ардуинки достаточно дешёвые" - ардуино делал кто-то. А у меня такой "фетиш" - мозги тренировать... Я вот мозгую как-бы максимально легко (по весу) реализовать то что ты описывал. Информации мало, справочники - в топку (fflush - не в каждом редакторе работает), некоторые вещи вообще выковыриваю от импортных. Очень любопытно зачем вообще union? А-бы було? Загнать переменную в массив (... - мерный) и получить вообще полный контроль над результатами и манипуляцией. И на кой этот union? Ну я например не верю что в Си нет аналога . - как в php (ну это уже интерес). ----------------------------------------------------------------------------------------------------------------- Завязывайте бездумно вставлять цитату предыдущего поста ! Alex
  10. Верно подсказал. Спасибо огромное. На ходу программу выровнял. Все дело во времени (скорости). А по лапам жмусь - потому-что это для живого. Тут и замер температуры, и вентиляция, и влажность. Ну не лепить-же таких как STM32F103ZET6. Те варианты которые предлагали хлопцы - полностью рабочие и верны (но тут другое). У ADC есть буфер, и он работает очень быстро. То что я нажал на миг - для него это 5000 запросов. И он их выгружает. А поскольку программа "тупа" просто принимает, обрабатывает и отдает. Вот оно и выходит: - при слишком быстром переполнении буфера (меньше математических задач) - он и выводит одну цифру. Чуть-чуть больше математики - и наблюдается 55555 и понеслась с + и -. По факту результат ADC не синхронизирован с работой программы которой я скармливаю. И в этом случае "delay_ms" - не отмажемся. "В основном цикле уже просто и очевидно пользоваться этими функциями. Если KeyPressed возвращает false - проходим мимо, если true - вызываем ReadKey и делаем что-то в зависимости от кода клавиши." - ну да. Осталось только правильно реализовать. И чего сразу "Симуляторы... Эх... измельчал народ."? - для меги хватит. Но я понимаю что симулятор мне не подойдет ну ни как? Слишком много разных микроконтроллеров и писать для каждого симулятор это - глупо. А для начала ознакомления пойдет. К примеру мультивибраторы, радио.... я по схеме делаю (с даташитами естественно). Сдвиговый регистр тоже интересно. Но на 18-ти кнопках и резисторами обойдемся. За-то практика - куда интереснее. Я брал не пиканье (я его еще делать не умею), был светодиод - но реагировал без задержек. "В варианте с АЦП проблема будет огромная при нажатии более одной кнопки, а их НАЖМУТ" - это вытягивать только сопротивлением (просто посчитать что-бы не совпадало - да и ляд с ним). Да и потом - стоит кнопка "OK". Что хочешь нажимай - но без установок не отреагирует. Да и дроби еще ни кто не отменял. Да и нажимать-то буду я. Не ну если все будет ровно, и еще кому-то понравиться....
  11. Вот есть Atmega 8. Лап мало. Памяти тоже не особо много. Вариант с float - приятно решает часть задач - но в током виде он жрет 86 %. Клавиатура на 18 выводов (матричная уже пролетает). Без float - 53%. Вариант массива я тоже думал (побоялся за обработку массива - как сожрет памяти, а впереди еще неизвестность). А вот по поводу "А как быть с 5-м нажатием? с 6-м? переменная неизбежно переполнится." - да. Но ведь мне 10000 градусов поднимать не надо (мне лошадей нужно греть, а не жарить). ""На LCD - отсчет до записи от микроконтроллера в LCD (загрузка информации в дисплей)."" - так вернее. Согласен. Тут оно о как получается - нажимаю в симуляторе 5 сначала 555555, потом хаотичный на набор цифр да и еще и с отрицательным "балансом" проскакивают (как будто выходит за рамки decimal ). А есть другие варианты?
  12. Вариант 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 затерлось).
  13. set_temp = temp_temp; set_temp = res_p + 10 * temp_temp; На данный момент стоит так. И все равно....
  14. temp_temp - это уже крик истерики.... Значения тупо затираются. Нажимая 3 - выводит на LCD - 3, нажимаю 5 - выводит на LCD - 5 затирая 3. И не чета ему табличка умножения. То-то и оно. Не интересно ему умножение. на 10-е. На этом set_temp = set_temp * 100 + res_p * 10 + temp_temp; Нажимаю 5 выходит 550, потом 4-ре выходит 440. Может я в Codevision что-то не включил?
  15. Делаю термостат (в селе в конюшню) для поддержания нужной температуры - ну и параллельно учусь #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" . На не задействованные переменные.
×
×
  • Создать...