Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.42.168] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток, пытаюсь организовать работу логической схемы программно на AVR ATMega 16, подобную задачу решаю в первый раз, по-дозреваю, что для облегчения данной задачи должны быть готовые классы, но не как не могу найти, не примеров, не чего то подобного. Вот часть схемы (Блок выделения четных и нечетных единичных импульсов):
Прикреплённая картинка
Помогите с написанием кода для этого кусочка схемы, дальше думаю разберусь. (Блок INF в схеме представляет собой генератор случайного кода) Язык С++, среда CodeVisionAVR. |
Сообщ.
#2
,
|
|
|
Цитата marks90 @ Доброго времени суток, пытаюсь организовать работу логической схемы программно на AVR ATMega 16, подобную задачу решаю в первый раз, по-дозреваю, что для облегчения данной задачи должны быть готовые классы, но не как не могу найти Самое простое это низкоуровневое программирование. С классами сложнее, так как классы это высокий уровень. Всё что вам нужно это выучить операторы которые даёт вам компилятор "+","-","and","or","xor","not". Делаешь цикл. a=Inf; - я так понимаю что он уже есть. Если нет возьми Rand a=triger xor a; triger=a; b=not a; Этот код должен быть внутри цикла, частота цикла соответствует вашим 200Гц. |
Сообщ.
#3
,
|
|
|
Цитата Pavia a=Inf; - я так понимаю что он уже есть. Если нет возьми Rand a=triger xor a; triger=a; b=not a; Спасибо. Вас понял, буду описывать логические операции каждого элемента схемы. Столкнулся с первой проблемой, триггер работает не так как надо: вот
Описан согласно этой схеме: (должен работать как делитель на 2) вот
Сам код триггера: (тип данных каждой переменной bit) 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; // удвоенный импульс генератора }; Что не так? Описал каждый элемент... чего ему не хватает? |
Сообщ.
#4
,
|
|
|
Цитата Что не так? Описал каждый элемент... чего ему не хватает? Ты описал последовательно, а тригер работает параллельно вернее асинхронно. Т.е. тебе надо запомнить старое состояние всей системы и применять операции к старому состоянию, а по окончанию работы сохранить новое состояние как старое. А вернее надо учесть что после каждого логического элемента с обратной связью рождается своё состояние. Можно это строго математически описать далее что-бы упростить перейти от недетерминированной системы к детерминированной. Но не думаю что вам это нужно, гораздо проще понять суть работы тригера и реализовать согласно тому как он работает. http://ru.wikipedia.org/wiki/Триггер Вот посмотрите на граф перехода и таблицу состояний и реализуй согласно этому описанию. Тригер можно воспринимать как элемент которые запоминает 1 бит информации. |
Сообщ.
#5
,
|
|
|
В си не шарю.
с1 = a&b ; новое состояние по входу с триггера if (c1 != c) & (c1 == 1) ; { q = !q ; инверсия выхода триггера по восходящему фронту на С } с = c1 |
Сообщ.
#6
,
|
|
|
Цитата marks90 @ Описан согласно этой схеме: (должен работать как делитель на 2) Схема, очевидно, с ошибкой. Вход D подключен к выходу d. И одновременно - к выходу внешней управляющей схемы. Так нельзя. Два выхода соединяются вместе. Точно сходу не скажу, но подозреваю, что эта схема вообще правильно работать не может. Это не D-триггер. Также, в программе нужно предусмотреть начальное состояние триггера. Посмотри это. На первой странице нарисована внутренняя логика 74LS74. Её можно упростить, в результате получишь правильный D-триггер. |
Сообщ.
#7
,
|
|
|
А для чего внутренности триггера моделировать?
|
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ Схема, очевидно, с ошибкой. Вход D подключен к выходу d. И одновременно - к выходу внешней управляющей схемы. Так нельзя. Два выхода соединяются вместе. Точно сходу не скажу, но подозреваю, что эта схема вообще правильно работать не может. Это не D-триггер. Также, в программе нужно предусмотреть начальное состояние триггера. Схема без ошибок, вот. А то что с выхода "не Q" мы подаём состояния на вход D, не чего странного, так и должно быть. (при таком соединение Д триггер работает как делитель на 2). Цитата Prince А для чего внутренности триггера моделировать? Думал так проще будет, просто описывать логику работы каждого элемента по действиям. не тут то было.. А если вообще то, пытаюсь данную схему перенести в микроконтроллер. (заменить кучку стандартных микросхем одним запрограммированным микроконтроллером) ------------- Вот что получилось, но это опять же как делитель... /* D тригер */ c++; // такты if(c == 1){ hc = 1; } if(c == 0){ if(hc == 1){ Q = D; Q1 = !Q; hc = 0; } } Q1; // не Q; // прямой /* конец D тригер */ А дальше по схеме Д триггер не в качестве делителя… + RS.. Опять запары.. |
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Цитата Думал так проще будет, просто описывать логику работы каждого элемента по действиям. не тут то было.. Элемент можно рассматривать как черный ящик, описывая его реакцию на внешние сигналы. В случае D триггера в счётном режиме, нужно просто отлавливать фронт по входу "С" и инвертировать состояние "триггера". Не в счётном режиме добавится проверка состояния на входе D, от чего будет зависеть выход Q. Цитата А если вообще то, пытаюсь данную схему перенести в микроконтроллер. Какую функцию схема в натуре выполняет? Вообще? В составе чего работает? Что такое inf? |
Сообщ.
#11
,
|
|
|
Цитата Prince @ Какую функцию схема в натуре выполняет Имхо - никакую. Идет программное моделирование поведения жесткой логики средствами микроконтроллера: Цитата marks90 @ среда CodeVisionAVR. Цитата Prince @ Вообще? В составе чего работает? Ну, к примеру, в составе Протеуса... Цитата Prince @ Что такое inf? Цитата marks90 @ Блок INF в схеме представляет собой генератор случайного кода) |
Сообщ.
#12
,
|
|
|
RS триггер асинхронный. Простая проверка условий по входу.
R S Q 0 0 не меняется 0 1 1 1 0 0 1 1 0 Хотя нет, не совсем простая проверка. Надо проанализировать схему, и исключить неопределенную ситуацию при возможном переходе от 11 к 00, по входам. |
Сообщ.
#13
,
|
|
|
Цитата Элемент можно рассматривать как черный ящик, описывая его реакцию на внешние сигналы. Какую функцию схема в натуре выполняет? Вообще? В составе чего работает? Что такое inf? Я примерно предполагаю к чему вы ведёте, но рассматривать всю схему как чёрный ящик увы не получится, по причине её "нелинейной" работы. 1. Вся схема (реализуемая в мк) целиком, подготавливает информационную последовательность (её выдаёт блок inf) для передачи. В последующем эта последовательность пойдёт на квадратуру где будет модулирована "MSK - модуляция". 2. В составе полной схемы (реализуемой в мк) входят: a) Блок выделения четных и нечетных единичных импульсов. (это первая часть схемы (рисунок в первом посте)) вроди как уже реализован)) b) Блок выделения нулевых бит информации, следующих после не-четных единичных бит. (это вторая часть схемы тоже вылаживал в предыдущем сообщении) с) Блок разделения входной последовательности на четные и нечет-ные биты. (ещё не брался) d) Логическая схема блока формирования модуляционных кодов квадратурных каналов. (ещё не брался) 3. inf - это генератор того самого кода который будет передаваться (выход 1 без инверсии выход 2 с инверсией). Вечером постараюсь полную схему выложить. |
Сообщ.
#14
,
|
|
|
Цитата Вся схема (реализуемая в мк) целиком, подготавливает информационную последовательность (её выдаёт блок inf) для передачи. Шифратор? Цитата Блок выделения четных и нечетных единичных импульсов. Импульсов чего? INF - это входящая последовательность. А 200 Гц - это что за импульсы? 1001000001100010101011110110001011 Я правильно разделил четные и нечетные единичные импульсы(чего-то)? Цитата Блок выделения нулевых бит информации, следующих после не-четных единичных бит. (это вторая часть схемы тоже вылаживал в предыдущем сообщении) 1001000001100010101011110110001011 Так? Цитата Блок разделения входной последовательности на четные и нечет-ные биты. (ещё не брался) 100011010000 Так? Имхо, лучше бы начать с функциональной схемы, а не фактически принципильной. |
Сообщ.
#15
,
|
|
|
Думается мне, что автор темы просто не понимает, что делает.
Если это реальная задача, то вместо предложенного здесь бесконечного цикла заводится таймер и в его обработчике выполняются необходимые действия. Добавлено А судя по тексту первого сообщения - таки не понимает. |
Сообщ.
#16
,
|
|
|
Цитата Если это реальная задача, то вместо предложенного здесь бесконечного цикла заводится таймер и в его обработчике выполняются необходимые действия. Та это мелочи. У меня есть предположение, что часть блоков, моделируемых на уровне принципиальной схемы "в лоб" на си( ), можно заменить несколькими строчками относительно понятного кода. |
Сообщ.
#17
,
|
|
|
Такой подход с имитацией электрических схем используется в ПЛИС. В микроконтроллерах имитируют алгоритм работы.
Добавлено Цитата Prince @ именно так. У меня есть предположение, что часть блоков, моделируемых на уровне принципиальной схемы "в лоб" на си( ), можно заменить несколькими строчками относительно понятного кода. |
Сообщ.
#18
,
|
|
|
Цитата Prince @ Шифратор? Можно сказать и так. Объясняю, что для чего и почему: в железе имеется "цифровой" радио передатчик способный передавать цифровой код поданный ему на вход (на схеме блок inf), логика работы преобразования жёстко задана (описал по пунктам в предыдущем сообщении) микросхемами цифровой логики (TTL), дак-вот задача заключается в том чтобы заменить кучу микросхем с жёсткой логикой на один запрограммированный микро контролер. Данную процедуру можно назвать и шифрованием но посуте она является переориентацией кода для блока формирования квадратурных компонент I(t), Q(t) и получения в дальнейшем определённого типа модуляции "MSK". Если на пальцах: чтобы получит отличные(разные) частоты несущей во время подачи 0 и 1 необходимо выполнить данные преобразования входящего кода. вот
Цитата Prince @ Импульсов чего? А 200 Гц - это что за импульсы? Я правильно разделил четные и нечетные единичные импульсы(чего-то)? 1. Входящего кода (Поступающего с блока inf) 2. 200 Гц - это импульсы задающие частоту (скорость) работы схемы. 3. Единичные импульсы выделены не верно, следовательно и во 2м примере тоже не верно, вот должно быть: 1001000001100010101011110110001011 // передаваемый код 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // не чётные позиции 0 1000000000100010101010100010001010 // не чётные единицы (результат работы первого блока схемы (а)) 0110000000011101010100000001110100 // выделение 0 после нечётной единицы (b) |
Сообщ.
#19
,
|
|
|
Что на диаграмме есть что?
Цитата 200 Гц - это импульсы задающие частоту (скорость) работы схемы. ну как бы понятно, что это некий опорный генератор. Но какую функцию конкретно он выполняет? Что это такое - частота работы схемы? Вот у вас есть последовательность данных. С частотй 200 Гц происходит выборка очередного бита данных и некое кодирование? На вход кодера поступают биты, скорость 200 бод, правильно? И с такой же скоростью появляется на выходе(выходах) какая-то последовательность. Правильно? Цитата 1001000001100010101011110110001011 // передаваемый код 1000000000100010101010100010001010 // не чётные единицы (результат работы первого блока схемы (а)) 0110000000011101010100000001110100 // выделение 0 после нечётной единицы (b) На асме это выглядело бы примерно так: ; подпрограмма кодирования бита ; допустим, на 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 |
Сообщ.
#20
,
|
|
|
Да не правда это ! Приведённая схема не соответствует 155TM2(SN7474). Даже мнемоническое изображение не соответствует TM2. Твои результаты это подтверждают. Добавлено Цитата marks90 @ Думал так проще будет, просто описывать логику работы каждого элемента по действиям. не тут то было.. Надо понимать, что схема содержит обратную связь (положительную) и за один проход алгоритма ты можешь и не рассчитать её состояние правильно. |
Сообщ.
#21
,
|
|
|
Цитата Prince @ Что на диаграмме есть что? В нижней части (прямоугольные импульсы) тот самый передаваемый сигнал. В верхней части (синусоида) несущая, частота которой меняется согласно уровню нижних импульсов. Цитата Prince @ ну как бы понятно, что это некий опорный генератор. Но какую функцию конкретно он выполняет? Что это такое - частота работы схемы? Вот у вас есть последовательность данных. С частотой 200 Гц происходит выборка очередного бита данных и некое кодирование? На вход кодера поступают биты, скорость 200 бод, правильно? И с такой же скоростью появляется на выходе(выходах) какая-то последовательность. Правильно? именно так. к сожалению с ассемблером я совершенно не знаком и в приведённом вами примере мне не разобраться, попробую рассмотреть каждую часть схемы (a,b,c..) как чёрный ящик и получать готовую последовательность на выходе (как в вашем примере) только на C. Цитата ЫукпШ @ Надо понимать, что схема содержит обратную связь (положительную) и за один проход алгоритма ты можешь и не рассчитать её состояние правильно. теперь я понял, с обратной связью действительно ерунда получается, да и как уже упоминал "Pavia-> получилось последовательно, а тригер работает параллельно вернее асинхронно". Цитата ЫукпШ @ Да не правда это ! И все-таки я с вами не согласен. не отрицаю, что возможно реализация д триггера и другим способом, но простейший способ организации на жесткой логике возможен именно по этой схеме. подробние. |
Сообщ.
#22
,
|
|
|
Частотную модуляцию реализовать что ли надо?
|
Сообщ.
#23
,
|
|
|
Цитата В нижней части (прямоугольные импульсы) тот самый передаваемый сигнал. В верхней части (синусоида) несущая, частота которой меняется согласно уровню нижних импульсов. Цитата чтобы получит отличные(разные) частоты несущей во время подачи 0 и 1 необходимо выполнить данные преобразования входящего кода. На кой, для того, чтобы получить разные частоты несущей, нужны эти преобразования? Кто генерирует несущую и как управляется генератор несущей? Или 2 генератора? Или генератор будет прямоугольных импульсов, реализованный програмно, а на выходе фильтр? Ничего непонятно. Пора возвращаться к началу и спрашивать "что это будет", "как оно должно работать", о входных/выходных сигналах... |
Сообщ.
#24
,
|
|
|
Генератор (что на схеме) 200Гц необходим только для обеспечения работы логики (данной схемы, тех пунктов, что описаны выше), для последующей квадратуры есть другой генератор и вообще то что будет с сигналом дальше к этой теме не относится, задача заключается в реализации тех модулей что я описывал.
И да, модуляция будет (там даже не модуляция а манипуляция чистоты несущей, ну можно назвать и частотной модуляцией.) но это всё уже есть и организовано в железе, всё работает, нужно только научить микроконтроллер преобразовывать поступающий в него код по описанным выше пунктам (a, b, c..) и выдавать его уже преобразованный на выход (ногу мк). Что касается черного ящика: получилось организовать часть "a) Блок выделения четных и нечетных единичных импульсов." // ---------------- Блок выделения четных и нечетных единичных импульсов (как черный ящик) ------------- // 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; // не чётные единицы // --------------------------------------------------------------------------------------// |
Сообщ.
#25
,
|
|
|
Цитата marks90 @ ... но простейший способ организации на жесткой логике возможен именно по этой схеме. В том то и дело, что в данном случае - невозможен. Чтобы на D-триггере сделать делитель частоты пополам, нужно, чтобы сигнал С воспринимался "по фронту" (как у 74LS74). А в приведённой схеме он работает "по уровню". Отсюда и проблемы. |