Конвертирование типов переменных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Конвертирование типов переменных



 

Функции конвертирования типов переменных.

В качестве входного параметра принимается переменная любого типа.

Функция синтаксис тип возвращаемой переменной

char() char(x) char

byte() byte(x) byte

int() int(x) int

word() word(x) word(h, l) word

long() long(x) long

float() float(x) float

 

Область действия переменной и квалификаторы

 

Область действия переменной

Переменные в языке C имеют область действия переменной. Глобальные переменные видимы в любой функции программы. Локальные переменные видимы только для функции, в которой они были объявлены. В среде разработки Arduino глобальными, считаются все переменные объявленные вне функций.

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

Иногда удобно объявлить переменную в теле цикла. В этом случае создается переменная, доступ к которой есть только внутри цикла.I

Пример:

int gPWMval; // глобальная переменная

void setup()

{

//...

}

 

void loop()

{

int i; // "i" локальная переменная, видимая только для "loop"

float f; // "f" локальная переменная, видимая только для "loop"

//...

 

for (int j = 0; j <100; j++){

// доступ к j есть толкьо внутри цикла.

}

}

 

Static

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

Переменые, объявленные как Static будут созданы лишь однажды, при первом вызове функции.

Пример:

/* RandomWalk

* Paul Badger 2007

* RandomWalk wanders up and down randomly between two

* endpoints. The maximum move in one loop is governed by

* the parameter "stepsize".

* A static variable is moved up and down a random amount.

* This technique is also known as "pink noise" and "drunken walk".

*/

#define randomWalkLowRange -20

#define randomWalkHighRange 20

int stepsize;

int thisTime;

int total;

void setup()

{

Serial.begin(9600);

}

void loop()

{ // tetst randomWalk function

stepsize = 5;

thisTime = randomWalk(stepsize);

Serial.println(thisTime);

delay(10);

}

int randomWalk(int moveSize){

static int place; // variable to store value in random walk - declared static so that it stores

// values in between function calls, but no other functions can change its value

 

place = place + (random(-moveSize, moveSize + 1));

if (place < randomWalkLowRange){ // check lower and upper limits

place = place + (randomWalkLowRange - place); // reflect number back in positive direction

}

else if(place > randomWalkHighRange){

place = place - (place - randomWalkHighRange); // reflect number back in negative direction

}

return place;

}

 

Volatile

volatile это слово, известное как квалификатор переменной, оно обычно пишется перед типом переменной.

Объвление переменной как volatile является директивой компилятора. Компилятор - это программа, которая транслирует ваш C/C++ код в машинный код, который явлется настоящими инструкциями для чипов ATmega/

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

Переменная должна быть объявлена как volatile в случае, если она может быть внезапно изменена во время выполнения основной программы. В МК таким слабым местом является использование прерываний.

Пример

// toggles LED when interrupt pin changes state

int pin = 13;

volatile int state = LOW;

void setup()

{

pinMode(pin, OUTPUT);

attachInterrupt(0, blink, CHANGE);

}

void loop()

{

digitalWrite(pin, state);

}

void blink()

{

state =!state;

}

 

Const

Данный квалификатор определяет перменную как read-only - только для чтения. Это значит, что вы можете использовать значение переменной, но не можете его менять. В случе обращения к перезаписи такой переменной компилятор выдаст ошибку.

Константы, объявленные квалификаторм const подчинаются всем правилам переменных. Это значит, что можно не использовать #define для объявления константы и использвоание const является более правильным,ч ем использование #denife.

Пример;

const float pi = 3.14;

float x;

//....

x = pi * 2; // it's fine to use const's in math

pi = 7; // illegal - you can't write to (modify) a constant

 

#define или const

Вы можете использовать const или #define для создания цифровых или строковых констант. Для массивов вы можете использовать только const. На практике использование const имеет преимущество перед #define.

Переменные в языке C имеют область действия переменной.

Глобальные переменные видимы в любой функции программы. Локальные переменные видимы только для функции, в которой они были объявлены. В среде разработки Arduino глобальными, считаются все переменные объявленные вне функций.

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

Иногда удобно обхъявлить переменную в теле цикла. В этом случае создается переменная, доступ к которой есть только внутри цикла.I

Пример:

int gPWMval; // глобальная переменная

 

void setup()

{

//...

}

 

void loop()

{

int i; // "i" локальная переменная, видимая только для "loop"

float f; // "f" локальная переменная, видимая только для "loop"

//...

 

for (int j = 0; j <100; j++){

// доступ к j есть толкьо внутри цикла.

}

}

 


 

Утилиты

 

Sizeof

Описание:

Оператор возвращает число байт, которые занимает переменная, или массив.

Синтаксис:

sizeof(переменная)

Параметр:

переменная или массив любого типа (int, float, byte и т.п.)

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

Следует помнить, что sizeof возвращает полное число байт. Для типов переменных, занимающих более 1 байт, цикл for может выглядеть следующим образом:

for (i = 0; i < (sizeof(myInts)/sizeof(int)) - 1; i++) {

//тело цикла

}

 

Таблица кодировок

 

Таблица кодировок ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией;) Разработана в 1960-х. Это стандартный метод кодирования текста числами.

Помните, что первые 32 символа непечатные, поскольку являются управляющими. У некоторых имеется соответствие вызова для функций print().

 

 

Цифровой ввод вывод

 

PinMode()

Описание:

Устанавливает типа порта - входной или выходной.

Синтаксис:

pinMode(pin,mode)

Параметры:

pin: номер конфигурируемого порта

mode: тип порта - INPUT или OUTPUT

Следует помнить, что аналоговые порты можно использовать в качестве цифровых, используя номера от 14(аналоговый вход 0) до 19 (аналоговый вход 5)

DigitalWrite()

Описание:

Устанавливает на цифровом пине высокий или низкий уровень напряжения. Если пин был сконфигурирован как выходной, то на нем устанавливается +5В (или 3,3В для соответствующих платформ) для высокого уровня напряжения (HIGH) и 0В для низкого уровня (LOW).

Если вывод был сконфигурирован как входной, то при установке высокого уровня активируется внутренний "подтягивающий" резистор. Установка низкого уровня отключает подтяжку.

 

синтаксис:

digitalWrite(pin, value)

Параметры:

pin: номер пина

value: HIGH или LOW

 

DigitalRead()

Описание:

Возвращает уровень напряжения соответствующего пина.

Синтаксис:

digitalRead(pin)

Параметры:

pin: номер пина, который хотим проверить (int)

ВОзвращает:

HIGH или LOW

Следует помнить, что опрашивая неподключенный пин, функция digitalRead() будет возвращать HIGH или LOW в случайном порядке

 

Аналоговый ввод вывод

 

AnalogReference(type)

Описание:

Устанавливает опорное напряжение для аналоговых входов. Функция analogRead() вернет 1023 для входного уровня равного опорному напряжению. параметры могут быть следующими:

DEFAULT: Значение опроного напряжения по умолчанию 5В

INTERNAL: используется внутренний источник опорного напряжения, уровень которого равен 1,1В для ATmega168 и 2,56В для ATmega8

EXTERNAL: Уровень опорного напряжения подается с внешнего источника на пин AREF платы.

Параметры:

type: типа испоьлзуемого опорного напряжения (DEFAULT, INTERNAL, или EXTERNAL).

Внимание:

Хорошим способом считается подключение внешнего источника к AREF через резистор в 5к. Это может предотвратить проблемы связанные с чипом ATmega если установки analogReference() не совместимы с токовой защитой. Следует помнить, что резистор уменьшает подаваемое напряжение, поскольку имеется внутренний резистор на 32к на пине AREF. Два резистора образуют делитель напряжения.

Подключение внешнего источника опортного напряжения позволяет изменять напряджение AREF на лету, не принимая дополнительных конфигураций АЦП.

Использование вывода AREF

Поданное с внутренного источника напряжение вывода AREF на порт АЦП выдаст максимальное значение - 1023.

Меньшие напряжения пропорциональны. Таким образом, при DEFAULT, поданное на вход АЦП напряжение 2,5В выдаст приблизительно 512.

 

По умолчанию во всех реализациях Arduino ничего не покдлючаено к AREF (ATmega вывод 21) В этом случае установка DEFAULT для analogReference подключает вывод AREF к AVCC. Это дает низкое сопротивление подключения. Поэтому, ошибочное внешнее подключение AVCC к выводу AREF при установке DEFAULT могут быть опасными для чипа ATMEGA.

Вывод AREF также может быть подключен ко внутреннему испочнику в 1,1В (или 2,56 на ATmega8) используя analogReference(INTERNAL).С такой установкой подведенное к аналоговым входам напряжение равное или большеее опорного выдадут результат в 1023. Меньше напряжения выдадут пропорциональные результаты. Так, 0,55В дадут около 512.

Соденинение между источником 1,1В и выводом AREF высокоимпедансвое и измерить его можно только мультиметром с высоким входным сопротивлением. Внешний источник, подключенный в выводу AREF не повредит чип, однако, перезапишет значение в 1,1В и АЦП будет опираться на внешний источник.

Корректные установки для подключения внешнего источника - analogReference (EXTERNAL). Она отключает все внутренние источники и поданное внешнее напряжение на вывод AREF устанавливает опорное напряжение для АЦП.

 

AnalogRead()

Описание:

Читает значение определенного аналогового вывода. Платформы Arduino имеют 6 (8 у Mini и Nano) 10-битных Аналогово-Цифровых преобразователей. Это означает, что входные напряжения между 0 и 5Впереводятся в цифровое значение от 0 до 1023. Дискретность преобразования в таком случае составляет 5/1024 = 0,0049В.

Выполнение преобразования занимает порядка 100мкс, т.е. максимальная скорость считывания составляет 10 000 раз в секунду.

Синтаксис:

analogRead(pin)

Параметры:

pin: номер аналогового пина, который следует прочесть (от 0 до 5 на большистве платформ, или от 0 до 7 на Mini и Nano)

Возвращает:

int (0 to 1023)

Примечание:

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

Пример:

int analogPin = 3; // potentiometer wiper (middle terminal) connected to analog pin 3

int val = 0; // variable to store the value read

void setup()

{

Serial.begin(9600); // setup serial

}

void loop()

{

val = analogRead(analogPin); // read the input pin

Serial.println(val); // debug value

}


AnalogWrite()

Описание:

Пишет аналоговое значение (заполнение ШИМ) в порт. Может использоваться, например, для установки различной яркости свечения светодиодов, регулирования скорости двигателей.После вызова этой функции на выводе будет присутсвовать меандр с определенным заполнением до нового вызова этой или другой функции в применении к этому порту. Частота сигнала ШИМ состовляет примерно 490Гц.

На новых платформах, включая Mini и BT на чипе ATmega168, эта функция работает на выводах 3,5,6,9,10 и 11. На более старых USB и Serial платформах на чипе ATmega8 поддерживаются только порты 9,10 и 11

Синтаксис:

analogWrite(pin, value)

Параметры:

pin: вывод, на который пишем.

value: коэффициент заполнения: между 0 (всегда выключен) и 255 (всегда включен).

analogWrite не имеет никакого отношения к портам АЦП и analogRead.

Вам не нужно вызывать pinMode() для установки вывода как выходного, перед использованием функции analogWrite().

На выводах 5 и 6 генерируется напряжение чуть большее, чем установленное коэффициентом заполнения. Вызвано это функциями millis() и delay(), которые используют один и тот же внутренний таймер, что и для генерации ШИМ. Поэтому analogWrite(x, 0) не полностью выключает выводы 5 и 6.

Пример:

Устанавливает яркость свечения светодиода в зависимости от положения потенциометра.

int ledPin = 9; // LED connected to digital pin 9

int analogPin = 3; // potentiometer connected to analog pin 3

int val = 0; // variable to store the read value

void setup()

{

pinMode(ledPin, OUTPUT); // sets the pin as output

}

void loop()

{

val = analogRead(analogPin); // read the input pin

analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

}

 

Расширенный ввод вывод

 

ShiftOut()

Описание:

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

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

Синтаксис:

shiftOut(dataPin, clockPin, bitOrder, value)

Параметры:

dataPin: вывод, по которому будем слать данные (int)

clockPin: тактирующий вход, состояние его будет изменяться как только следующий бит будет готов к отправке(int)

bitOrder: в каком порядке перебираем биты; MSBFIRST или LSBFIRST.

(первый старший, или, первый младший)

value: данные для передачи (byte)

dataPin и clockPin должны быть сконфигурированы как выходные при помощи pinMode().

shiftOut может передать 1 байт (8 бит) поэтому требуется два шага для передачи значений, больших 255.

int data = 500;

// передаем старшие 8 бит

shiftOut(dataPin, clock, MSBFIRST, (data >> 8));

// и младшие 8 бит

shiftOut(data, clock, MSBFIRST, data);

Пример:

Смотрите схему подключения микросхемы сдвигового регистра 74HC595.

//**************************************************************//

// Name: shiftOutCode, Hello World //

// Author: Carlyn Maw,Tom Igoe //

// Date: 25 Oct, 2006 //

// Version: 1.0 //

// Notes: Code for using a 74HC595 Shift Register //

//: to count from 0 to 255 //

//****************************************************************

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;

void setup() {

//set pins to output because they are addressed in the main loop

pinMode(latchPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, OUTPUT);

}

void loop() {

//count up routine

for (int j = 0; j < 256; j++) {

//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, j);

//return the latch pin high to signal chip that it

//no longer needs to listen for information

digitalWrite(latchPin, HIGH);

delay(1000);

}

}


PulseIn()

Описание:

Измеряет длину импульса (HIGH или LOW). например, если HIGH, то pulseIn() будет ждать, когда на входе будет HIGH, запустит счет, после чего будет ждать, когда вход станет LOW и выключит отсчет вренени.

Возвращает: длину импульса в микросекундах или 0, если за определенное время ни одного импульса не пришло.

Функция нормально работает при длине импульса от 10мкс до 3 минут.

Синтаксис:

pulseIn(pin, value)

pulseIn(pin, value, timeout)

Параметры:

pin: номер пина, на котором мы хотим измерить длину импульса. (int)

value: тип измеряемого импульса HIGH или LOW (int)

timeout (опционально): число микросекунд ожидаения импульса. По умолчанию 1 минута. (unsigned long)

Пример:

int pin = 7;

unsigned long duration;

void setup()

{

pinMode(pin, INPUT);

}

void loop()

{

duration = pulseIn(pin, HIGH);

}

 

Время

 

Millis()

Описание:

Возвращает количество милисекунд, прошедшее с момента запуска платформой данной программы. Это число переполнится(и счет снова начнется от нуля) примерно через 50 дней.

Входной параметр отсутсвует

Следует помнить, что тип возвращаемой переменной unsigned long, и могут возникать ошибки, если программист попытается совершить математическими операции с переменными других типов.

 

Micros()

Описание:

Возвращает число микросекунд, прошедших с момента запуска платформой программы. Это число переполнится (и счет снова пойдет от нуля) примерно через 70 минут. На 16МГц платформах Arduino, эта функция выполняется за 4 микросекунды(и возвращаемый результат идет с поправкой плюс 4 микросекунды). На 8 МГц платформах функция имеет задержку в 8 микросекунд.

Входной параметр отсутсвует

 


Delay(ms)

Описание:

Останавливает выполнение программы на определенное время в милисекундах

Параметр:

ms (unsigned long): время паузы в милисекундах

Значения не возвращает

 

Внимание:

Довольно легко создать программу мигающего светодиода при помощи задержки времени, и многе скетчи используют задержки для подобных целей. Однако, во время задержки микроконтроллер засыпает, более не выполняя никакую работу. Более совершенным способом контроля времени является использование функции millis()

Многие программисты избегают применения функции delay() для отсчета событий, длинной более 10 мс.

Основной причиной использования delay() является то, что во время задержки, прерывания продолжают работать. Это означает также нормальную работу коммуникационного порта - RX записывает принимаемые данные. ШИМ также поддерживается.

 

delayMicroseconds(us)

Описание:

Приостанавливает выполнение программы на определенное время задержки в микросекундах. На данный момент, максимальное время задержки - 16383мкс. Оно должно измениться в последующих версиях Arduino. Для более длительных задержек стоит использовать delay() вместо нее.

Параметр:

us: время паузы в микросекундах.

 

Примечание:

Данная функция корректно работает при задержках от 3мкс и более. Авторы программы не гарантируют точную задержку при меньших значениях.

Следует использовать эту функцию только для очень коротких задержек. В версии 0018 функция не отключает прерывания.

 

Математические функции

 

Min(x, y)

Описание:

Возвращает минимальное из двух значений

Параметры:

x, y - переменные любого типа

 

Max(x, y)

Описание:

возвращает максимальное из двух значений

Параметры:

x, y - переменные любого типа

 


Abs(x)

Описание:

Возвращает модуль числа.

параметры:

x: число

Возвращает

x: если x больше или равен 0.

-x: если x меньше 0.

Внимание:

Избегайте использования этих функции в скобках. Это может привести к некорректным результатам.

 

constrain(x, a, b)

Описание:

определяет принадлежность числа определенному диапазону.

Параметры:

x: число для сравнения, все типы данных

a:наименьшее число диапазона, все типы данных

b: наибольшее число диапазона, все типы данных

Возвращает:

x: если x находится между a и b

a: если x меньше, чем a

b: если x больше, чем b

 

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 414; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.168.172 (0.17 с.)