Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор пути ... Assembler или C ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
Kalina
Цитата(zltigo @ Mar 6 2008, 12:21) *
У как все запущено sad.gif. Используется аппаратный таймер который за время интегрирования в десятки - сотни миллисекунд считает имульсы. Количество последовательных интервалов интегрирования можно менять в заисимости от скорости для достижения нужной точности. Все оставшееся время можно играть вальсы Шопена....


Насколько мне позволяют понимать мои знания, вы привели пример электроно-счётного частотомера(последовательный метод)?
Диапазон скоростей, которые я измеряю, находится в интервале 3-220 км/ч. Для определения отсутствия сигнала V<3 км/ч(нулевая скорость), мне необходимо поставить ограничения на максимальный период входного сигнала 0.17 с. (прямоуголные импульсы с датчика скорости) Это означает меньше 5 импульсов в секунду, при необходимости обновлять ЖКИ минимум 2-3 раза в секунду(данные для стрелки обновлять ещё чаще), теперь вопрос а возможно ли будет таким методом отличить скорости 3 (Период следования импульсов = 0.177 с.) и 3,1 км/ч (Период следования импульсов = 0.172 с.), это как импульсы прийдётся считать?
zltigo
Цитата(Kalina @ Mar 6 2008, 13:05) *
Насколько мне позволяют понимать мои знания, вы привели пример электроно-счётного частотомера(последовательный метод)?

Нет. Измерение длительности периода c возможными разборками c переполнения таймера/не срабатывания таймера на низких скоростях (когда времени много) и максимальными требованиями считывания-накопления значений таймера не чаще чем за две с лишним миллисекунды на скорости 220.
mart-13
Цитата(zltigo @ Mar 6 2008, 13:25) *
Нет. Измерение длительности периода c возможными разборками c переполнения таймера/не срабатывания таймера на низких скоростях (когда времени много) и максимальными требованиями считывания-накопления значений таймера не чаще чем за две с лишним миллисекунды на скорости 220.

Вообще-то в этой теме обсуждается вопрос о применимости в тех или иных задачах Ассемблера или Си. Насколько я понял Калина уже разобрался с методами и алгоритмами измерений промежутков времени. Скорее всего его интересует возможность реализации оных на Си и сравнение с Ассемблером... И вообще я что-то не понял о чем вы толкуете, уважаемый zltigo: то вы считаете импульсы, то уже измеряете период... 07.gif Не могли бы Вы выразиться более точно, или логически связано... Тут же не все разбираются с особенностями разных жаргонов...
Carbon
Можно измерять период подсчитывая импульсы аппаратным таймером. Только на вход таймера подавать клоки от внутреннего генератора (например 1 или 8 или 16МГц клок, таймер 16 бит). Сигнал от датчика скорости подавать на вход прерывания, а по прерыванию считывать значения с таймера. Таким образом, двух импульсов с датчика скорости достаточно чтобы с точностью до длительности клока (62,5наносек) определить период импульсов с датчика скорости и сразу пересчитать их в км/час. Считанный счетчик сбрасываем в 0 и ждем следующего прерывания. Вся задача укладывается в двадцать строк на Си.
Сергей Борщ
Цитата(Carbon @ Mar 6 2008, 14:02) *
Таким образом, двух импульсов с датчика скорости достаточно чтобы с точностью до длительности клока (62,5наносек) определить период импульсов с датчика
Если считывать значение из таймера в прерывании - то точность будет сильно ниже. А вот если использовать специально предназначенный для этого режим захвата (capture) таймера, то вполне реально. И на С и даже на Паскале (точно-точно, сам делал, правда, не по своей воле 01.gif ).


Цитата(rv3dll(lex) @ Mar 6 2008, 11:06) *
при этом на обычном 51 с кварцем 12 мегагерц для ровного счёта с выхода этого порта пойдёт 500 килогерц, что в принципе невозможно сделать на си

я даже не уверен что с той же скоростью на си в смысле будет работать

метка "инвертировать бит"
джамп на метка, написанное на асме
Ну это не смешно. Отряхнул от пыли Кейл uVision 1.24, датированный 97 годом:
Код
#include <AT892051.H>                /* special function register declarations   */
                                     /* for the intended 8051 derivative         */
#define    Lampa    P1_0

void main (void)
{
    for(;;)
        Lampa = ~Lampa;
}
--------------------------------------------
            ; FUNCTION main (BEGIN)
                                          ; SOURCE LINE # 6
                                          ; SOURCE LINE # 7
                                          ; SOURCE LINE # 8
0000         ?C0001:
                                          ; SOURCE LINE # 9
0000 B290          CPL     P1_0
0002 80FC          SJMP    ?C0001
                                          ; SOURCE LINE # 10
0004 22            RET    
            ; FUNCTION main (END)
6 минут вместе с копированием результата в форум. Почти уверен, что можно как-то объявить функцию как noreturn и подавить ret. Ну а уж скопировать одну строчку на всю память что на С что на асме - труда столько же.
Цитата(rv3dll(lex) @ Mar 6 2008, 11:06) *
извините не писал для 51 больше 5 лет - не помню команды
Я не писал 6 или 7, команд тоже не помню, но задачу решил не заглядывая в даташит. А вам слабО? ;)
rv3dll(lex)
усложню задачу - без использования таймера сложение 4 байтовых чисел с 4 байтовыми с одновременным генерированием того же самого - инверсия бита каждые 4 машинных цикла
Carbon
Цитата(Сергей Борщ @ Mar 6 2008, 16:05) *
Если считывать значение из таймера в прерывании - то точность будет сильно ниже. А вот если использовать специально предназначенный для этого режим захвата (capture) таймера, то вполне реально. И на С и даже на Паскале (точно-точно, сам делал, правда, не по своей воле 01.gif ).

А если по прерываниям таймера от переполнения считать количество этих переполнений, то можно измерять очень и очень точно длительность очень-очень длинных импульсов.
zltigo
Цитата(mart-13 @ Mar 6 2008, 13:53) *
Калина уже разобрался с методами и алгоритмами измерений промежутков времени.

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

Количество импульсов таймера за период повторения входных импульсов. Даже для высоких скоростей разрешающей способности таймера хватит выше головы. Для низких скоростей надо учитывать возможное переполнение таймера. Вся напряженная работа сводится, как уже писал, сводится к считыванию и накоплению значения таймера не чаще, чем раз в две миллисекунды и разборками с накопленными значениями раз в несколько сот миллисекунд - период интеграции.
rv3dll(lex)
из своего процессорного опыта - это было по необходимости - так я рассыпушечник 133-164ла3-7 и всё такое ,,,,,,,,,,,,,,,,,CPLD потом FPGA )))) может у меня был такой неправильный подход - все процессы должны выполняться параллельно - в процессоре псевдо параллельно

а именно нарисовать схему = нарисовать эпюры сигналов а далее команды по временной оси - вопрос с чередованием не снят

любые операции можно проредить командами с периферией

сейчас выглядит глупо))) но программы аонов конца 80х начала 90х в 4к пзу возможностями не страдали
сам писал по 400 кбайт на ассемблере под TMS
Kalina
Уважаемые форумчане, большое спаисбо a14.gif за тот опыт работы с языками программирования, которым вы поделелись. Кто бы что не говорил, а знать, конечно, необходимо оба языка, иначе никогда не будет права выбора, так как выбирать будет не из чего smile.gif. Конечным принятым решением было начало освоения С.
P.S. Какую литературу вы могли бы посоветать для начинающего? И ваше мнение о книге "Программирование на языке C для AVR и PIC микроконтроллеров" Шпак Ю.А.?
Прохожий
Цитата(Kalina @ Mar 6 2008, 21:00) *
Уважаемые форумчане, большое спаисбо a14.gif за тот опыт работы с языками программирования, которым вы поделелись. Кто бы что не говорил, а знать, конечно, необходимо оба языка, иначе никогда не будет права выбора, так как выбирать будет не из чего smile.gif. Конечным принятым решением было начало освоения С.
P.S. Какую литературу вы могли бы посоветать для начинающего? И ваше мнение о книге "Программирование на языке C для AVR и PIC микроконтроллеров" Шпак Ю.А.?

Эту книгу советовали на этой площадке неоднократно, но я не поленюсь и посоветую ее Вам лишний раз:
Керниган, Брайан У., Ритчи, Деннис М.
Язык программирования С, 2-е издание.: Пер. с англ. - М.: Издательский дом "Вильямс", 2007. - 304 с.: ил. - Парал. тит. англ.
ISBN 979-5-8459-0891-9 (рус.)
ББК 32.973.26-016.2.75
К36
УДК 004.438
Покупал здесь приблизительно за 300 руб. Может есть где-нибудь еще подешевле...
Сергей Борщ
Цитата(rv3dll(lex) @ Mar 6 2008, 19:57) *
вопрос с чередованием не снят
В таких случаях я обычно говорю "И чтобы он еще за пивом бегал!"
Цитата(rv3dll(lex) @ Mar 6 2008, 19:57) *
сейчас выглядит глупо))) но программы аонов конца 80х начала 90х в 4к пзу возможностями не страдали
"Сто дюжих коней под капот я запрятал, а прадед везде успевал на одном".
Ушло то время, когда процессор с 4к пзу стоил ползарплаты инженера. Да, "проредить" программу на С дерганьем пина не удастся. Ну не буду я убивать время, творя программу на асме - я просто возьму другой процессор, пусть вдвое дороже, который умеет ногой дергать аппаратно через таймер и забуду об этой проблеме в принципе. Сэкономленное рабочее время стоит дороже, чем разница в цене процессора. Если вдруг мне придется пректировать устройство (с афигенно большим тиражом), в котором конечная программа будет на ассемблере - я все равно спроектирую ее на С, потом возьму ассемблерный результат компилятора и отрихтую уже его. Я на примере выше показал, как такой подход позволяет экономить время разработки. Переубеждать вас я не собираюсь.

Цитата(Прохожий @ Mar 6 2008, 20:31) *
Керниган, Брайан У., Ритчи, Деннис М.
Язык программирования С, 2-е издание.:
Ее можно легко найти в Интернете (достаточно спросить у гугля "Керниган Ритчи"), например вот или вот, но нужно именно второе издание! С момента выхода первого издания язык очень сильно изменился.
rv3dll(lex)
Цитата(Сергей Борщ @ Mar 6 2008, 21:35) *
В таких случаях я обычно говорю "И чтобы он еще за пивом бегал!""Сто дюжих коней под капот я запрятал, а прадед везде успевал на одном".
Ушло то время, когда процессор с 4к пзу стоил ползарплаты инженера. Да, "проредить" программу на С дерганьем пина не удастся. Ну не буду я убивать время, творя программу на асме - я просто возьму другой процессор, пусть вдвое дороже, который умеет ногой дергать аппаратно через таймер и забуду об этой проблеме в принципе. Сэкономленное рабочее время стоит дороже, чем разница в цене процессора. Если вдруг мне придется пректировать устройство (с афигенно большим тиражем), в котором конечная программа будет на ассемблере - я все равно спроектирую ее на С, потом возьму ассемблерный результат компилятора и отрихтую уже его. Я на примере выше показал, как такой подход позволяет экономить время разработки. Переубеждать вас я не собираюсь.


я понял что это не моё и ушел сначала проц пдюс логика потом логика в проце а сейчас и программист пишет своё а я своё ))) и ответ на тему в 90 процентов случаев всё можно написать на СИ в 5 прочентах на ассемблере а в 5 оставшихся в грамотном подходе проектирования
и ещё в плисинах использую свой кодовый язык - при написании своего процессора - в плисинахпамять двупортовая - поэтому на 1 блок 4 кбита в альтере например вешаю 2 проца с разных сторон)) работа в кодах по таблице - это даже ниже ассемблера)))
Прохожий
Цитата(Сергей Борщ @ Mar 6 2008, 21:49) *
Ее можно легко найти в Интернете (достаточно спросить у гугля "Керниган Ритчи"), например вот или вот, но нужно именно второе издание! С момента выхода первого издания язык очень сильно изменился.

К сожалению, так и не научился читать с экрана, а если печатать 289 страниц формата А4, то потом неудобно читать, да и по деньгам приблизительно то же и выйдет. Не сочтите за рекламу, но книга достаточно хорошо издана, текст программок структурирован, рисунки внятные, формат самый подходящий. Мне, лично, так удобнее.
К стати, что скажете о таком решении упр. 2.9 (подсчет числа единиц в байте) из этой книги?
Код
int bitcount (unsigned x)
{
int b=0;
while (x&=(x-1)) b++;
return b;
}
Kalina
Цитата(Сергей Борщ @ Mar 6 2008, 21:49) *
вот или вот, но нужно именно второе издание!


Большое спасибо за ссылки, Керниган понятно и просто объясняет, приводя большое количество примеров. Уже печатаю smile.gif !

Цитата(Прохожий @ Mar 6 2008, 22:14) *
да и по деньгам приблизительно то же и выйдет.


Если не секрет, где вы книги покупаете?
Прохожий
Цитата(Kalina @ Mar 6 2008, 23:31) *
Если не секрет, где вы книги покупаете?

А Вы по моей ссылке пройдите. Это книжный интернет-магазин. Оплата наложенным платежом.
Pyku_He_oTTyda
Цитата
Прохожий

Спасибо! Хороший магазин с демократичными ценами.
Demeny
Цитата(Прохожий @ Mar 6 2008, 22:14) *
К стати, что скажете о таком решении упр. 2.9 (подсчет числа единиц в байте) из этой книги?
Код
int bitcount (unsigned x)
{
int b=0;
while (x&=(x-1)) b++;
return b;
}

Решение неправильное. Для числа 0x80, например, результат равен 0.
Algol
По поводу эффективного программирования на Си и для снятия многих вопросов из этой темы посоветую прочитать статью
Си без Си
Demeny
Цитата(Algol @ Mar 7 2008, 10:51) *
По поводу эффективного программирования на Си и для снятия многих вопросов из этой темы посоветую прочитать статью
Си без Си

Цитата
Операторы ветвления.
Эти операторы встречаются в программах наиболее часто и, одновременно с этим, наиболее часто являются источником ошибок в программах.
............................
Сравнивая операторы while и do… while можно заметить, что второй оператор имеет на одну команду перехода меньше по сравнению с первым и, стало быть, его использование более предпочтительно.
.............................
Совет по оптимизации (C, asm): старайтесь там, где возможно, использовать оператор do…while.

crying.gif
Я плакалъ ... Керниган с Ритчей отдыхают.
mdmitry
Цитата(Прохожий @ Mar 6 2008, 22:14) *
Код
int bitcount (unsigned x)
{
int b=0;
while (x&=(x-1)) b++;
return b;
}

Посмотрите книгу "Алгоритмические трюки для программистов" Генри Уоррен
andron86
Цитата(Прохожий @ Mar 6 2008, 20:14) *
К стати, что скажете о таком решении упр. 2.9 (подсчет числа единиц в байте) из этой книги?
Код
int bitcount (unsigned x)
{
int b=0;
while (x&=(x-1)) b++;
return b;
}


я бы сказал вот так :-)
Код
int bitcount (unsigned x)
{
int b=0;
while (x){
x &= (x-1);
b++;
}
return b;
}
zltigo
Цитата(Demeny @ Mar 7 2008, 11:17) *
Я плакалъ ... Керниган с Ритчей отдыхают.

Совершенно правильные обыденные вещи. Степень влияния на результат у прилично оптимизирующих компиляторов должна быть никакой, но тем не менее дела обстоят именно так.
Прохожий
Цитата(andron86 @ Mar 7 2008, 12:16) *
я бы сказал вот так :-)
Код
int bitcount (unsigned x)
{
int b=0;
while (x){
x &= (x-1);
b++;
}
return b;
}

Я сделал вот так:
Код
unsigned char bitcount (unsigned char x)
{
unsigned char b=0;
if(x)
    {
    b=1;
    while (x&=(x-1)) b++;
    }
return b;
}

После трансляции получил следующее:
Код
979:               unsigned char bitcount (unsigned char x)
  0BA2    D912     RCALL 0xdc8
  0BA4    52E6     MOVF 0xfe6, F, ACCESS
980:               {
981:               unsigned char b=0;
  0BA6    6ADF     CLRF 0xfdf, ACCESS
982:               if(x)
  0BA8    0EFE     MOVLW 0xfe
  0BAA    50DB     MOVF 0xfdb, W, ACCESS
  0BAC    E011     BZ 0xbd0
983:                   {
984:                   b=1;
  0BAE    0E01     MOVLW 0x1
  0BB0    6EDF     MOVWF 0xfdf, ACCESS
985:                   while (x&=(x-1)) b++;
  0BB2    0EFE     MOVLW 0xfe
  0BB4    04DB     DECF 0xfdb, W, ACCESS
  0BB6    6E3C     MOVWF 0x3c, ACCESS
  0BB8    50D9     MOVF 0xfd9, W, ACCESS
  0BBA    0FFE     ADDLW 0xfe
  0BBC    6EE9     MOVWF 0xfe9, ACCESS
  0BBE    0EFF     MOVLW 0xff
  0BC0    20DA     ADDWFC 0xfda, W, ACCESS
  0BC2    6EEA     MOVWF 0xfea, ACCESS
  0BC4    503C     MOVF 0x3c, W, ACCESS
  0BC6    16EF     ANDWF 0xfef, F, ACCESS
  0BC8    50EF     MOVF 0xfef, W, ACCESS
  0BCA    E002     BZ 0xbd0
  0BCC    2ADF     INCF 0xfdf, F, ACCESS
  0BCE    D7F1     BRA 0xbb2
986:                   }
987:               return b;
  0BD0    50DF     MOVF 0xfdf, W, ACCESS
988:               }
  0BD2    52E5     MOVF 0xfe5, F, ACCESS
  0BD4    D192     BRA 0xefa

Компилятор МСС18, оптимизация включена. Кроме непонятно зачем вставленного MOVLW 0xfe в операторе if(х)... все остальное полностью соответствует концепции псевдостека, поддерживаемого этим компилятором. В связи с этим и некое разрастание кода.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.