Свежие обсуждения
Микроконтроллеры

5V -> RS232C

1 2 4
Ну так - АСМ, ясно дело. Я же говорю - СИ- его изучать надо прежде чем... Да там программа-то - 3 экрана всего (108 байт в bin-файле)...  
Такая точка зрения вполне понятна. Все же, позволю себе высказать несколько мыслей относительно Си versus Ассемблер и вообще по теме : ) Мысли могут получиться размером с небольшую статью, но тут уж пардон, у меня иногда появляется желание пографоманствовать : )

Сам по себе Си ничуть не сложней других языков высокого уровня (в т.ч. широко распространенных BASIC и Pascal). Программа состоит из тех же самых конструкций if, for, while (и т.п.) и функций (процедур). Отличия, в общем-то, лишь в синтаксисе. Например, функция вычисления факториала (без рекурсии), написанная на трех разных языках (жалко что форматирование не сохраняется):

1) BASIC, точнее QuickBasic 4.5
FUNCTION Factorial (n)
result = 1
FOR i = 2 TO n
result = result * i
NEXT i
Factorial = result
END FUNCTION

2) Паскаль
function Factorial(n: Integer): Longint;
var
result: Longint;
i: Integer;
begin
result := 1;
for i := 2 to n do result := result*i;
Factorial := result;
end;

3) Си
long Factorial(int n)
{
long result = 1;
int i;
for (i = 2; i <= n; i++) result *= i;
return result;
}

Тут все понятно и без комментариев. Нетрудно заметить, функция на Си – самая лаконичная, ничего лишнего. Приведу фрагмент аннотации к книге создателей языка, Брайена Кернигана и Денниса Ричи:

«Язык Си - это универсальный язык программирования, для которого характерны экономичность выражения, современный поток управления и структуры данных, богатый набор операторов. Язык Си не является ни языком "очень высокого уровня", ни "большим" языком, и не предназначается для некоторой специальной области применения. Но отсутствие ограничений и общность языка делают его более удобным и эффективным для многих задач, чем языки, предположительно более мощные.»

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

Если вернуться к нашим баранам, то есть к ATMega - та же самая функция вычисления факториала с результатом в виде 32-битного целого, написанная на ассемблере, занимает не одну страницу и требует уйму времени на отладку.

Управление периферией контроллера (UART, таймеры, АЦП и т.д.) осуществляется через регистры. В Си эти регистры ничем не отличаются от обычных переменных. То есть, например, для вывода единички в порт А, требуется написать всего лишь PORTA = 1; Для установки и сброса флагов используются операции побитового И, ИЛИ, НЕ. Несколько примеров:
PORTA |= 0x01; транслируется в команду SBI 0x1B, 0
PORTA &= ~0x01; транслируется в команду CBI 0x1B, 0

Тут, с точки зрения объема исходного кода, никаких преимуществ нет. Но, как только дело доходит до условных переходов, циклов, функций, работы с 16-ти и 32-х битными числами или плавающей точкой, ситуация меняется в корне (что особенно чувствуется на 8-ми битном процессоре). Это, в общем-то, секретом никогда не было.

По каким-то непонятным причинам, куча народа упорно игнорирует Си как инструмент для кодирования алгоритмов прошивок микроконтроллеров. Для «прикрытия» используются «отмазки», например такие:

1) Кодирование на ассемблере намного эффективней.
2) Для программ небольшого объема (скажем, до 1 тыс. строк), Си - излишество.

Конечно же, Си не всегда может заменить ассемблер, но оба этих утверждения ошибочны. По первому пункту – компилятор компилятору рознь. Сравнивать IAR EWAVR и ImageCraft C рука не поднимается : ) Бесплатный AVR-GCC весьма неплох, последний дистрибутив WinAVR (2004 год) приятно удивил по сравнению с предыдущим (2003). По второму пункту – таких товарищей надо бы спросить, стали бы они писать программу на GW-BASIC, если под рукой есть, скажем, Паскаль. GW-BASIC, как ни странно, идеологически достаточно близок к ассемблерам : )

Все сказанное выше относится не только к AVR, разумеется. Компиляторы Си есть и для PIC, и для MSC-51.

Пока на этом остановлюсь : )

 
GW-BASIC - это было самое первое, с чего я познакомился с ПК. Правда мой сын, О.А., быстренько меня периориентировал на ТУРБО-БЕЙСИК TB 1.0 от Borland. Им я и пользуюсь по сей день - страшно мощная штука. Ассемблером пользовался 2 раза - когда писАл резидентный часы-будильник под ДОС, и вирус "S-4148".
Чем привлекает ассемблер - это ощущением власти над машиной. Она будет делать именно то, что ты ей приказал. Языки высокого уровня - не то. Но - например, арифметика - на ассемблере это "проклятие программиста". Или, например, экран красивый. Ужас...
 
Арифметика, пол-беды. Общее между GW-BASIC и ассемблером (любым) - это не структурные языки. Как известно, программы на GW-BASIC состоят из сплошных операторов GOTO : )

Turbo Basic вещь замечательная, конечно. В том же 1987 году (или 1988, не помню точно), фирма Borland разродилась Turbo C. Он до сих пор стоит у меня на компьютере, в качестве музейного экспоната : ) Кстати, для изучения языка и тренировки это пакет подходит вполне, при том что занимает всего лишь 2МБ в несжатом виде (версия 2.0) и < 1МБ в архиве. По Turbo С, к тому же, полно учебников в электронном виде. Если надо, могу все это хозяйство выложить на narod.ru.

Более поздние пакеты (1990-х годов), уже включали в себя компилятор С++, и разжирели до десятков мегабайт. Совсем печально то, что в расплодившихся мурзилках а-ля "C++ Builder <подставить номер версии>" (не ко всем книгам относится, но к значительной части) язык Си забыт вообще (речь идет только о С++).

Если сравнивать Basic и Си, Си - значительно более компактный язык. Многое из того, что является частью языка в Бейсике, в Си - всего лишь библиотечные функции. И, конечно, Си куда ближе к аппаратуре. В основном, за счет поддержки работы с указателями (т.е. адресами памяти). В Бейсике все то же самое делается через ээ.. одно место.

 
Зато в любом современном компиляторе Borland можно выбрать язык: C или C++.  
Это-то да. Я пытался вот что сказать: если изучать C с целью его применения для программирования микроконтроллеров, лучше достать учебник по "чистому" языку (без всяких ++), хотя бы ту же классику K&R. Учить С++ (и ООП), а потом использовать лишь его подмножество -- методика, достойная гестапо : ) А для тренировки без разницы какой пакет использовать, хоть Turbo C почти 20-ти летней давности, хоть самые последние компиляторы С/С++ Microsoft & Borland. При работе с МК пригодятся лишь функции консольного ввода-вывода (stdio.h), плюс мат. библиотека (math.h).  
Ну вот. Я сделал это!!!
И для микроконтроллера программу (первая в этой жизни), и интерфейс под Виндус (первый в этой жизни).
"Помирать нам - рановато, есть у нас еще в жизни дела!"
(хоть и 6-й десяток лет идёт)

 
За исключением "цЫфровой" - все супер  
Позвольте!
Я захожу в мОгазин (или мАгозин) - вижу "Грушы свежые = 65.00".
Понятно, в школе нас учили : "ЖЫ" и ШЫ" пишутся с буквой "i".
Но, братцы, Россия ведь теперь (c 12 июня) - независимое госудврство!!! (от кого независимое? - от Москвы и Московской области!)
Как типеря хоЧЕм - так и пишЫм!!!
 

Почитал тут http://forum.ixbt.com/post.cgi?id=print:15:9307
Много думал...
Наверное, это Ваше дело, как писать.
Но лично мне неправильное написание действительно мешает воспринимать текст, на таких местах я спотыкаюсь.