Неприятности с большими числами – для новичков в радиоделе

May 4, 2014 by admin Комментировать »

Запишем набор частот 100-300-500-700-900 Гц И переведём этот набор в набор периодов: 10–3–2–14–11 (мс) и нужные нам длительности 5-15-1-07-05 (мс)

Мы не можем в байт записать число с плавающей точкой Но можем выразить длительности в микросекундах: 5000-1500-1000-700-500 (мкс) Правда, при этом мы попадаем в неприятность с другим аспектом – как вы помните, мы передавали целое число в переменную, а передать удавалось только байт Давайте попробуем один «фокус» Он может получиться, может не получиться Если не получится, постараемся придумать что-то другое

Суть этого «фокуса», думаю, прояснит следующий рисунок:

Передаваемое переменной число мы сохраняем таким, чтобы хватило байта Об этом говорит присваивание pause = 50 А для получения необходимой длительности импульса нам нужно умножить его на 100

Этим занимается добавленный цикл, который повторяется 100 раз Такой цикл называется счётным

Рис 2316 Способ получения длительности импульса 5000 мс

Чтобы цикл стал счётным, следует настроить программный элемент While

Рис 2317 Настройки цикла для организации счётного цикла

В программе Flowcode можно реализовать три разновидности циклов: While, Do.until и счётный Последний цикл на языках высокого  уровня называют циклом  For Он выполняется заданное количество раз, и переменная для подсчёта числа проходов входит в его состав

Убедимся, что этот приём даёт должный результат Проверим фрагмент программы

Рис 2318 Проверка на «живом» макете длинных пауз

Длительность импульса 5 мс (с небольшой ошибкой), как мы и планировали В дальнейшем для проверки программы можно использовать компьютер Поскольку проверка в программе ISIS дала аналогичный результат

Двойная проверка понадобилась  потому, что мы «совершали манёвр» для обхода проблемы И, если бы ошиблись, то могли зайти в реализации программы слишком далеко, когда возвращаться уже трудно

Рис 2319 Проверка в программе ISIS (Proteus)

Следующий, интересующий нас диапазон частот: 1-10 кГц Он соответствует периодам: 1000-330- 200-140-110 (мкс) В этом случае мы можем повторить свой манёвр, используя счётный цикл 10 раз А в массив записать значения (половина длительности, делённая на 10): 50-16-10-7-6

Микроконтроллер, особенно при использовании кварцевого резонатора для создания тактового генератора, достаточно точно может воспроизвести набор частот Но при создании программы мы округляли значения, вычисляя период и длительности импульсов, что даёт приблизительное соответствие частоты Мало того, даже в первом эксперименте на макетной плате, задавая паузу в 10 мкс, мы могли видеть ошибку Эта ошибка, чтобы не возвращаться к этому вопросу, возникает по причине, которую я постараюсь показать сейчас

Для этого возьмём простейшую программу:

Рис 2320 Простейшая программа, использующая паузу

Мы ничего не делаем в программе, кроме паузы в 1 мкс Зайдём в программе Flowcode в пункт основного меню Чип Выберем раздел Просмотр ASM… В открывающемся окне вы увидите всю программу, написанную на ассемблере Но я приведу только основную часть программы:

int main()

{

//Инициализация MCUSR=0x00

90: 14 be            out  0x34, r1    52 wdt_disable()

92: 88 e1            ldi  r24, 0x18   24

94: 0f b6            in   r0, 0x3f    63

96: f8 94            cli

98: 80 93 60 00      sts  0x0060, r24

9c: 10 92 60 00      sts  0x0060, r1

a0: 0f be            out  0x3f, r0    63 milliseconds can be achieved

*/ void

_delay_loop_2(uint16_t  

{

count)

  asm

volatile (

a2:

84

e0

ldi

r24,

0x04

4

a4:

90

e0

ldi

r25,

0x00

0

a6:

01

97

sbiw

r24,

0x01

1

a8:

f1

f7

brne

-4

0xa6

<main+0x16>

aa:

ff

cf

rjmp

-2

0xaa

<main+0x1a>

000000ac <_exit>:

ac: f8 94            cli

000000ae < stop_program>:

ae: ff cf            rjmp -2         0xae < stop_program>

Я не буду рассказывать вам о каждой из команд на ассемблере, я хочу только сказать, что этих команд довольно много И каждая команда выполняется за один или несколько тактов тактового генератора микроконтроллера Даже при частоте 20 МГц один такт занимает 005 мкс Десять таких тактов займут 05 мкс Таким образом, к запрошенной нами паузе в 1 микросекунду добавится вынужденная задержка на выполнение этой операции, соизмеримая с самой паузой

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

int main()

{

//Инициализация MCUSR=0x00

wdt_disable()

//Инициализация кода прерывания

//Задержка

//Задержка: 1 us delay_us(1)

mainendloop: goto mainendloop

}

Я и в этом случае привёл только  основную  часть программы Выполняя самые примитивные операции, как приведённая выше, вы легче и быстрее освоите язык Си И сможете так же перейти при желании к освоению языка ассемблера

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

Изучать написание кода программы на Си или ассемблере удобнее в программе AVRStudio для тех, кто выбрал AVR-контроллер, или в MPLAB, если это PIC-контроллер Но следует иметь в виду, что написание текста может зависеть от используемого компилятора Перенося программу из Flowcode в другую среду разработки, вы, возможно, будете вынуждены вносить исправления Подчас это достаточно простые исправления, как замена trisa на TRISA или наоборот, но иногда потребуется более сложная правка

Вы можете потренироваться в кодировании на Си и в самой программе Flowcode Только проверку следует выполнять либо на «живой» макетной плате, либо в программе ISIS

Для использования языка Си в программе Flowcode есть программный элемент Си-код Он добавляется в программу, как любой другой программный элемент Следует только помнить, что все элементы программы участвуют в отладке Flowcode, кроме вставок на языке Си и ассемблере Так обстоит дело в последней на сегодняшний день версии Говорят, что в следующих версиях это будет изменено Но пока это так, и не следует этого забывать

Открывая элемент блока вставки на языке Си, вы оказываетесь в текстовом редакторе, где можете написать текст программы, а можете, как сделал я, скопировать его Я попытался вставить задержку из предыдущего примера, заменив 1 мкс на 1500 мкс

Посмотрим, получится ли что-то из этой замены

Рис 2321 Вставка блока на языке Си в программу

После трансляции текста (хотя весь текст, кроме одной команды, пришлось выбросить) проверим в программе ISIS, будет ли длительность импульса 15 мс

Рис 2322 Проверка работы вставки на языке Си в ISIS

Сама вставка работает, а обмануть программу не получилось То число, 1500, которое я добавил в функцию задержки, превратилось, похоже, в остаток от этого числа размером не больше байта

Но это «к слову» Если вы захотите получить достаточно точный генератор, то понадобится либо модифицировать программу, подгоняя времена, либо использовать программу на ассемблере, высчитывая количество операций и полученные задержки, либо использовать встроенные таймеры Мне кажется, что при наличии откалиброванного осциллографа или частотомера, проще «подогнать» программу Но это лишь моё мнение

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

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