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

Переконвертить с AVR C на ASM

PS. Если программа на C небольшая, то бросили бы ее сюда вместе с вопросами, на которые хотите получить ответы - это будет быстрее, чем поиск мифических конверторов с С на Асм.
ПрАграмма как раз из разряда "100 строк" - я специально скачал чтоб посмотреть - там в основном работа с портами - пиши хоть на Ассемблере, хоть на Си - код будет практически одинаков - вобщем вся тема - пыль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вобщем вся тема - пыль.

Это понятно из названия темы. :) Конвертер из Си в ASM, то есть программа переводящая программу написанную на Си в другой вид - это по определению транслятор. Одной из разновидностей транслятора - компилятор. Современные распространённые компиляторы Си построены по принципу C/ASM/OBJ/HEX. Таким образом ASM текст присутствует.

 

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

 

Можно рекомендовать лишь то, что вам уже посоветовали другие.

 

1) Разобраться надо ли вам вообще программирование. (Дальнейшие пункты будут актуальны только если ответ - да)

2) Разобраться в базовых понятиях

3) Начать изучать язык Си

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иными словами программа строящая алгоритм из текста проги нужна в основном тем, кто разбирает чужие программы, причём, в основном, той части которая слабо разбирается в программировании. В связи с этим - потребность в таких программах - практически нулевая.

оффтоп, конечно, но по-моему такая программа была бы весьма востребована. Многим приходится разбираться в чужих исходниках и некий инструмент, который получив текст на ЯП выдал бы осмысленное укрупненное описание был бы весьма полезен. Хотя врядли сегодня доступно что-то подобное...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм работы программы:

 

Посылка с IR: 3 байта (старшим битом вперед)

 

 

 

1) 07 - Синхронизация

 

2) 50 - Отпускание клавиши / 5A - Нажатие

 

3) xx - Номер клавиши (>=80)

 

 

 

В PC отсылаются коды (по порядку):

 

E0 - Если клавиша принадлежит расширенному набору (см. ниже)

 

F0 - Для отпускания клавиши

 

xx - Скан код

 

 

 

Таблица скан кодов лежит в файле keys.h (первый столбец - скан код, второй - признак расширенного набора)

 

Если скан код равен 0 - клавиша игнорируется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Народ программы для построения алгоритмов на основе СИ кода не знает.
В стародавние времена (лет 20-30 тому назад) алгоритмы было принято публиковать на распространенном в те времена языке АЛГОЛ. И заметьте это официаль считалось публикацией алгоритма. А знает или нет читатель АЛГОЛ - это проблема читателя. Программ, которые из скажем кода на С чего-нибудь вроде БПФ сделает вам описание алгоритма как в учебнике - нет и не предвидется.

2) Как перекинуть код с СИ на асм в готовом к компилированию виде

с сохранением исходного текста в качестве комментариев тоже пока никто не знает.

(то что в файле *.lst не годится для компиляции на асме в автомате без изменений)

С точки зрения повышения быстродействия бессмысленная идея, так АСМ код, получаемый таким транслятором в точности соответствует тому, что сгенерит компилятор. Если вам надо оптимизировать с точки зрения быстродействия или ресурсов что-то написанное на С, то ничего, кроме тупого вникание в сишный код и переложение его на асм руками не придумано. Идея заниматься оптимизацией АСМа из-под С не продуктивна, так как в рамках модели компилятор генерит достаточно оптимальный код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм работы программы:

Посылка с IR: 3 байта (старшим битом вперед)

1) 07 - Синхронизация

2) 50 - Отпускание клавиши / 5A - Нажатие

3) xx - Номер клавиши (>=80)

 

Может я захватываю не все байты (т.е. устройство переключается на передачу данных в комп)

но первая посылка максимум на 7 бит тянет... (больше похоже на 6)

(в пределах (длинна посылки)*5 следующей посылка не начинается)

 

результат измерений и вьювер для их просмотра тут

http://swordgreenline.narod.ru/Soft.html

файл IROscil.zip (он там один)

в архиве программа и принятые файлы

надо открыть файл Klava.txt

далее просмотреть кодировку во вкладке осциллографа

в файле сохранено 6 нажатий ентера

 

наблюдается старт посылка

посылки при удержании

и посылка при отпускании

Изменено пользователем QuickWitted

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посылка с IR: 3 байта (старшим битом вперед)

 

В связи с тем что принимаемые посылки устойчивы во времени для

заданной кнопки то выкинув повторы собрал разновидности для 3х кнопок

 

вьювер для просмотра тут

http://swordgreenline.narod.ru/Soft.html

файл IROscil.zip (он там один)

 

1) 07 - Синхронизация

 

во всех посылках повторяется начало

ДЛИННА первых 4х бит 70h; 23h; 27h; 23h (импульс - пауза - импульс - пауза)

Хвост разный для разных кнопок...

разброс +-2 даже в посылке от одной кнопке

 

Вопрос как из длинны 4х бит получить цифру 07 ?

(не обязательно все 4 бита входят в 07

там может быть стартовый и может быть захвачен кусок след цифры)

 

P.S: Все измерения проходили в крякозябриках IgorPlug2 (за 1 ед. принято ~= 42.62 us)

Изменено пользователем QuickWitted

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я захватываю не все байты (т.е. устройство переключается на передачу данных в комп)

но первая посылка максимум на 7 бит тянет... (больше похоже на 6)

(в пределах (длинна посылки)*5 следующей посылка не начинается)

 

результат измерений и вьювер для их просмотра тут

http://swordgreenline.narod.ru/Soft.html

файл IROscil.zip (он там один)

Я не смог освоить эту крутую программу :05: Видимо получить от нее длинну посылки невозможно, а одного вида импульсов недостаточно :wacko:

 

 

 

В сорце импульсы принимались просто по длительности. Начало посылки выделялось по паузе (более 32х интервалов) и импульсу длинной 3 интервала (т.е. код 07). Затем заводился таймер, который сэмплировал значение с входа приемника каждый интервал. Все захваченные биты складывались в байты, которые анализировались, как я писал раньше. Длинна интервала - 800 mks

 

 

 

Коды повтора похоже игнорировались

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не смог освоить эту крутую программу :05: Видимо получить от нее длину посылки невозможно, а одного вида импульсов недостаточно :wacko:

 

Поводи мышкой по виду – сразу над диаргаммой показывается над каким импульсом

мыша и длинна импульса эти же цифры в строчках сверху, суммарную длину не считал.

 

В сорце импульсы принимались просто по длительности.

Начало посылки выделялось по паузе (более 32х интервалов)

и импульсу длинной 3 интервала (т.е. код 07).

 

Т.е. алгоритм примерно такой

(в скобках замеренные модулем IgorPlug2 числа в hex - они в 16 раз больше и прыгают +/-2)

1) ждать тишины в большей 32х интервалов (мин тишина 395h между посылками)

2) принять старт бит - код 07 (замерено около 71h)

3) потом что?

 

Затем заводился таймер, который сэмплировал значение с входа приемника каждый интервал. Все захваченные биты складывались в байты, которые анализировались, как я писал раньше.

 

как складываются биты в байты? (как различаются бит0 от бита1)

сравнивается замеренное с числом если меньше то ноль если больше единица?

или сдвижка импульса относительно центра посылки?

(хотя мне кажется тут другая методика)

 

наблюдается куча мелких посылок и иногда крупные

причём очень похоже что крупные состоят из нескольких мелких

причём при этом вторая часть крупной посылки идёт с инверсией

(видно по стартовой части 072 023 026 023) в середине

 

-------------------------------------------------------------------------

пример мелкой на 6 импульсов - при нажатии кнопки

первый импульс - 072 023 026 023 04B 023 026 023 025 049 025 049 06E

пауза больше 800h

-------------------------------------------------------------------------

 

-------------------------------------------------------------------------

пример крупной на 15 импульсов

первый импульс - 071 023 026 023 026 091 026 023 026 048 026 023 04A 000

далее длинный импульс 192

это пауза в середине - 070 023 026 023 049 025 025 024 025 024 06E 026 06D 000

293 - большая пауза

-------------------------------------------------------------------------

 

-------------------------------------------------------------------------

пример крупной на 12 импульсов

первый импульс - 071 023 026 023 04B 023 027 022 027 047 027 047 06E 000

далее длинный импулс 393

это пауза в середине - 070 023 026 023 026 091 026 048 026 048

пауза больше 800h

-------------------------------------------------------------------------

 

все полученные коды методом тыка на клавиши...

до 100 - по 1 клавиши от 101 до 180 жали на несколько разом...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не смог освоить эту крутую программу :05:

 

1) все импульсы имеют постоянное знакоместо их начала... т.е. на одном и том же расстоянии от начала

возможны варианта 1)импульс есть 2)импульс есть, но он слился с несколькими последующим или отел часть паузы

3)импульса нет. Стандартная длинна импульса 26h или 49h

2) начало всегда одинаковое - после длинного молчания 1)импульс71h - пауза23h - 2)импульс26h - пауза23h

(071 023 026 023)

3) на 3 знакоместе может быть 2 варианта длинны импульса стандартный 26h и удлинённый за счёт паузы 49

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поводи мышкой по виду – сразу над диаргаммой показывается над каким импульсом

мыша и длинна импульса эти же цифры в строчках сверху, суммарную длину не считал.

Меня смутило то, что на импульсы визуально разной длинны (для разных клавиш) он показывал одно и тоже значение

Т.е. алгоритм примерно такой

(в скобках замеренные модулем IgorPlug2 числа в hex - они в 16 раз больше и прыгают +/-2)

1) ждать тишины в большей 32х интервалов (мин тишина 395h между посылками)

2) принять старт бит - код 07 (замерено около 71h)

3) потом что?

Алгоритм такой:

  1. Ждать тишины > 32х интервалов
  2. Ждать начала посылки
  3. Отсчитать пол-интервала, с этого места начать непрерывно считывать сигнал с IR датчика с заданным интервалом (около 23h по IgorPlug2)
  4. Считанные биты обрабатываются следующим образом:

  1. Первые 3 бита должны быть 1 (есть сигнал с IR входа) - Стартовый маркер
  2. Далее биты складываются в байты (по 8 битов) начиная со старшего бита в байте, т.е. бит 7, бит 6, бит 5 ... бит 0, всего 2 байта
  3. 1й байт из этих 2х - кон нажатия/отпускания клавиши
  4. 2й байт - номер клавиши + 128 (старший бит установлен)
Если протокол не соблюдается (стартовые биты не все 1 или код нажатия/отпускания не правильный или старший бит в номере клавиши не установлен), посылка игнорируется и все начинается сначала

 

 

наблюдается куча мелких посылок и иногда крупные

причём очень похоже что крупные состоят из нескольких мелких

причём при этом вторая часть крупной посылки идёт с инверсией

(видно по стартовой части 072 023 026 023) в середине

Оригинальная программа все это игнорирует

 

 

-------------------------------------------------------------------------

пример мелкой на 6 импульсов - при нажатии кнопки

первый импульс - 072 023 026 023 04B 023 026 023 025 049 025 049 06E

пауза больше 800h

-------------------------------------------------------------------------

  • 072 - Стартовый импульс
  • 023 026 023 04B 023 026 023 - 01011010 - 5A - Нажатие
  • 025 049 025 049 06E - 10010011 (1) - Клавиша с номером 19 - ESC
-------------------------------------------------------------------------

пример крупной на 15 импульсов

первый импульс - 071 023 026 023 026 091 026 023 026 048 026 023 04A 000

  • 071 - Старт
  • 023 026 023 026 091 - 01010000 - 50 - Оттускание
  • 026 023 026 048 026 023 04A - 10100101 (1) - Клавиша с номером 37 - PrtScr
Остаток посылки будет проигнорирован

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня смутило то, что на импульсы визуально разной длинны (для разных клавиш) он показывал одно и тоже значение

 

Это из за авто зума покрути вкладку сетингс...

а для большей визуальности я переделал алгоритм отображения импульса под мышкой

добавил расчёт позиции, цену одного деления и т.д.

т.е. добавил рюшечек и бантиков... результат выложил тут

http://swordgreenline.narod.ru/Soft.html

файл IROscil.zip (он там один)

 

  • 071 - Старт
  • 023 026 023 026 091 - 01010000 - 50 - Оттускание
  • 026 023 026 048 026 023 04A - 10100101 (1) - Клавиша с номером 37 - PrtScr
Остаток посылки будет проигнорирован

 

За пояснения спасибо - буду разбираться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а для большей визуальности я переделал алгоритм отображения импульса под мышкой

добавил расчёт позиции, цену одного деления и т.д.

т.е. добавил рюшечек и бантиков... результат выложил тут

http://swordgreenline.narod.ru/Soft.html

файл IROscil.zip (он там один)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчёт преобразования кода на С в блок-схему. Есть такая программа, CrystalCPP Flow Chart

http://www.sgvsarc.com/product_crystalflow.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы не могли бы привести кратенький пример того, что хотите получить? (с алгоритм-билдером я не знаком). К примеру для программы

void main()
{
  DDRA = 255;
  for (int i = 0; i< 100; ++i)
    PORTA = i;
while(1);
}

 

Теперь могу

post-28596-1209099775_thumb.jpg

во клас - 3 клика мышкой и алгоритм готов

 

За программу большое спасибо :beer:

Изменено пользователем QuickWitted

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...