На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Имитация логических схем. , Программная реализация логических элементов.
      Доброго времени суток, пытаюсь организовать работу логической схемы программно на 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 -
                                  Думается мне, что автор темы просто не понимает, что делает.
                                  Если это реальная задача, то вместо предложенного здесь бесконечного цикла заводится таймер и в его обработчике выполняются необходимые действия.

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

                                    Та это мелочи. У меня есть предположение, что часть блоков, моделируемых на уровне принципиальной схемы "в лоб" на си( :ph34r: ), можно заменить несколькими строчками относительно понятного кода.
                                    Сообщение отредактировано: Prince -
                                      Такой подход с имитацией электрических схем используется в ПЛИС. В микроконтроллерах имитируют алгоритм работы.

                                      Добавлено
                                      Цитата Prince @
                                      У меня есть предположение, что часть блоков, моделируемых на уровне принципиальной схемы "в лоб" на си( :ph34r: ), можно заменить несколькими строчками относительно понятного кода.
                                      именно так.
                                        Цитата Prince @
                                        Шифратор?

                                        Можно сказать и так.
                                        Объясняю, что для чего и почему:
                                        в железе имеется "цифровой" радио передатчик способный передавать цифровой код поданный ему на вход (на схеме блок inf), логика работы преобразования жёстко задана (описал по пунктам в предыдущем сообщении) микросхемами цифровой логики (TTL), дак-вот задача заключается в том чтобы заменить кучу микросхем с жёсткой логикой на один запрограммированный микро контролер. Данную процедуру можно назвать и шифрованием но посуте она является переориентацией кода для блока формирования квадратурных компонент I(t), Q(t) и получения в дальнейшем определённого типа модуляции "MSK".
                                        Если на пальцах: чтобы получит отличные(разные) частоты несущей во время подачи 0 и 1 необходимо выполнить данные преобразования входящего кода.
                                        вот
                                        Прикреплённая картинка

                                        Цитата Prince @
                                        Импульсов чего?
                                        А 200 Гц - это что за импульсы?
                                        Я правильно разделил четные и нечетные единичные импульсы(чего-то)?

                                        1. Входящего кода (Поступающего с блока inf)
                                        2. 200 Гц - это импульсы задающие частоту (скорость) работы схемы.
                                        3. Единичные импульсы выделены не верно, следовательно и во 2м примере тоже не верно, вот должно быть:
                                        ExpandedWrap disabled
                                          1001000001100010101011110110001011  // передаваемый код
                                          0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   // не чётные позиции 0
                                          1000000000100010101010100010001010  // не чётные единицы (результат работы первого блока схемы (а))
                                          0110000000011101010100000001110100  // выделение 0 после нечётной единицы (b)
                                          Что на диаграмме есть что?

                                          Цитата
                                          200 Гц - это импульсы задающие частоту (скорость) работы схемы.

                                          ну как бы понятно, что это некий опорный генератор. Но какую функцию конкретно он выполняет? Что это такое - частота работы схемы?
                                          Вот у вас есть последовательность данных. С частотй 200 Гц происходит выборка очередного бита данных и некое кодирование?
                                          На вход кодера поступают биты, скорость 200 бод, правильно? И с такой же скоростью появляется на выходе(выходах) какая-то последовательность. Правильно?

                                          Цитата
                                          1001000001100010101011110110001011 // передаваемый код
                                          1000000000100010101010100010001010 // не чётные единицы (результат работы первого блока схемы (а))
                                          0110000000011101010100000001110100 // выделение 0 после нечётной единицы (b)

                                          На асме это выглядело бы примерно так:
                                          ExpandedWrap disabled
                                            ; подпрограмма кодирования бита
                                            ; допустим, на PB0 поступает входная последовательность.
                                            ; y - выход кодера
                                            ; cnt - счётчик битов tr - триггер выделения 0 после нечётной единицы
                                            ; y,cnt,tr - 8-и битные регистры
                                            ; y,tr хранят 1 бит полезной информации, их можно хранить и в одном регистре, цельных 2 регистра для наглядности...
                                            ;.def y = R21
                                            ;.def cnt = R22
                                            ;.def tr = R23
                                            coder:
                                            inc cnt ;
                                            sbis PINB,PINB0 ;
                                            rjmp log0
                                             
                                            log1:
                                            clr y
                                            clr tr
                                            sbrc cnt,0
                                            ser tr
                                            rjmp end_coder
                                             
                                            log0:
                                            clr y
                                            sbrc tr,0
                                            ser y
                                             
                                            end_coder:
                                            ret
                                          Сообщение отредактировано: Prince -
                                            Цитата marks90 @
                                            :huh: Схема без ошибок, вот.

                                            Да не правда это !
                                            Приведённая схема не соответствует 155TM2(SN7474).
                                            Даже мнемоническое изображение не соответствует TM2.
                                            Твои результаты это подтверждают.

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

                                            Надо понимать, что схема содержит обратную связь (положительную) и за один проход
                                            алгоритма ты можешь и не рассчитать её состояние правильно.
                                            Сообщение отредактировано: ЫукпШ -
                                              Цитата Prince @
                                              Что на диаграмме есть что?

                                              В нижней части (прямоугольные импульсы) тот самый передаваемый сигнал.
                                              В верхней части (синусоида) несущая, частота которой меняется согласно уровню нижних импульсов.

                                              Цитата Prince @
                                              ну как бы понятно, что это некий опорный генератор. Но какую функцию конкретно он выполняет? Что это такое - частота работы схемы?
                                              Вот у вас есть последовательность данных. С частотой 200 Гц происходит выборка очередного бита данных и некое кодирование?
                                              На вход кодера поступают биты, скорость 200 бод, правильно? И с такой же скоростью появляется на выходе(выходах) какая-то последовательность. Правильно?

                                              именно так. к сожалению с ассемблером я совершенно не знаком и в приведённом вами примере мне не разобраться, попробую рассмотреть каждую часть схемы (a,b,c..) как чёрный ящик и получать готовую последовательность на выходе (как в вашем примере) только на C.

                                              Цитата ЫукпШ @
                                              Надо понимать, что схема содержит обратную связь (положительную) и за один проход
                                              алгоритма ты можешь и не рассчитать её состояние правильно.

                                              теперь я понял, с обратной связью действительно ерунда получается, да и как уже упоминал "Pavia-> получилось последовательно, а тригер работает параллельно вернее асинхронно".

                                              Цитата ЫукпШ @
                                              Да не правда это !

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

                                                  Цитата
                                                  чтобы получит отличные(разные) частоты несущей во время подачи 0 и 1 необходимо выполнить данные преобразования входящего кода.

                                                  На кой, для того, чтобы получить разные частоты несущей, нужны эти преобразования?
                                                  Кто генерирует несущую и как управляется генератор несущей? Или 2 генератора? Или генератор будет прямоугольных импульсов, реализованный програмно, а на выходе фильтр?

                                                  Ничего непонятно.
                                                  Пора возвращаться к началу и спрашивать "что это будет", "как оно должно работать", о входных/выходных сигналах... :-?
                                                  Сообщение отредактировано: Prince -
                                                    Генератор (что на схеме) 200Гц необходим только для обеспечения работы логики (данной схемы, тех пунктов, что описаны выше), для последующей квадратуры есть другой генератор и вообще то что будет с сигналом дальше к этой теме не относится, задача заключается в реализации тех модулей что я описывал.
                                                    И да, модуляция будет (там даже не модуляция а манипуляция чистоты несущей, ну можно назвать и частотной модуляцией.) но это всё уже есть и организовано в железе, всё работает, нужно только научить микроконтроллер преобразовывать поступающий в него код по описанным выше пунктам (a, b, c..) и выдавать его уже преобразованный на выход (ногу мк).

                                                    Что касается черного ящика: получилось организовать часть "a) Блок выделения четных и нечетных единичных импульсов." :D
                                                    ExpandedWrap disabled
                                                      // ---------------- Блок выделения четных и нечетных единичных импульсов (как черный ящик) ------------- //
                                                          if(a){ // считаем положительные уровни
                                                              nomer++;
                                                          }
                                                          if(nomer == 4294967295){ // предотвращаем переполнение выделенной памяти для переменной
                                                              nomer = 1;
                                                          }
                                                          if((nomer % 2) != 0){ //выбираем только четные - нечетные положительные уровни
                                                              Q0 = 1; // не четное
                                                              Q01 = 0; // для четной
                                                          }else{
                                                              Q0 = 0; // не четное
                                                              Q01 = 1; // для четной
                                                          }
                                                          if(a == 0){ // Если нет 1 то при любом раскладе 0
                                                              Q0 = 0;
                                                              Q01 = 0;    
                                                          }
                                                          Q0; // четные единицы
                                                          Q01; // не чётные единицы
                                                      // --------------------------------------------------------------------------------------//
                                                      Цитата marks90 @
                                                      ... но простейший способ организации на жесткой логике возможен именно по этой схеме.

                                                      В том то и дело, что в данном случае - невозможен.
                                                      Чтобы на D-триггере сделать делитель частоты пополам, нужно, чтобы
                                                      сигнал С воспринимался "по фронту" (как у 74LS74). А в приведённой схеме он работает
                                                      "по уровню". Отсюда и проблемы.
                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                      0 пользователей:


                                                      Рейтинг@Mail.ru
                                                      [ Script execution time: 0,2343 ]   [ 24 queries used ]   [ Generated: 25.04.24, 14:37 GMT ]