COKPOWEHEU

Members
  • Публикации

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

  • Посещение

Репутация

261 Хороший

О COKPOWEHEU

  • Звание
    Старожил
  • День рождения 23.02.1991

Контакты

  • ICQ
    0

Информация

  • Пол
    Мужчина
  • Город
    московская область

Электроника

  • Стаж в электронике
    6-10 лет
  • Сфера радиоэлектроники
    контроллеры

Посетители профиля

14 921 просмотр профиля
  1. Простое меню LCD2004

    void menu_redraw(){ menu_t menu_near; lcd_enable(); //на тех же портах что и дисплей у меня висело еще что-то (уж не помню что) поэтому включаем явным образом //загружаем из ПЗУ содержимое текущего пункта меню memcpy_P(&menu_temp,&(menu_arr[menu_pos]),sizeof(menu_temp)); //загружаем из ПЗУ названия пунктов, окружающих текущий: "верхний", он же название подменю memcpy_P(&menu_near.caption,&(menu_arr[menu_temp.up].caption),sizeof(menu_near.caption)); lcd_goto(LCD_STR_1); lcd_data('['); lcd_str(menu_near.caption); lcd_data(']'); //предыдущий memcpy_P(&menu_near.caption,&(menu_arr[menu_temp.prev].caption),sizeof(menu_near.caption)); lcd_goto(LCD_STR_2); lcd_data(0xD9); lcd_str(menu_near.caption); lcd_data(0xD9); //текущий lcd_goto(LCD_STR_3); lcd_data(0xDB); lcd_str(menu_temp.caption); lcd_data(0xDC); //следующий memcpy_P(&menu_near.caption,&(menu_arr[menu_temp.next].caption),sizeof(menu_near.caption)); lcd_goto(LCD_STR_4); lcd_data(0xDA); lcd_str(menu_near.caption); lcd_data(0xDA); //символы '[', ']', 0xD9, 0xDA, 0xDB, 0xDC это "рамка" вокруг пунктов чтобы однозначно выделить кто из них текущий } void menu(){ while(1){ kbd_enable(); //если не ошибаюсь, именно клавиатура и "сожительствует" с дисплеем kbd_update(); //анализируем клавиатуру только если ее состояние изменилось (были нажаты новые клавиши) if(kbd_t!=kbd_last){ switch(kbd_t){ case KBD_NEXT: menu_pos=menu_temp.next; break; //ну тут все очевидно case KBD_PREV: menu_pos=menu_temp.prev; break; case KBD_NO: menu_pos=menu_temp.up; break; //самый "развесистый" вариант, поскольку поведение "дочернего" пункта может быть различным case KBD_OK: //если старший бит выставлен, запускаем ввод выбранного типа данных if(menu_temp.down & 0x80)menu_input(menu_temp.down & 0b01111111); else //тут какие-то костыли, сделанные именно для моей задачи. На самом деле хорошо было бы реализовать как-то по-другому. Поэтому и комментировать не буду if(menu_pos==0x0E)select_program();else if(menu_pos==0x11){work_flags = work_flags|WF_RUN|WF_PROG; time_to_curtime(0); return;}else if(menu_pos==0x12){work_flags = (work_flags&~WF_PROG)|WF_RUN; time_to_curtime(0); return;}else //самый простой вариант. Если "внизу" скрывается еще одно подменю - переходим в него menu_pos=menu_temp.down; break; } menu_redraw(); //какая-то клавиша была нажата, значит перерисовываем меню } } } Как-то так
  2. Вопросы От Начинающих По Мк

    Почему питание на AVCC не подается?
  3. Простое меню LCD2004

    Вот как было устроено меню у меня. Разберетесь без функций ввода-вывода или мне все же выложить их ближе к вечеру? typedef struct{ unsigned char prev; //предыдущий элемент в том же подменю unsigned char next; //следующий unsigned char up; //номер пункта родительского меню, в котором содержится данный элемент unsigned char down; //номер подменю, в которое можно попасть из этого. Если 7-й бит выставлен, то остальные интерпретируются как номер вызываемой функции char caption[15]; //в моем случае ширина экрана 16 символов, плюс "украшения" }menu_t; //////////////////////////////////////////////////////////////////////////// // MENU // | // SETTINGS------------------------------------------EDIT------------------RUN // | | | // UART------SPI--I/O----ADC EDIT_CURRENT-LOAD-SAVE AUTO-TERMOSTAT // | | b | | | | //BAUD-LOG - FILTER-0C-SCALE-ACCURACY O - - // i b c i i i //////////////////////////////////////////////////////////////////////////// // i input integer // c input byte // b input boolean // - disabled // O special procedure //////////////////////////////////////////////////////////////////////////// PROGMEM menu_t menu_arr[]={ {0x01,0x01,0x00,0x01," MENU "}, //0x00 {0x03,0x02,0x00,0x04," SETTINGS "}, //0x01 {0x01,0x03,0x00,0x0E," EDIT "}, //0x02 {0x02,0x01,0x00,0x11," RUN "}, //0x03 {0x07,0x05,0x01,0x08," UART "}, //0x04 {0x04,0x06,0x01,0x05," SPI "}, //0x05 {0x05,0x07,0x01,0x85," I/O "}, //0x06 {0x06,0x04,0x01,0x0A," ADC "}, //0x07 {0x09,0x09,0x04,0x80," BAUD "}, //0x08 {0x08,0x08,0x04,0x81," LOG "}, //0x09 {0x0D,0x0B,0x07,0x82," FILTER "}, //0x0A {0x0A,0x0C,0x07,0x83," 0 C "}, //0x0B {0x0B,0x0D,0x07,0x84," SCALE "}, //0x0C {0x0C,0x0A,0x07,0x86," ACCURACY "}, //0x0D {0x10,0x0F,0x02,0x00," EDIT CURRENT "}, //0x0E {0x0E,0x10,0x02,0x00," LOAD "}, //0x0F {0x0F,0x0E,0x02,0x00," SAVE "}, //0x10 {0x12,0x12,0x03,0x00," AUTO "}, //0x11 {0x11,0x11,0x03,0x00," TERMOSTAT "} //0x12 }; menu_t menu_temp; unsigned char menu_pos=1;
  4. Вопросы От Начинающих По Мк

    Так посчитайте хватит ли вам точности. 1024 * 0.7 / 2.56 = 280 значение АЦП при 70 градусах 1 * 2.56 / 1024 / 0.01 = 0.25 градусов / деление
  5. команды ld / st. Адрес в любой из регистровых пар X, Y, Z. Результат записывается в r0-r31.
  6. Прерывания на ATMega2560

    объявите counter как volatile: volatile unsigned char counter = 0; А не проще так? Без флагов и проверок. PORTB ^= (1<<7);
  7. Либо его убедили, что надежность, помехозащищенность и сертификация у промышленного контроллера выше, чем у наколеночной поделки.
  8. Не путайте: Си, Паскаль и прочие тоже будут - при создании законченных приборов или программ. А при автоматизации, создании из законченных приборов автоматизированной системы, настраиваемой не-программистами как раз используются графические "языки". Их преимущество именно в том, что не надо учить синтаксис, достаточно абы как соединить готовые кирпичики изолентой. Так вот, при _создании_ приборов на МК такой подход неэффективен.
  9. Для примитивной автоматизации готовых устройств может и пригодно - вроде уже в этой теме обсуждалось. Но только там, где можно проигнорировать дикий расход скорости и памяти как на саму визуальную среду, так и на говнокод (я не верю в хороший код от домохозяек). Программирование МК - немного другая область.
  10. А можно воспользоваться наработками gcc или LLVM Никакая логика не требует визуальной среды.
  11. Проблема с программированием ATtiny2313A при помощи AVRDude.

    Покажите схему и печатку
  12. Проверяйте версию Протеуса и дисплея. Тот дисплей что используется в этой теме, не всегда работает с 8-м Протеусом.
  13. Вопросы От Начинающих По Мк

    Только умножать не на 0xFF а на 0x100, конечно.
  14. @Berg, не проверяли насколько оно в реальности помогает? Какое потребление в активном режиме и какое в режиме сна?
  15. А надо было ему коммит писать . Я его код не использовал, только задачу, "мелкий шрифт 3х5".