Программирование на Си

Печать

Занятие №1. Простейшая программа

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 61

Задача: Разработаем программу управления одним светодиодом. При нажатии на кнопку светодиод горит, при отпускании гаснет.

Для начала разработаем принципиальную схему устройства. Для подключения к микроконтроллеру любых внешних устройств используются порты ввода-вывода. Каждый из портов способен работать как на вход так и на выход. Подключим светодиод к одному из портов, а кнопку к другому. Для этого опыта мы будем использовать контроллер Atmega8. Эта микросхема содержит 3 порта ввода-вывода, имеет 2 восьмиразрядных и 1 шестнадцатиразрядный таймер/счетчик. Также на борту имеется 3-х канальный ШИМ, 6-ти канальный 10-ти битный аналого-цифровой преобразователь и многое другое. По моему мнению микроконтроллер прекрасно подходит для изучения основ программирования.

Для подключения светодиода мы будем использовать линию PB0, а для считывания информации с кнопки воспользуемся линией PD0. Схема приведена на рис.1.

Рис. 1
Печать

Занятие №2. Переключение светодиода

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 23

Задача: Разработаем устройство управления светодиодом при помощи одной кнопки. При каждом нажатии на кнопку выход порта к которому подключен светодиод должен менять свое состояние на противоположное. Эта задача легко решается при помощи D-триггера, но все же рассмотрим как ее можно решить при помощи микроконтроллера.

Схема устройства такая же как в занятии 1. Алгоритм программы прост. Сначала настраиваем порты ввода-вывода. Проверяем состояние младшего разряда порта D(PD0) к которому подключена кнопка, а затем выполняем операцию сравнения, где PD0 проверяется на равенстве единице. Если условие выполняется программа переходит к началу цикла, если нет то выполняется еще одна операция сравнения, но уже линии PB0. Сначала оператор сравнения проверяет PB0 на равенство нулю, если результат истина(PB0=0), то разряд сбрасывается в единицу (PB0=1). Если ложно, устанавливается в ноль (PB0=0). Далее в программу вносим процедуру ожидания, без нее наш светодиод будет так часто мигать, что наш глаз не заметит этого. Основной цикл программы будет приостанавливается как только произойдет переключение светодиода и будет возобновляться как только будет отпущена кнопка.

Печать

Занятие №3. Мигание светодиодом

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 25

Задача: Разработаем устройство управления светодиодом. Кнопка будет включать и выключать мигание светодиода. Пока кнопка нажата светодиод мигает с частотой 2,5 Hz, если кнопка отпущена светодиод не горит.

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

- Производим чтение порта D;
- Проверяем PD0, если он равен нулю включаем алгоритм мигания;
- Если PD0 равен единице выключаем алгоритм мигания и тушим светодиод;
- Переходим к началу основного цикла(первый пункт);
- Пишем алгоритм мигания светодиодом (зажигаем светодиод, пауза, гасим светодиод, пауза);
- Переходим к началу алгоритма(первый пункт).

Печать

Занятие №4. Бегущие огни

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 20

Задача: разработаем устройство которое должно обеспечивать движение огня в двух разных направлениях. Переключение направления движения будет осуществляться с помощью переключателя S1. В соответствие с поставленной задачей наше устройство должно управлять восемью светодиодами HL1-HL8. Подключим восемь светодиодов к порту D микроконтроллера через токоограничительные резисторы по 220 Ом. Переключатель подключим к младшему разряду порта C.

Печать

Занятие №5. Бегущие огни с использованием таймера

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 19

Доработаем программу «Бегущие огни», изменив процедуру формирования задержки. Чтобы не загружать процессор новая процедура задержки должна использовать один из внутренних таймеров/счетчиков и не использовать прерывания.

В микроконтроллере Atmega8 имеются 3 таймера: 2 восьмиразрядных и 1 шестнадцатиразрядный. Для формирования временных интервалов таймер просто подсчитывает тактовые импульсы от системного генератора.

В нашем случае частота равна 4 MHz, а период импульсов 1/4MHz=0,25мкс. Для того чтобы получить на выходе 200мс, необходимо иметь коэффициент деления равный 200мс/0,25мкс= 800000. Восьмиразрядный таймер имеет максимальный коэффициент пересчета 28=256, а шестнадцатиразрядный 216=65536. То есть даже шестнадцатиразрядного таймера нам не хватит для формирования требуемой задержки. Тогда воспользуемся предварительным делителем. Этот делитель производит предварительное деление тактового сигнала перед тем как он поступит на вход таймера.

Печать

Занятие №6. Бегущие огни. Использование прерываний по таймеру

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 11

На предыдущем занятии мы использовали таймер для формирования задержки, но не использовали его главного преимущества: способности вызывать прерывания. В подобных случаях(формирование задержки) применяют прерывания по таймеру. Это позволяет более точно формировать промежутки времени, но и главное разгрузить центральный процессор.

В данном случае мы будем использовать режим работы таймера – сброс при совпадении(СТС). В этом режиме таймер сам периодически вырабатывает запросы на прерывания с заранее заданным периодом.

Все функции управления движением огней выполняет процедура обработки прерывания. При каждом вызове прерывания процедура производит сдвиг огней на 1 шаг в нужном направлении.

Печать

Занятие №7. Операторы управления битами

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 12

Сдвиг влево ( << )

Сдвигает число на n разрядов влево. Старшие n разрядов при этом исчезают, а младшие n разрядов заполняются нулями.

unsigned char temp = 5; // 0b00000101

temp = temp << 1; // теперь в переменной temp число 10 или 0b00001010

temp = temp << 4; // теперь в переменной temp число 160 или 0b10100000

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

temp = 42; // 0b00101010

temp <<= 3; // теперь в переменной temp число 80 или 0b01010000

Операция сдвига влево на n разрядов эквивалентна умножению переменной на 2n.

Печать

Занятие №8. Реализация ШИМ

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 26

Цифровые устройства, например, микроконтроллер может работать только с двумя уровнями сигнала, т.е. ноль и единица или выключено и включено. Таким образом, вы можете легко использовать его для контроля состояния нагрузки, например включит или выключить светодиод. Так же вы можете использовать его для управления любым электрическим прибором, используя соответствующие драйверы (транзистор, симистор, реле и т.д.).Но иногда нужно больше, чем просто "включить" и "выключить" устройство. Поэтому, если вы хотите контролировать яркость светодиода (или лампы) или скорости двигателя постоянного тока, то цифровые сигналы просто не могу этого сделать. Эта ситуация очень часто встречается в цифровой технике и называется Широтно-Импульсной Модуляцией(PWM).

Рекомендуем посмотреть