Что произойдет если создать директиву define high low
Перейти к содержимому

Что произойдет если создать директиву define high low

  • автор:

Эксперимент 2. Маячок с нарастающей яркостью

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

Видеоурок

Прочтите перед выполнением

Список деталей для эксперимента

1 беспаечная макетная плата
1 резистор номиналом 220 Ом

Для дополнительного задания

еще 1 светодиод
еще 1 резистор номиналом 220 Ом
еще 2 провода

Принципиальная схема

Схема на макетке

Обратите внимание

Не любой порт Arduino поддерживает широтно-импульсную модуляцию, если вы хотите регулировать напряжение, вам подойдут пины, помеченные символом тильда «~». Для Arduino Uno это пины 3, 5, 6, 9, 10, 11

Скетч

// даём разумное имя для пина №9 со светодиодом // (англ. Light Emitting Diode или просто «LED») // Так нам не нужно постоянно вспоминать куда он подключён #define LED_PIN 9 void setup() { // настраиваем пин со светодиодом в режим выхода, // как и раньше pinMode(LED_PIN, OUTPUT); } void loop() { // выдаём неполное напряжение на светодиод // (он же ШИМ-сигнал, он же PWM-сигнал). // Микроконтроллер переводит число от 0 до 255 к напряжению // от 0 до 5 В. Например, 85 — это 1/3 от 255, // т.е. 1/3 от 5 В, т.е. 1,66 В. analogWrite(LED_PIN, 85); // держим такую яркость 250 миллисекунд delay(250); // выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В. // Больше напряжение — выше яркость! analogWrite(LED_PIN, 170); delay(250); // все 5 В — полный накал! analogWrite(LED_PIN, 255); // ждём ещё немного перед тем, как начать всё заново delay(250); }

Пояснения к коду

Идентификаторы переменных, констант, функций (в этом примере идентификатор LED_PIN ) являются одним словом (т.е. нельзя создать идентификатор LED PIN ).

Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания _ . При этом идентификатор не может начинаться с цифры.

PRINT // верно PRINT_3D // верно MY_PRINT_3D // верно _PRINT_3D // верно 3D_PRINT // ошибка ПЕЧАТЬ_3Д // ошибка PRINT:3D // ошибка

Регистр букв в идентификаторе имеет значение. Т.е. LED_PIN , LED_pin и led_pin с точки зрения компилятора — различные идентификаторы

Идентификаторы, создаваемые пользователем, не должны совпадать с предопределенными идентификаторами и стандартными конструкциями языка; если среда разработки подсветила введенный идентификтор каким-либо цветом, замените его на другой

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

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

Также полезно снабжать код программы комментариями: в примерах мы видим однострочные комментарии, которые начинаются с двух прямых слэшей // и многострочные, заключённые между /* */

// однострочный комментарий следует после двойного слеша до конца строки /* многострочный комментарий помещается между парой слеш-звездочка и звездочка-слеш */

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

Функция analogWrite(pin, value) не возвращает никакого значения и принимает два параметра:
pin — номер порта, на который мы отправляем сигнал

value — значение скважности ШИМ, которое мы отправляем на порт. Он может принимать целочисленное значение от 0 до 255, где 0 — это 0%, а 255 — это 100%

Что будет если подключить светодиод без резистора?

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

Зачем нужна встроенная функция pinMode? Какие параметры она принимает?

Функция pinMode настраивает определённый порт на режим выхода или входа. Соответственно она принимает параметры pin(номер порта) и value(INPUT, OUTPUT).

Зачем нужна встроенная функция digitalWrite? Какие параметры она принимает?

Функция digitalWrite не возвращает никакого значения и принимает два параметра:

Pin – номер цифрового порта на который мы отправляем сигнал

Value – значение которое мы отправляем на порт (HIGH, LOW).

С помощью какой встроенной функции можно заставить микроконтроллер ничего не делать?

С помощью функции delay можно остановить работу микроконтроллера на определённый промежуток времени.

В каких единицах задается длительность паузы для этой функции?

Длительность паузы для функции delay задаётся в миллисекундах.

Задания для самостоятельного решения

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

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

Эксперимент 2. Маячок с нарастающей яркостью

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

Схема

Код

#define LED_PIN 9

Вопросы для проверки себя

Какие из следующих идентификаторов корректны и не вызовут ошибку?

Так как идентификаторы могут состоять только из латинских букв, цифр и символов подчеркивания_, и при этом не могут начинаться с цифр, то ошибки не вызовут идентификаторы:

Что произойдет, если создать директиву #define HIGH LOW?

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

Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?

Вывод 7 не поддерживает ШИМ-сигнал, то есть на нём нельзя регулировать напряжение.

Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию analogWrite(6, 153)?

На 6 пине получим напряжение 3В.

Какое значение параметра value нужно передать функции analogWrite, чтобы получить усреднённое напряжение 2 В?

Задания для самостоятельного решения

Отключите питание, отключите светодиод от 9-го порта и подключите к 11-му. Измените программу так, чтобы схема снова заработала

#define LED_PIN 11

Измените код программы так, чтобы в течение секунды на светодиод последовательно подавалось усреднённое напряжение 0, 1, 2, 3, 4, 5 В

Вопросы по информатике. Arduino

.Какие из следующих идентификаторов корректны и не вызовут ошибку?
13pin
MOTOR_1
контакт_светодиода
sensor value
leftServo
my-var
distance_eval2
2.Что произойдет, если создать директиву #define HIGH LOW?
3.Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?
4.Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию analogWrite(6, 153)?
5.Какое значение параметра value нужно передать функции analogWrite, чтобы получить усреднённое напряжение 2 В?

Лучший ответ

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

Данила ОрловУченик (104) 5 лет назад

пошел домой

Остальные ответы

Директивы ассемблера

Директивы представляют собой команды управления компилятором. Объявление каждой из них должно начинается с точки. Практика показывает, что в любом ассемблере наиболее интенсивно используется только порядка 10…20 директив. Все остальные либо не являются обязательными, либо отвечают за управление, лишь незначительными свойствами компилятора. К “основным”, характерным и для ассемблеров других процессоров, относятся директивы .equ, .org, .def, .сseg, .dseg и т.д. Ну, а такие директивы, как .dq, .exit, .listmac в реальных программах встречаются действительно очень редко. Ниже приведен перечень, описание и примеры использования директив фирменного ассемблера микроконтроллеров AVR. Директива .include подставляет текстовый файл в то место программы, где происходит ее употребление. В дополнении к этому сам файл подстановки также может содержать директиву .include. Если файл расположен в директории проекта или в одной из служебных папок, то вместо полного пути, допускается указывать, лишь ссылку на его имя. Директива .include
Синтаксис написания:
.include «»
Пример использования:

.include "m8def.inc" ;вставка стандартного заголовочного файла

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

.exit ;конец файла

Директивы .nolist и .list служат для управления файлом листинга, который обычно генерируется после сборки проекта. Первая из них запрещает, а другая, соответственно, разрешает вывод информации в файл. Директива .list отменяет действие .nolist и наоборот. Директивы .nolist, .list
Синтаксис написания:
.nolist, .list
Пример использования:

.nolist ;запретить вывод текста файла “m8def.inc” .include "m8def.inc" ;в файл листинга программы .list ;продолжить вывод информации

Директива .equ присваивает символьному имени некоторое числовое значение. Символьное имя должно быть уникальным и не может быть изменено в процессе написания программы. Директива не может применяться для назначения символьных имен регистрам общего назначения. Директива .equ
Синтаксис написания:
.equ =
Пример использования:

.equ DDRB = 0x17 ;присвоение имени DDRB значения 0x17 .equ PORTB = DDRB + 1 ;присвоение имени PORTB значения 0x18

Директива .set производит то же самое действие, что и .equ. Но в отличии от последней, символьное имя может быть переопределено в любом месте программы. Директива .set
Синтаксис написания:
.set =
Пример использования:

.set OFFSET = 0x100 ;присвоение имени OFFSET значения 0x100 . .set OFFSET = OFFSET + 1 ;переопределение значения OFFSET

Директива .def присваивает символьное имя одному из регистров общего назначения. В дальнейшем ходе программы данное имя может быть отменено директивой .undef. Директивы .def, .undef
Синтаксис написания:
.def =
.undef
Пример использования:

.def temp = R16 ;присвоение регистру R16 имя temp .undef temp ;отмена дальнейшего использования имени temp

Директивы .db, .dw, .dd, .dq предназначены для резервирования памяти микроконтроллера под инициализированные данные. Все они могут применяться только в сегментах кода и EEPROM-памяти. Разница между этими директивами заключается в разрядности, представляемых данных. Директива .db резервирует байты, .dw – слова, .dd – двойные слова. В редких случаях может так же оказаться удобным использование директивы .dq, резервирующей 64-разрядные данные. Директивы .db, .dw, .dd, .dq
Синтаксис написания:
: .db
: .dw
: .dd
: .dq
Пример использования:

label: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 .dd 0xFADEEFCA, 4208914378, -86052918 .dq 0xFADEEFCAEFBACDEF, 18077149609196178927, -521103510453211

Директива .byte резервирует память под неинициализированные данные в сегментах SRAM и EEPROM. Директива .byte
Синтаксис написания:
: .byte
Пример использования:

.equ PAGESIZE = 0x20 buffer: . byte 2*PAGESIZE ;резервирование 64 байт в SRAM

Директивы .dseg, .eseg, .cseg определяют начало сегментов данных, EEPROM-памяти и кода соответственно. В исходном файле каждый из сегментов может быть представлен только в одном экземпляре. В случае если все эти директивы отсутствуют в программе, компилятор по умолчанию считает, что все операторы расположены в секции кода. Директивы .dseg, .eseg, .cseg
Синтаксис написания:
.dseg
.eseg
.cseg
Пример использования:

.dseg ;начало сегмента данных buffer: . byte 32 ;резервирование 32 байт под буфер в SRAM .cseg ;начало сегмента кода rjmp initial . string: .db "ATmega8",0 ;строка, хранящаяся во FLASH-памяти .eseg ;начало сегмента EEPROM-памяти _var: .byte 2 ;резервирование 2-ух байт под переменную _var _cnst: .db 0xAA ;резервирование байта под переменную _cnst = 0xAA

Директива .org позволяет задать компилятору начальный адрес в пределах сегментов кода, данных и EEPROM-памяти. В случае применения в сегменте кода, директива определяет адрес размещения 16-разрядного слова программ. Директива .org
Синтаксис написания:
.org
Пример использования:

.equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;начало сегмента данных .org SRAM_START ;резервирование 32 байт в SRAM под буфер, buffer: . byte 32 ;начиная с адреса 0x60 .cseg ;начало сегмента кода .org 0 ;вектор сброса по адресу 0 rjmp initial . .org 0x50 ;начало основной программы с адреса 0x50 initial: ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp .

Директивы .macro, .endmacro (.endm), определяющие начало и конец макроса соответственно. Директивы .macro, .endmacro (.endm)
Синтаксис написания:
.macro
Пример использования:

.macro set_bit ;объявление макроса установки бита порта sbi @0,@1 ;установить бит @1 регистра порта @0 sbi @0-1,@1 ;настроить на вывод линию @1 регистра DDRx .endm . set_bit PORTB,0 ;установить на линии 0 порта B лог.1

Директива .listmac разрешает расширенный вывод текста макросов в файле листинга. В этом случае содержимое каждого макроопределения, встретившегося в программе, отображается целиком. Если директива не используется, то код в нутрии макроса не приводится. Директива .listmac
Синтаксис написания:
.listmac
Пример использования:

.listmac ;разрешить разворачивать текст макросов в файле листинга

Директивы .message, .warning, .error предназначены для вывода в окно сборки проекта дополнительной информации о ходе компиляции программы. Директива .message генерирует сообщение для строки, в которой был встречен ее вызов. Применение .warning приводит к выдачи предупреждения, а .error – к сообщению об ошибки. В последнем случае сборка проекта прекращается. Директивы .message, .warning, .error
Синтаксис написания:
.message «»
.warning «»
.error «»
Пример использования:

.message "Macros has been called here." .warning "Too high frequency!" .error "Wrong macro argument!"

Группа директив условной компиляции .ifdef, .ifndef, .if, .else, elif, .endif используются для вставок программного кода в зависимости от различных условий. Директива .ifdef проверяют наличие объявления некоторого символьного имени. За директивой может следовать набор команд, которые будут подставлены в текст, если условие проверки “истина” (имя было объявлено). Директива .ifndef противоположна .ifdef проверяет отсутствие объявления символьного имени. Директива .if производит подстановку кода, когда выполняется условие сравнения, указанное в качестве ее параметра. Команды, которые должны выполняться, в случае если условие директивы .if “ложно” – располагаются после директивы .else. Ветвление типа “если” — “то” может иметь несколько уровней вложения благодаря директиве .elif. Каждый блок проверки, начинающийся с .ifdef, .ifndef, .if, должен быть закрыт директивой .endif. Директивы if, .ifdef, .ifndef, .else, elif, .endif
Синтаксис написания:
.ifdef (или .ifndef )
.if
.else (или .elif < условие>)
.endif
Пример использования:

.macro del_ms ;макрос, формирующий задержку времени в мс .ifndef FREQ ;если не объявлена константа FREQ (частота в Гц), .warning "Undefined FREQ constan!" ;выдаем предупреждение и .equ FREQ = 1000000 ;присваиваем по умолчание значение 1 МГц .endif .equ DELAY = (@0*FREQ)/4000 ;величина задания задержки времени .if DELAY > 65535 ;если DELAY размером больше 2 байт, то .error “Integer overflow in DELAY!” ;реализация макроса не возможна .else push XL ;сохраняем в стеке рабочие регистры XL, XH push XH ldi XH,high(DELAY) ;цикл задержки времени ldi XL,low(DELAY) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;восстанавливаем из стека рабочие регистры XH, XL .endif .endm . .equ FREQ = 2000000 ;объявление тактовой частоты 2 МГц . del_ms 25 ;формирование задержки времени в 25 мс

Перейти к следующей части: Содержимое заголовочного файла

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0

Вознаградить Я собрал 0 1

Оценить статью

  • Техническая грамотность

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *