Хелпикс

Главная

Контакты

Случайная статья





DDRD = 0xff;



 

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

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

Файлы программ на языке Си имеют расширение. C, а структура программы выглядит следующим образом.


 

/* ----------------------------------------------

ПРИМЕР ПРОГРАММЫ НА AVR GCC

------------------------------------------------- */

 

#include < avr/io. h> /* заголовок */

 

int main (void) /* главная функция: начало программы */

 

{ /* открывающая скобка в начале программы */

 

оператор программы;

оператор программы;

...

оператор программы;

 

} /* закрывающая скобка в конце программы */


Открывающие программу строки комментариев являются необязательными, однако тому, кто читает код, они дают представление о назначении программы.

Строка #include < avr/io. h> является заголовком. В заголовках содержится информация для компилятора об общих требованиях программы. В данном случае компилятору указывается, что нужно включить информацию, содержащуюся в файле io. h. Файл с именем io. h является частью пакета AVR GCC и содержит информацию о вводе и выводе. Эта строка не является оператором языка Си. Символ # указывает, что она должна быть обработана " препроцессором". Препроцессор осуществляет некоторую предварительную обработку текста программы перед началом компиляции и подключает внешние библиотеки. Какой конкретный файл (или файлы) таким образом подключается, зависит от потребностей программы.

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

Отличительным признаком функции служат круглые скобки после её имени. Круглые скобки указывают на то, что main() - имя функции. В круглых скобках в общем случае содержится информация, передаваемая функции.

Идущая следом открывающая фигурная скобка { отмечает начало последовательности операторов, образующих тело функции. Закрывающая фигурная скобка } отмечает конец последовательности операторов, образующих тело функции. На этой скобке выполнение функции завершается.

Фигурные скобки применяются также для того, чтобы объединить несколько операторов программы в составной оператор или блок.

Тело функции, заключенное в фигурные скобки, представляет собой набор операторов, каждый из которых оканчивается символом точка с запятой;. При написании программы на Си можно поместить несколько операторов на одной строке или разместить один оператор в нескольких строках. Символ " точка с запятой" указывает компилятору конец оператора, но для человека удобнее, если каждый оператор будет размещен на отдельной строке. Кроме того, можно использовать пустые строки, чтобы отделить одну часть программы от другой.

Операторы выполняются последовательно в том порядке, в котором они записаны, и примерно соответствуют шагам исходного алгоритма.

Особо следует отметить использование комментариев в программе. Комментарии - это примечания, помогающие понять смысл программы. В Си комментарии записываются между значками /* */. Содержание комментариев компилятору совершенно безразлично: все, что находится между символами начала и конца комментария, им игнорируется.

Комментарии можно располагать на той же строке, что и операции, которые они объясняют. Длинные комментарии могут занимать несколько строк. Для комментария не требуется в конце точка с запятой.

При разработке программы комментарии могут оказать неоценимую помощь, особенно если приходится оставлять работу на длительное время, а затем возвращаться к ней. При наличии комментариев гораздо легче продолжить работу с того места, где вы остановились. Кроме того, с их помощью гораздо проще впоследствии адаптировать уже написанные программы к новым задачам.

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

Неправильное определение комментариев:

 

/* комментарии к программе /* мигания светодиодом */ */

или

/* комментарии к программе мигания */ светодиодом */

AVR GCC поддерживает и второй метод записи комментариев - строка, начинающаяся с символов //, считается комментарием. Пример:

 

// Это однострочный комментарий

 

 

Типы переменных. Объявление переменных. Константы. Присваивание. Арифметические операции. Инкремент и декремент.  
Переменные



Для хранения различных данных в языках программирования используют переменные. Переменной называется область памяти, имеющая имя, которое иначе называют идентификатором.

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

Хорошим стилем является осмысленное именование переменных. Имя переменной может содержать от одного до 32 символов. Разрешается использовать строчные и прописные буквы, цифры и символ подчёркивания, который в Си считается буквой. Первым символом обязательно должна быть буква. Имя переменной не может совпадать с зарезервированными словами.

В языке Си все переменные должны быть объявлены. Это означает, что, во-первых, в начале каждой программы или функции Вы должны привести список всех используемых переменных, а во-вторых, указать тип каждой из них.

При объявлении переменной компилятор отводит ей место в памяти в зависимости от её типа. Стандартными средствами AVR GCC работает с типами данных char (символьный тип) и int (целочисленный тип).

Типы переменных



Тип char

char - является самым экономным типом. Тип char может быть знаковым и беззнаковым. Обозначается, соответственно, как " signed char " (знаковый тип) и " unsigned char " (беззнаковый тип). Знаковый тип может хранить значения в диапазоне от -128 до +127. Беззнаковый - от 0 до 255. Под переменную типа char отводится 1 байт памяти (8 бит).

Ключевые слова (модификаторы) signed и unsigned указывают, как интерпретируется нулевой бит объявляемой переменной, т. е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый.

Тип int

Целочисленная величина int может быть short (короткой) или long (длинной).

Ключевое слово (модификатор) short ставится после ключевых слов signed или unsigned. Таким образом, различают следующие типы: signed short int, unsigned short int, signed long int, unsigned long int.

Переменная типа signed short int (знаковая короткая целая) может принимать значения от -32768 до +32767, unsigned short int (беззнаковая короткая целая) - от 0 до 65535. Под каждую из них отводится ровно по два байта памяти (16 бит).

При объявлении переменной типа signed short int ключевые слова signed и short могут быть пропущены, и такой тип переменной может быть объявлен просто int. Допускается и объявление этого типа одним ключевым словом short.

Переменная unsigned short int может быть объявлена как unsigned int или unsigned short.

Под каждую величину signed long int или unsigned long int отводится 4 байта памяти (32 бита). Значения переменных этого типа могут находиться в интервалах от -2147483648 до 2147483647 и от 0 до 4294967295 соответственно.

Существуют также переменные типа long long int, для которых отводится 8 байт памяти (64 бита). Они также могут быть знаковыми и беззнаковыми. Для знакового типа диапазон значений лежит в пределах от -9223372036854775808 до 9223372036854775807, для беззнакового - от 0 до 18446744073709551615. Знаковый тип может быть объявлен и просто двумя ключевыми словами long long.

Тип Диапазон Шестнадцатиричный диапазон Размер
unsigned char 0... 255 0x00... 0xFF 8 bit
signed char или просто char -128... 127 -0x80... 0x7F 8 bit
unsigned short int или просто unsigned int или unsigned short 0... 65535 0x0000... 0xFFFF 16 bit
signed short int или signed int или просто short или int -32768... 32767 0x8000... 0x7FFF 16 bit
unsigned long int или просто unsigned long 0... 4294967295 0x00000000... 0xFFFFFFFF 32 bit
signed long или просто long -2147483648... 2147483647 0x80000000... 0x7FFFFFFF 32 bit
unsigned long long 0... 18446744073709551615 0x0000000000000000... 0xFFFFFFFFFFFFFFFF 64 bit
signed long long или просто long long -9223372036854775808... 9223372036854775807 0x8000000000000000... 0x7FFFFFFFFFFFFFFF 64 bit



Объявление переменных



Переменные объявляют в операторе описания. Оператор описания состоит из спецификации типа и списка имён переменных, разделённых запятой. В конце обязательно должна стоять точка с запятой.

Объявление переменной имеет следующий формат:

[модификаторы] спецификатор_типа идентификатор [, идентификатор]...


Модификаторы - ключевые слова signed, unsigned, short, long.
Спецификатор типа - ключевое слово char или int, определяющее тип объявляемой переменной.
Идентификатор - имя переменной.


Пример:

char x;

int a, b, c;

unsigned long long y;


Таким образом, будут объявлены переменные x, a, b, c, y. В переменную x можно будет записывать значения от -128 до 127. В переменные a, b, c - от -32768 до +32767. В переменную y - от 0 до 18446744073709551615.

Инициализация значения переменной при объявлении

При объявлении переменную можно проинициализировать, то есть присвоить ей начальное значение. Сделать это можно следующим образом.

int x = 100;

Таким образом, в переменную x при объявлении сразу же будет записано число 100.

Лучше избегать смешивания инициализируемых переменных в одном операторе описания, то есть инициализируемые переменные лучше объявлять в отдельных строках.

Константы



Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору типа. Переменные с типом const представляют собой данные, используемые только для чтения, то есть этой переменной не может быть присвоено новое значение. Если после слова const отсутствует спецификатор типа, то константы рассматриваются как величины со знаком, и им присваивается тип int или long int в соответствии со значением константы: если константа меньше 32768, то ей присваивается тип int, в противном случае long int.

Пример:

const long int k = 25;

const m = -50; // подразумевается const int m=-50

const n = 100000; // подразумевается const long int n=100000

 

Присваивание



Для присваивания в Си служит знак " =". Выражение, стоящее справа от знака присваивания, вычисляется, и полученное значение присваивается переменной, стоящей слева от знака присваивания. При этом предыдущее значение, хранящееся в переменной, стирается и заменяется на новое.

Оператор " =" не следует понимать как равенство.
Например, выражение a = 5; следует читать как " присвоить переменной a значение 5".

Примеры:

x = 5 + 3; // сложить значения 5 и 3,

         // результат присвоить переменной x (записать в переменную x)

 

b = a + 4; // прибавить 4 к значению, хранящемуся в переменной a,

         // полученный результат присвоить переменной b (записать в переменную b)

 

b = b + 2; // прибавить 2 к значению, хранящемуся в переменной b,

         // полученный результат присвоить переменной b (записать в переменную b)


В правой части значение переменной может использоваться несколько раз:

c = b * b + 3 * b;

 

Арифметические операции



Арифметические операции записываются в выражениях следующим образом:

+ плюс
- минус
* умножить
/ разделить



Пример:

x = 3; // переменной x будет присвоено значение 3

 

y = x + 5; // к значению, хранящемуся в переменной x, будет прибавлено число 5,

      // полученный результат будет записан в переменную y

 

z = x * y; // значения переменных x и y будут перемножены,

      // результат будет записан в переменную z

 

z = z - 1; // от значения, хранящегося в переменной z, будет отнято 1

      // результат будет записан в переменную z


Таким образом, в переменной z будет храниться число 23

Дополнительные способы присваивания



Кроме простого оператора присваивания " =", в Си существует еще несколько комбинированных операторов присваивания: " +=", " -=", " *=< ", " /=", " %=".

Примеры:

x += y; // то же, что и x = x + y; - сложить x и y

      // и записать результат в переменную x

 

x -= y; // то же, что и x = x - y; - отнять от x значение y

      // и записать результат в переменную x

 

x *= y; // то же, что и x = x * y; - умножить x на y

      // и записать результат в переменную x

 

x /= y; // то же, что и x = x / y; - разделить x на y

      // и записать результат в переменную x

 

x %= y; // то же, что и x = x % y;

      // вычислить целочисленный остаток от деления x на y

      // и записать результат в переменную x

 

Инкремент и декремент



Если необходимо изменить значение переменной на 1, то используют инкремент или декремент.

Инкремент - операция увеличения значения, хранящегося в переменной, на 1.

Пример:

x++; // значение переменной x будет увеличено на 1


Декремент - операция уменьшения значения, хранящегося в переменной, на 1.

Пример:

x--; // значение переменной x будет уменьшено на 1


Инкремент и декремент относятся к операциям присваивания. При использовании декремента и инкремента совместно с оператором присваивания " =" применяют постфиксную (x++) или префиксную (++x) запись. Первой выполняется префиксная запись.

Примеры:

y = x++;


Предположим, что в переменной x хранилось значение 5. Тогда в y будет записано значение 5, после чего значение переменной x будет увеличено на 1. Таким образом, в y будет 5, а в x - 6.

y = --x;


Если в x хранилось значение 5, то сначала будет выполнено уменьшение x до 4, а затем это значение будет присвоено переменной y. Таким образом, x и y будет присвоено значение 4.



 

1
Управление портами в AVR GCC. Регистры DDRx и PORTx.
Представление чисел. Побитные операции.
Функция задержки. Безусловный переход в программе.

 

Порты микроконтроллера - это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR имеет восемь разрядов данных, которые могут передаваться или приниматься параллельно. Каждому разряду (или биту) соответствует вывод (ножка) микроконтроллера. Ножки микроконтроллера также называют пинами. Для обозначения портов используются латинские буквы А, В, С и т. д. Количество портов ввода/вывода варьируется в зависимости от модели микроконтроллера.

Любой порт микроконтроллера можно сконфигурировать как вход или как выход. Для того чтобы это сделать, следует записать в соответствующий порту регистр DDRx необходимое значение. Кроме того, как вход или выход можно сконфигурировать отдельно любой вывод (пин) порта. В любом случае, хотите вы сконфигурировать весь порт или отдельный вывод, вам необходимо будет работать с ригистрами DDRx.

DDRx - регистр направления передачи данных. Этот регистр определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае - как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B - регистр DDRB и т. д.

Используя AVR GCC, записать в необходимый регистр то или иное значение можно одним из следующих способов.

Для всего порта сразу.

DDRD = 0xff;

Все выводы порта D будут сконфигурированы как выходы.

0xff - шестнадцатиричное представление числа ff, где 0x является префиксом, используемым для записи шестнадцатиричных чисел. В десятичном представлении это будет число 255, а в двоичном виде оно будет выглядеть как 11111111. То есть во всех битах регистра DDRD будут записаны логические единицы.

В AVR GCC для представления двоичных чисел используется префикс 0b. Таким образом, число 11111111 должно представляться в программе как 0b11111111. Мы можем записать предыдущую команду в более читабельном виде.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.