На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Имитация логических схем. , Программная реализация логических элементов.
      Доброго времени суток, пытаюсь организовать работу логической схемы программно на AVR ATMega 16, подобную задачу решаю в первый раз, по-дозреваю, что для облегчения данной задачи должны быть готовые классы, но не как не могу найти, не примеров, не чего то подобного. Вот часть схемы (Блок выделения четных и нечетных единичных импульсов):
      Прикреплённая картинка
      Прикреплённая картинка

      Помогите с написанием кода для этого кусочка схемы, дальше думаю разберусь. (Блок INF в схеме представляет собой генератор случайного кода)
      Язык С++, среда CodeVisionAVR.
      Сообщение отредактировано: marks90 -
        Цитата marks90 @
        Доброго времени суток, пытаюсь организовать работу логической схемы программно на AVR ATMega 16, подобную задачу решаю в первый раз, по-дозреваю, что для облегчения данной задачи должны быть готовые классы, но не как не могу найти

        Самое простое это низкоуровневое программирование. С классами сложнее, так как классы это высокий уровень. Всё что вам нужно это выучить операторы которые даёт вам компилятор "+","-","and","or","xor","not".
        Делаешь цикл.

        a=Inf; - я так понимаю что он уже есть. Если нет возьми Rand
        a=triger xor a;
        triger=a;
        b=not a;
        Этот код должен быть внутри цикла, частота цикла соответствует вашим 200Гц.
        Сообщение отредактировано: Pavia -
          Цитата Pavia
          a=Inf; - я так понимаю что он уже есть. Если нет возьми Rand
          a=triger xor a;
          triger=a;
          b=not a;

          Спасибо. Вас понял, буду описывать логические операции каждого элемента схемы.

          Столкнулся с первой проблемой, триггер работает не так как надо:
          вот
          Прикреплённая картинка


          Описан согласно этой схеме: (должен работать как делитель на 2)
          вот
          Прикреплённая картинка


          Сам код триггера: (тип данных каждой переменной bit)
          ExpandedWrap disabled
                for(;;) {
                    a =  rand()%2; // генерируем передаваемый код
                    b++; // генератор импульсов
             
                    c = a & b; // и
             
                    /* D триггер */
                    d2 = d & b;
                    d2 = !d2;
                    d3 = d2 & b;
                    d3 = !d3;
                    e = d2 & d;
                    e = !e;
                    d = d3 & e;
                    d = !d;
                    /* конец D триггер */
                    
                    PORTB.0 = b; // генератор
                    PORTB.1 = d; // удвоенный инвертированный импульс генератора
                    PORTB.2 = e; // удвоенный импульс генератора
                };

          Что не так? Описал каждый элемент... чего ему не хватает?
          Сообщение отредактировано: marks90 -
            Цитата
            Что не так? Описал каждый элемент... чего ему не хватает?

            Ты описал последовательно, а тригер работает параллельно вернее асинхронно.
            Т.е. тебе надо запомнить старое состояние всей системы и применять операции к старому состоянию, а по окончанию работы сохранить новое состояние как старое. А вернее надо учесть что после каждого логического элемента с обратной связью рождается своё состояние. Можно это строго математически описать далее что-бы упростить перейти от недетерминированной системы к детерминированной.
            Но не думаю что вам это нужно, гораздо проще понять суть работы тригера и реализовать согласно тому как он работает.

            http://ru.wikipedia.org/wiki/Триггер
            Вот посмотрите на граф перехода и таблицу состояний и реализуй согласно этому описанию.
            Тригер можно воспринимать как элемент которые запоминает 1 бит информации.
              В си не шарю.
              с1 = a&b ; новое состояние по входу с триггера
              if (c1 != c) & (c1 == 1) ;
              {
              q = !q ; инверсия выхода триггера по восходящему фронту на С
              }
              с = c1
              Сообщение отредактировано: Prince -
                Цитата marks90 @
                Описан согласно этой схеме: (должен работать как делитель на 2)

                Схема, очевидно, с ошибкой.
                Вход D подключен к выходу d. И одновременно - к выходу внешней управляющей схемы.
                Так нельзя. Два выхода соединяются вместе.
                Точно сходу не скажу, но подозреваю, что эта схема вообще правильно работать не может.
                Это не D-триггер.
                Также, в программе нужно предусмотреть начальное состояние триггера.
                Посмотри это.
                На первой странице нарисована внутренняя логика 74LS74.
                Её можно упростить, в результате получишь правильный D-триггер.
                Сообщение отредактировано: ЫукпШ -
                  А для чего внутренности триггера моделировать?
                    Цитата ЫукпШ
                    Схема, очевидно, с ошибкой.
                    Вход D подключен к выходу d. И одновременно - к выходу внешней управляющей схемы.
                    Так нельзя. Два выхода соединяются вместе.
                    Точно сходу не скажу, но подозреваю, что эта схема вообще правильно работать не может.
                    Это не D-триггер.
                    Также, в программе нужно предусмотреть начальное состояние триггера.

                    :huh: Схема без ошибок, вот. А то что с выхода "не Q" мы подаём состояния на вход D, не чего странного, так и должно быть. (при таком соединение Д триггер работает как делитель на 2).

                    Цитата Prince
                    А для чего внутренности триггера моделировать?

                    Думал так проще будет, просто описывать логику работы каждого элемента по действиям. не тут то было.. А если вообще то, пытаюсь данную схему перенести в микроконтроллер. (заменить кучку стандартных микросхем одним запрограммированным микроконтроллером)
                    -------------
                    Вот что получилось, но это опять же как делитель...
                    ExpandedWrap disabled
                      /* D тригер */
                              c++; // такты
                              if(c == 1){
                                  hc = 1;
                              }
                              if(c == 0){
                                  if(hc == 1){
                                      Q = D;
                                      Q1 = !Q;
                                      hc = 0;
                                  }
                              }
                              Q1; // не
                              Q;  // прямой
                       /* конец D тригер */

                    А дальше по схеме Д триггер не в качестве делителя… + RS.. Опять запары..
                    Сообщение отредактировано: marks90 -
                      :wall:
                      Сообщение отредактировано: marks90 -

                      Прикреплённая картинка
                      Прикреплённая картинка
                        Цитата
                        Думал так проще будет, просто описывать логику работы каждого элемента по действиям. не тут то было..

                        Элемент можно рассматривать как черный ящик, описывая его реакцию на внешние сигналы.
                        В случае D триггера в счётном режиме, нужно просто отлавливать фронт по входу "С" и инвертировать состояние "триггера". Не в счётном режиме добавится проверка состояния на входе D, от чего будет зависеть выход Q.

                        Цитата
                        А если вообще то, пытаюсь данную схему перенести в микроконтроллер.

                        Какую функцию схема в натуре выполняет? Вообще? В составе чего работает? Что такое inf?
                        Сообщение отредактировано: Prince -
                          Цитата Prince @
                          Какую функцию схема в натуре выполняет

                          Имхо - никакую. Идет программное моделирование поведения жесткой логики средствами микроконтроллера:
                          Цитата marks90 @
                          среда CodeVisionAVR.
                          :D
                          Цитата Prince @
                          Вообще? В составе чего работает?

                          Ну, к примеру, в составе Протеуса... :D
                          Цитата Prince @
                          Что такое inf?

                          Цитата marks90 @
                          Блок INF в схеме представляет собой генератор случайного кода)
                            RS триггер асинхронный. Простая проверка условий по входу.
                            R S Q
                            0 0 не меняется
                            0 1 1
                            1 0 0
                            1 1 0
                            Хотя нет, не совсем простая проверка. Надо проанализировать схему, и исключить неопределенную ситуацию при возможном переходе от 11 к 00, по входам.
                            Сообщение отредактировано: Prince -
                              Цитата
                              Элемент можно рассматривать как черный ящик, описывая его реакцию на внешние сигналы.
                              Какую функцию схема в натуре выполняет? Вообще? В составе чего работает? Что такое inf?

                              Я примерно предполагаю к чему вы ведёте, но рассматривать всю схему как чёрный ящик увы не получится, по причине её "нелинейной" работы.
                              1. Вся схема (реализуемая в мк) целиком, подготавливает информационную последовательность (её выдаёт блок inf) для передачи. В последующем эта последовательность пойдёт на квадратуру где будет модулирована "MSK - модуляция".
                              2. В составе полной схемы (реализуемой в мк) входят:
                              a) Блок выделения четных и нечетных единичных импульсов. (это первая часть схемы (рисунок в первом посте)) вроди как уже реализован))
                              b) Блок выделения нулевых бит информации, следующих после не-четных единичных бит. (это вторая часть схемы тоже вылаживал в предыдущем сообщении)
                              с) Блок разделения входной последовательности на четные и нечет-ные биты. (ещё не брался)
                              d) Логическая схема блока формирования модуляционных кодов квадратурных каналов. (ещё не брался)
                              3. inf - это генератор того самого кода который будет передаваться (выход 1 без инверсии выход 2 с инверсией).
                              Вечером постараюсь полную схему выложить.
                              Сообщение отредактировано: marks90 -
                                Цитата
                                Вся схема (реализуемая в мк) целиком, подготавливает информационную последовательность (её выдаёт блок inf) для передачи.

                                Шифратор? :unsure:

                                Цитата
                                Блок выделения четных и нечетных единичных импульсов.

                                Импульсов чего?
                                INF - это входящая последовательность.
                                А 200 Гц - это что за импульсы?
                                1001000001100010101011110110001011
                                Я правильно разделил четные и нечетные единичные импульсы(чего-то)?
                                Цитата
                                Блок выделения нулевых бит информации, следующих после не-четных единичных бит. (это вторая часть схемы тоже вылаживал в предыдущем сообщении)

                                1001000001100010101011110110001011
                                Так?
                                Цитата
                                Блок разделения входной последовательности на четные и нечет-ные биты. (ещё не брался)

                                100011010000
                                Так?

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

                                  Добавлено
                                  А судя по тексту первого сообщения - таки не понимает.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,1750 ]   [ 22 queries used ]   [ Generated: 19.04.24, 00:44 GMT ]