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

demiurg1978

Участник
  • Постов

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

  • Посещение

Весь контент demiurg1978


  1. Привет. Как бы все правильно. Работа с периферией. Указатель двухбайтный и обращение должно полным.
  2. Слушайте. Вы сделали неверные выводы. Сказал же. AVR занимаюсь с 2007 года. И работу с EEPROM примерно тогда и освоил. Мне касаемо архитектуры и внутренней периферии ваши советы не нужны. Сам могу давать советы. Мой вопрос был насчёт компилятора. Мы поняли друг друга?
  3. Я в IAR использовал переменные EEPROM как есть. Потому и получил гранату. __eeprom u08 ee_parameter_1; ee_parameter_1 = 0x55; Именно в моем случае решение проблемы использовать функции read_eeprom_byte (). write_eeprom_byte (). Ну и соответственно нужная разрядность. u08, u16, u32. Либо самописные функции. В соответствии с даташитами.
  4. Я всегда пользовался студией. Самая адекватная и стабильная это 4.19. Проекты пишу на IAR. Симуляцию делаю в AVR-Studio. Нужную периферию проверяю уже на железе. Если требуется с осциллографом. Знаю как работает МК. Знаю как должна работать программа. Знаю как должна работать периферия. Если требуется, пишу тестовые куски кода. Написал этап работы, прогнал в симуляторе. Потом в железе. Итог. Практически всегда уже пишу так, что работает сразу. За редким исключением. Microchip Studio это наследие AVR-Studio. Со всеми ее недостатками. Мой профессиональный багаж. Электронные устройства, блоки управления станками, промышленного оборудования.
  5. Теперь увидел. В последнее время режим как попало. Прихожу поздно, часто ночами сижу. Пардон. Сразу ваш тот ответ не увидел. Тему читал уставший и невыспавшийся. Сергей Борщ и Точка Опоры меня хорошо знают. Толику знаний и от них получил. AVR-ками занимаюсь с 2007 года. Несколько лет на асме. Потом си. Я выше уже написал. Тему невнимательно прочитал. Думал, где то упустил ответ, почему компилятор сделал неправильно запись в EEPROM.
  6. Вы меня знаете. AVR-ки хорошо знаю. Сказал же, написал тестовую программу на асме. Я хотел посмотреть ответ Сергея.
  7. Приветствую всех! Сталкивался с подобной ситуацией. Компилятор IAR. Микроконтроллер ATMEGA32. Проект на си. Прибор, матричная клавиатура, символьный дисплей. Меню, параметры. Программа работает, при вводе параметров и попытке сохранить в EEPROM данные не сохраняются. В дизасм смотрел, вроде все нормально. Делаю в AVR-Studio тестовый проект на ассемблере. Все сохраняется. Я тогда торопился, нужно было срочно добить проект. Точно не помню, то ли замена на ATMEGA32A мне тогда помогла, то ли версию IAR сменил. Что там за тема про 4 такта? Можно ссылочку?
  8. case KEY_ENTER_COD: if (CurrMenuItem -> EnterFunc != NULL_FUNC) { GO_MENU_FUNC (ENTER_FUNC); a = true; } if (SET_MENU_LEVEL (CHILD)) a = true; break; void Callback_Func (void) { SET_MENU_LEVEL (KAKOE_TO_MENU); } В этом случае будет рекурсия. Скажу честно, не разбирался с этой особенностью. Просто учитываю этот нюанс.
  9. Речь не об уровнях меню. Уровней меню может быть сколько угодно. Главное - памяти чтобы хватило. Речь о входе в MicroMenu. Вход должен быть только один. Зашли, вышли. Если в callback будет ещё один вход, программа зациклится. Пример. Пусть мы зашли по CHILD, в callback будет ещё один вход по PARENT, CHILD, NEXT, PREV. Программа зациклится. Будет постоянный переход по указанному макросу.
  10. В очередной раз убеждаюсь, что на данный момент лучше MicroMenu пока ничего нет. Но, нужно аккуратно работать. Так как указатели на указатели на указатели. Я когда начал разбираться, да ещё тогда на асме писал, мой моск чуть не взорвался. Держать у уме все это. После этого я перешёл на си. Стало проще. Более объектно стало. В MicroMenu можно использовать только один слой. Если слой будет завернут ещё в один слой, случится бесконечная рекурсия. То есть. При использовании нужно заходить в MicroMenu 1 раз. Если в callback будет ещё один вход, программа зациклится.
  11. Ааааа!!! Посыпаю голову пеплом! Банальный и беспощадный копипаст! В обработчиках кодов кнопок NEXT и PREV у PREV стоял параметр функции NEXT. Епрст. Еклмн. Гребаный стыд и позор! Вычислил по тестовому отображению адресов таблицы MicroMenu. Нажимая на кнопки поочерёдно NEXT и PREV адреса устанавливались при PREV как при NEXT. Полез разбираться и увидел. Матерился долго и смачно. Полночи вчерашнюю убил на разбирательство. Исправил. Всё чётко работает. И синхронизацию процессов заодно поправил. Благодарю за внимание, прастыте, что отвлек, побеспокоил. 🙂
  12. Что то не так. Продолжаю разбираться....
  13. Отчёт. У меня используются в этих блоках управления ионисторы. Алгоритм работы: при подаче питания считываются параметры из EEPROM SRAM. На питании 24 вольта стоит оптрон. Когда питание сняли, за счёт ёмкостей блока питания мк успевает определить, что снято питание 24 V, переходит в урезанный цикл, и за счёт ионистора перегоняет все параметры в EEPROM. Из за ионистора и пониженного напряжения фьюзы BODEN нужно выставить 2,7 вольта. Проверил. Есть. Заменил МК на ATMEGA8535. Такая же картина. Перенастроил сторожевой на 2 с. Мало ли, вдруг где то зациклился. Хотя не вариант. Точно этого не может быть. Системный тик 1 мс. Но мало ли. Не помогло. Урезал проект до минимума. Не помогло. И тут я понял. Рассинхронизация программных модулей. Ведь по кнопке ESC возврат в исходное происходит исправно. И по нажатию ENTER заходит. Рассинхронизация навигации по меню и Blink пунктов меню. С MicroMenu я сделал общую функцию опроса кодов кнопок и действий. И эта функция работает поверх КА меню. А если Switch-case, то это в нужных состояниях. И потому со Switch-case все работало. А эта функция работает поверх и совершает нужные действия насильно.
  14. Все что может меняться, я вывел на дисплей. Коды кнопок и все остальное выводится в требуемом состоянии конечного автомата. Все выводимые переменные показывают корректные данные. Возможно, что то упустил. Сегодня буду дальше ковырять. Аппаратных средств отладки мк на данный момент нет. Всё эти годы все косяки и ошибки выявлял в симуляторе AVR Studio, текстовыми кусками кода. Окончательный прогон на железе. Повторяю. На Switch-case все работает идеально. Но это увеличение, разбухания кода. Есть одна мысль. Тогда, 2013 году, когда писал проект, выяснилось, что IAR некорректно выдал выхлоп на запись EEPROM у ATMEGA32, 32A. ATMEGA8535 нормально. Возможно, здесь и сейчас есть та же проблема. Проверю, отпишусь. Сергей Борщ, приветствую! Рад видеть в обсуждении.
  15. Всем привет. Есть проект 2012-2013 года. Небольшая партия блоков управления термоформовочными станками. Станки исправно работают круглосуточно все это время. Недавно обратились. Всплыли проблемки. Я открыл проект, и понял, что программу лучше переписать заново. Я тогда только перешёл на си. Сейчас у меня другие подходы, наработки. Итак, столкнулся с проблемой. Меню. Давно применяю MicroMenu. Отличный вариант для МК. Других вариантов пока так и не нашел. И именно с MicroMenu вылезло непонятное поведение программы. В железе нажимаю кнопки следующий пункт, предыдущий. Если доходит до конца, до начала, несколько нажатий туда-сюда, и мк перестаёт реагировать на кнопки NEXT, PREV. На кнопку Esc реакция есть. Возврат на исходное состояние. В таблицах переходов криминала не вижу. Сделал в лоб. Без MicroMenu. Switch-case. Все чётко работает. Сделал тестовые куски кода. Вывод на символьный дисплей коды кнопок, счётчик пунктов, некоторые переменные, содержимое указателя на таблицу. При затыке значение счётчика пунктов при нажатии на кнопки NEXT, PREV не меняется. Коды кнопок верные. Состояние остальных переменных без криминала. Указатель на таблицу переходов показывает верные адреса. Было подозрение на срыв стека. Увеличил. Не помогло. Проект делаю дома. IAR. Си. Сейчас я на работе. Накидываю план действий. Заменить мк. Возможен контрафакт. Раньше проблем с MicroMenu не было. Стек увеличивал. Не помогло. Куда копать дальше, пока мыслей нет. Все остальное в программе, где используются таблицы (не micromenu) работает чётко. Вечером проверю питание. Фьюзы контроля питания, заменю мк. Также попробую использовать обычные таблицы. Если проблема в стеке, то на данный момент я не знаю, в какие настройки IAR соваться. Возможное воздействие прерываний проверил. На данный момент прерывание только одно. Timer2. Программные таймеры. В библиотеке есть два варианта работы программных таймеров. С прерыванием таймера и без. Изменений нет. Программа сбоит. Попробую ещё поэтапно урезать проект, оставить только клавиатуру и меню. МК ATMEGA32A. Что подскажете?
  16. Всем привет. Если не работает, и непонятно почему, то: Помнить, что сторонние программаторы и стороннее программное обеспечение (не ATMEL, MICROCHIP) могут инвертировать fuses биты. У AVR незапрограммированный бит это 1. Запрограммированный 0. Это проверить в первую очередь. Лучше всего в калькуляторе выставить нужные биты и вставлять значения high и low напрямую вставкой. Так вы будете защищены от ошибочного инвертирования fuses битов. Второй шаг. Убрать всю обвязку. Оставить только голый МК и кварц, при наличии. Написать простейшую тестилку. Использовать аппаратный таймер. Настроить на известное время. И по таймеру выставлять настроенный как выход пин. на выход светодиод, осциллограф, по вкусу и возможностям. Дальнейшие шаги только после этих проверок. По схеме криминала не вижу. Главное, если АЦП не используется, то и не трогать его в программе. Схему подключения AVDD по умолчанию смотреть в даташите на конкретный МК. Пин Reset. Резистор 10 к нормально. конденсатор лучше на 0.1 мкФ. если ёмкость больше, ну значит МК запустится чуток позже. не критично. Срыв стека и прочие догадки только после описанной выше проверки. Ну и тщательная проверка монтажа, конечно же. Проверить МК на потребление тока, нагрев. По поводу контрафакта. Тут нужно иметь на руках выбор мк. опять же, простейшая программа тестилка все покажет.
  17. Делюсь своим примером программных таймеров. Конечные автоматы. Автоматное программирование. Программные таймеры.
  18. Вообще-то TWINT при включенном TWIE аппаратно сбрасывается при срабатывании прерывания. Или нет?
  19. //======================================================================== #include "soft_spi.h" //======================================================================== //======================================================================== u08 soft_spi_receive_buf [SOFT_SPI_BYTES]; u08 soft_spi_transf_buf [SOFT_SPI_BYTES]; //======================================================================== //======================================================================== void soft_spi_init (void) { set_bit (MOSI_SOFT_SPI_DDR, MOSI_SOFT_SPI); set_bit (SCK_SOFT_SPI_DDR, SCK_SOFT_SPI); set_bit (LATCH_OUT_DDR, LATCH_OUT); } //------------------------------------------------------------------------ void soft_spi_transf (u08 soft_spi_cnt) { u08 data = soft_spi_transf_buf [soft_spi_cnt]; u08 i; for (i = 0; i < 8; i++) { __watchdog_reset (); if (data & 0x80) mosi_soft_spi_hi (); else mosi_soft_spi_lo (); data <<= 1; delay_us (SOFT_SPI_DELAY/2); sck_soft_spi_hi (); delay_us(SOFT_SPI_DELAY/2); sck_soft_spi_lo (); delay_us (SOFT_SPI_DELAY/2); } } //======================================================================== //======================================================================== void strob_latch_out (void) { set_bit (LATCH_OUT_PORT, LATCH_OUT); strob_delay (); clr_bit (LATCH_OUT_PORT, LATCH_OUT); } //------------------------------------------------------------------------ void strob_delay (void) { u08 a = 16; while (a--); } //========================================================================
  20. Слишком сложно. Лучше MicroMenu для микроконтроллеров не нашел для себя.
  21. Делать прерывание все-таки по фронту. Если вы предполагаете ситуацию, когда МК включили при низком уровне на внешнем прерывании, тогда да, обработки не будет, так как нужна смена сигнала. Этот момент тоже легко решается. Проверкой пина внешнего прерывания. Если низкий уровень, считываем данные, после этого АЦП перезапустится и программа будет штатно работать от внешнего прерывания.
  22. Народ!!! Отзовитесь, кто работал с этой микросхемой. Приобрел программатор MiniProg 3. И не вижу микросхемы в списке программного обеспечения. В какой программе работать с этой микросхемой?
  23. Тензодатчик - металлический брусок. Измеряемый вес - до нескольких тонн. Нам нужно, чтобы это была небольшая плата, которая ставится прямо в тензодатчик.
×
×
  • Создать...