• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

ARV

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

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

  • Посещение

  • Дней в лидерах

    3

Последний раз ARV выиграл 20 октября

Публикации ARV были самыми популярными!

Репутация

261 Хороший

2 подписчика

О ARV

  • Звание
    Завсегдатай

Информация

  • Пол
    Мужчина
  • Город
    Новочеркасск

Электроника

  • Стаж в электронике
    Более 20 лет
  • Сфера радиоэлектроники
    Микроконтроллеры, цифровая электроника

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

1 841 просмотр профиля
  1. Преобразование массива в код (Си)

    Если считать количество вспышек по сигналу СОМ, то можно реализовать именно тот алгоритм, который и был задуман: если рычаг переключателя возвращен в нейтральное положение до первой вспышки, то делать ТРИ вспышки, а если после хотя бы одной вспышки, то уже не делать... @Yurkin2015 , вот что значит нормально нарисованная схема - как-то и алгоритм сразу стал ясен... Плюс вам.
  2. max7219 матрица и avr , перевернуть символы

    Так может проблема не в SPI, а в схеме?
  3. max7219 матрица и avr , перевернуть символы

    Что получается? Я не понимаю, как SPI может влиять на знакогенератор... что там зашито, то и будет выведено Или вы хотите сказать, что вместо ABC выводится ААА?
  4. max7219 матрица и avr , перевернуть символы

    Как именно перевернуть? По отношению к фото - на 180 градусов относительно горизонтали? Т.е. чтобы буквы выводились в столбик не вверх ногами? Или вы хотите выводить ВДОЛЬ матрицы?
  5. Преобразование массива в код (Си)

    Каждый кружочек-состояние - это отдельный case в switch, причем каждое состояние тоже в свою очередь может иметь свой граф внутренних состояний со своим switch-ем... Каждая стрелочка - это оператор присваивания нового значения переменной состояния. Надпись над стрелочкой - if или аналогичный оператор выбора... как-то так
  6. Преобразование массива в код (Си)

    Ну нету у меня под руками ничего получше, чем вебка ноутбука... разберетесь?
  7. Преобразование массива в код (Си)

    Ага, так и есть - моргание это действие, т.е. состояние. Только в вашей таблице это не действие, а статическое состояние - моргание по вашей таблице состоит из двух строчек - горение и не_горение, т.е. строки 2 и 4
  8. Преобразование массива в код (Си)

    Вспомогательная таблица
  9. max7219 матрица и avr , перевернуть символы

    Ну как же так можно: простейший код раскатать на страницу?! Вам самого себя не жалко - это вот писать и потом читать?! void spi_out(uint8_t data){ CS0; for(uint8_t mask = 0x80; mask; mask >>= 1){ if(data & mask) DATA1; else DATA0; SCK1; SCK0; } CS1; } Никаких задержек на 10 микросекунд не надо - или у вас на тиратронах собрано все?
  10. Преобразование массива в код (Си)

    5 состояние - не аварийка ли это? Если да, то рассматривать "спасибо" и "задний ход" отдельно смысла нет - тоже отдельные состояния. Но вообще-то граф состояний делается по действиям, т.е. состояние - это действие. Например: мигание левым - это состояние. Все выключено - это состояние. Мигание обоими - это состояние. Как-то так... Боюсь, я вас окончательно запутал
  11. Преобразование массива в код (Си)

    Осознать-то я осознал, а понять - не понял
  12. Преобразование массива в код (Си)

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

    Могут быть, но в целом абстрактное STATE_XXXX может быть совершенно никак не связано с конкретными значениями чего-либо - это всего лишь абстракция, нужная для логического разделения программы на функциональные участки. Если начнете присваивать константам в enum конкретные значения, делать это надо так: enum { CONST_0, // если принудительно не задано, то первая константа всегда равна 0 CONST_1 = 2, CONST_2 = 5, CONST_3, // если принудительно не задано, то будет на 1 больше предыдущего, т.е. 6 ... }
  14. Преобразование массива в код (Си)

    typedef - определение пользовательского типа, т.е. вы вводите новый тип на основе "стандартных" сишных. enum - особый "стандартный" тип ПЕРЕЧИСЛЕНИЕ, т.е. просто набор констант. переменная этого типа должна принимать только одно из перечисленных значений (хотя Си, конечно, никак это не контролирует). Очевидно так. Из-за некоторого сумбура в коде и многоэтажности if-ов четкое деление на отдельные состояния не прослеживается, вот я и предложил более "традиционный" вариант. Вплоть до выделения каждого состояния в отдельную функцию, возвращающую новое значение состояния.
  15. Преобразование массива в код (Си)

    Чем сильнее я вникаю в ваш проект, тем больше прихожу к мнению, что лучше автомата конечных состояний вам ничего не придумать... В чем смысл. У вас есть состояния, характеризуемые тем или иным состоянием ВЫХОДОВ. Чтобы поменялось состояние выходов, надо изменить общее состояние, а это происходит по тем или иным сигналам извне. Вот то, что вы мне описали, как нельзя лучше этому соответствует: у вас есть состояние ожидания команды, при поступлении команды происходит переход в состояние ожидания паузы этой команды, из которого может быть переход в следующее состояние и т.д. В каждом состоянии вы анализируете условия выхода из него и в зависимости того, какие условия совпали, задаете новое состояние. Очень абстрактно-укрупненно (и с магическими числами) это выглядит так: // перечень возможных состояний typedef enum{ STATE_1, STATE_2, STATE_3, ... STATE_N } state_t; // переменная текущего состояния state_t state = STATE_1; // исходное состояние // главный цикл while(1){ switch(state){ case STATE_1: if(get_command() == CMD_1) // проверяем условия перехода state = STATE_2; // если пришла нужная команда, то новое состояние // а иначе торчим в этом состоянии // и можем делать что-то полезное для этого состояния break; case STATE_2: // делаем что-то полезное для этого состояния и // проверяем условия перехода из этого состояния в другие break; ... // и так далее для всех состояний } } Т.е. в каждом состоянии 2 варианта поведения: либо остаться в этом состоянии и делать то, что надо, либо перейти в другое (любое) состояние.