Berezka7km.ru

Березка 7км
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Примеры на Ассемблере для микроконтроллеров Atmel AVR

Примеры на Ассемблере для микроконтроллеров Atmel AVR

Здесь представлены примеры различных программ на языке Ассемблера для микроконтроллеров Atmel AVR. Примеры выложены в виде проектов для AVR Studio под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. При обнаружении ошибок просьба сообщить на почту.

Краткое описание команд Ассемблера AVR представлено здесь.

Подробное описание каждой команды представлено в AVR 8bit Instruction Set.

Для более глубокого изучения ассемблера AVR советую к прочтению книгу Юрия Ревича «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» . С беcплатным фрагментом книги можно ознакомиться здесь. Также можно изучить различные методические пособия ВУЗов, например, вот.

Start – Заготовка стартовой инициализации микроконтроллера, в которую входят инициализация стека, очистка ОЗУ (SRAM) и регистров общего назначения (R0 — R31), а также глобальный запрет прерываний. Пример кода приведён ниже. При использовании следует помнить, что регистры ввода-вывода (порты, периферия и т.д.) не очищаются, поэтому их НЕОБХОДИМО инициализировать отдельно.

Delays – Библиотека с подпрограммами задержки. Все задержки рассчитаны на тактовую частоту МК 8 МГц. Библиотека включает следующие процедуры:

  • Delay1us – Задержка повышенной точности в 1 мкс c учетом длительности RCALL и RET.
  • Delay5us – Задержка повышенной точности в 5 мкс c учетом длительности RCALL и RET.
  • Delay10us – Задержка повышенной точности в 10 мкс c учетом длительности RCALL и RET.
  • Delayus – Задержка высокой точности в несколько десятков микросекунд.
  • Delayms – Задержка высокой точности в несколько миллисекунд.

Math – Библиотека с подпрограммами математических операций, включает следующие процедуры:

  • SUB16X16 – Вычитание 16-разрядных чисел.
  • ADD16X16 – Сложение 16-разрядных чисел.
  • MUL16X16s – Знаковое умножение 16-разрядных чисел.
  • MUL16X16u – Беззнаковое умножение 16-разрядных чисел.
  • DIV16X16s – Знаковое деление 16-разрядных чисел.
  • DIV16X16u – Беззнаковое деление 16-разрядных чисел.
  • DIV16POWER2s – Знаковое деление 16-разрядного числа на степень 2.
  • DIV16POWER2u – Беззнаковое деление 16-разрядного числа на степень 2.
  • SIGN16 – Смена знака 16-разрядного числа.
  • DEC2BCD – Перевол 8-разрядного десятичного числа в двоично-десятичное (BCD).
  • BCD2DEC – Перевол 8-разрядного двоично-десятичного (BCD) числа в десятичное.
  • CP16X16 – Сравнение 16-разрядных чисел.
  • DIGITS8 – Вычисление цифр 8-разрядного числа.
  • DIGITS16 – Вычисление цифр 16-разрядного числа.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту А подключены 8 светодиодов (линии 0-7). К линии 0 порта С подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта А, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

Читайте так же:
Счетчик дропа кс го

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Clock – В данном примере рассматривается реализация простых часов с 7-сегментым индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка PD2 используется для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментый индикатор. Вывод DQ датчика поключен к линии PC7. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждую секунду. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 0-3 порта С – кнопки. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) подключены к линиям 2-5 порта C. Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 4 и 5 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD6 подключен вывод Trigger датчика, а к линии PD7 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. По таймеру микроконтроллер раз в секунду опрашивает датчик и определяет расстояние до препятсвия в миллиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Читайте так же:
Самый лучший счетчик трафика

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

Программа работы. 1. Загрузить для отладки в AVR Studio программу преобразования целых 16-битных чисел в двоично-десятичные числа

1. Загрузить для отладки в AVR Studio программу преобразования целых 16-битных чисел в двоично-десятичные числа. Алгоритм программы «bin16BCD5» заключается в следующем. Предположим, что имеется целое беззнаковое 16-битное число (диапазон от 0 до 65535). Очевидно, что необходимо найти 5 десятичных цифр. Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 10000, сначала определить десятичную цифру десятков тысяч. Затем находится цифра тысяч последовательным вычитанием числа 1000 и т.д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность. После того, как будет найдена десятичная цифра десятков, в регистрах исходного числа останется десятичная цифра единиц.

Проследить выполнение программы в пошаговом и автоматическом режиме, записав предварительно в регистры r16 и r17 шестнадцатеричное число $NNNN, где N — номер варианта, рассчитанный по методике ТМЦ ДО (число от 1 до 9). В окне I/O раскройте содержимое Register 1–31, Processor, I/O ATTINY15 (CPU, WATCHDOG). Какие команды программы влияют на флаги регистра статуса SREG? Зафиксируйте в отчете результат преобразования. В программе часто используются команды вычитания константы из регистра. Есть ли в системе команд AVR аналогичные команды сложения регистра и константы? Как будет работать программа, если в ней удалить последнюю команду?

Читайте так же:
Обязаны ли жильцы оплачивать установку общедомовых счетчиков

;***** Программа bin16BCD5

.DEVICE ATtiny15 ; Определить устройство

"C:Program FilesAtmelAVR ToolsAvrAssemblerAppnotestn15def.inc"

; Вложить файл определения адресов регистров вводавывода

;***** Регистровые переменные .def fbinL =r16 ; двоичное значение, младший байт.def fbinH =r17 ; двоичное значение, старший байт.def tBCD0 =r17 ; BCD значение, цифры 1 и 0.def tBCD1 =r18 ; BCD значение, цифры 3 и 2.def tBCD2 =r19 ; BCD значение, цифра 4; Переменные fbinH и tBCD0 должны размещаться в одном регистре WDR ; Сброс сторожевого таймера ldi r20,0b00001000 ; Включение сторожевого out WDTCR,r20 ; таймера ldi tBCD2, -1 ; Начало преобразованияm1: inc tBCD2 subi fbinL, low(10000) sbci fbinH, high(10000) brsh m1 subi fbinL, low(-10000) sbci fbinH, high(-10000) ldi tBCD1, -0x11m2: subi tBCD1, -0x10 subi fbinL, low(1000) sbci fbinH, high(1000) brsh m2 subi fbinL, low(-1000) sbci fbinH, high(-1000)m3: inc tBCD1 subi fbinL, low(100) sbci fbinH, high(100) brsh m3 subi fbinL, -100 ldi tBCD0, -0x10m4: subi tBCD0, -0x10 subi fbinL, 10 brsh m4 subi fbinL, -10 add tBCD0, fbinL ; Конец преобразования m5: rjmp m5 ; Зацикливание программы

Какой период срабатывания сторожевого таймера задан в программе? Что будет, если дождаться его срабатывания?

2. Загрузить для отладки в AVR Studio программуCLOK,реализующую двоично-десятичный счетчик на регистре r19. Счетчик считает с частотой прерываний по переполнению таймера Т0. Тактовый сигнал на вход таймера подается через программируемый делитель частоты. Коэффициент пересчета счетчика равен 100. Для счета используются вспомогательные регистры r16 (счет единиц), r17 (счет десятков) и r18 (объединение десятков и единиц). Основная программа обнуляет регистры счетчика, устанавливает режим работы Т0, разрешает прерывания по переполнению Т0 и зацикливается. Двоично-десятичный счет реализуется в подпрограмме прерывания, расположенной начиная с адреса вектора прерывания по переполнению таймера Т0. Заметим, что в системе команд AVR нет команды сложения регистра с константой и команды десятичной коррекции аккумулятора, как и самого аккумулятора.

16 битный счетчик avr

Спам

подскажите как написать в баскоме прогу которая генерирует прямоугольный сигнал(меандр), частота чтобы плавно задавалась от 1Гц до 5000Гц
и выводилась на экран
вот что я написал , не судите строго , в прерывании от таймера я просто загружаю в него число которое является суммой константы и значения ацп измеренного с переменного резистора,за счет этого при поворачивании ручки резистора изменяется частота вызова подпрограммы по переполнению таймера
$regfile = "m88pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

'Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.0 , Db7 = Portd.1 , E = Portd.7 , Rs = Portd.6
'Config Lcd = 20 * 4
'Initlcd
'Cls
'Cursor Off

Config Timer1 = Timer , Prescale = 8

'Timer1 = 65445
' Timer1 = Divid

Config Portb.1 = Output
On Timer1 Strobe

Enable Interrupts
Enable Timer1

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Const Multk = 330
Dim A As Word
Dim T As Word
Dim B0 As Bit
Dim Freq As Word
Dim Divid As Word
Dim Divid2 As Word
Dim Adcw2 As Integer
Dim Adcw As Word
Dim Adcw3 As Word
Dim Coef As Single
Dim Cnt As Byte
Dim B1 As Bit

'Dim Freqstr As String * 5
'Dim Freqstrf As String * 5
'Dim Coefstr As String * 4
'Dim Coefstrf As String * 4
'Dim Adcwstr As String * 4
'Dim Adcwstrf As String * 4
'Dim B3 As Bit
'Divid2 = 50

Incr T
' If T = 1 Then Gosub Setdiv1
'If T = 255 Then Gosub Setdiv2

'if b0=1 then gosub freqcount1 else gosub freqcount2
Adcw = Getadc(6)

If Adcw = 0 Then Adcw = 1
If Adcw > 1010 Then Adcw = 1010

Читайте так же:
Счетчик для выдачи топлива

If T = 100 Then Gosub Label1

'Divid = Divid2
'Freqstr = Str(divid2)
'Freqstrf = Format(freqstr , "00000")
'Locate 1 , 1
'Lcd Freqstrf
'Adcwstr = Str(adcw)
'Adcwstrf = Format(adcwstr , "0000")
'Locate 2 , 1
'Lcd Adcw

Strobe:
'Start Timer1
Timer1 = Divid2

If B0 = 0 Then Gosub Sten Else Gosub Stdis
Return
Sten:

B0 = 1
Return
Stdis:

' Divid2 = Adcw * 10
' Divid = Divid2
'' Divid = 1000

' Freqcount1:
' Incr T
' Return
'Freqcount2:
' Incr A
' If T <> Divid2 Then Gosub Setdiv1

Label1:
T = 0
If Adcw <= 20 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 40 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 60 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 80 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 100 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 120 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 140 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 160 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw <= 180 Then Divid2 = Adcw * Multk : Tccr1b = &B00000010
If Adcw >= 200 Then Divid2 = Adcw + 63336 : Tccr1b = &B00000010
If Adcw >= 290 Then Divid2 = Adcw + 64246 : Tccr1b = &B00000010
If Adcw >= 380 Then Divid2 = Adcw + 64489 : Tccr1b = &B00000010
If Adcw >= 470 Then Divid2 = Adcw + 64566 : Tccr1b = &B00000010
If Adcw >= 560 Then Divid2 = Adcw + 64576 : Tccr1b = &B00000010
If Adcw >= 650 Then Divid2 = Adcw + 64553 : Tccr1b = &B00000010
If Adcw >= 740 Then Divid2 = Adcw + 64510 : Tccr1b = &B00000010
If Adcw >= 830 Then Divid2 = Adcw + 64456 : Tccr1b = &B00000010
If Adcw >= 920 Then Divid2 = Adcw + 64394 : Tccr1b = &B00000010
If Adcw >= 1010 Then Divid2 = Adcw + 64350 : Tccr1b = &B00000010
Return

Спам

у меня заработало на меге 48 только код подправил
$regfile = "m48def.dat"
$crystal = 16000000
$hwstack = 45
$swstack = 20
$framesize = 40

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.0 , Db7 = Portd.1 , E = Portd.7 , Rs = Portd.6
Config Lcd = 16 * 2
Initlcd
Cls
Cursor Off

Config Timer1 = Timer , Prescale = 64 , Capture Edge = Rising

Dim Timercounter As Word
Dim Period As Single
Dim F1 As Single
Dim F As Word
Dim Coefstr As String * 4
Dim Coefstrf As String * 4
Dim Adcw As Word
Dim B0 As Bit
Dim Adcw2 As Integer
Dim Adcw3 As Word
Const T = 0.000004

On Capture1 Zaxvat

Timercounter = 0
Waitms 50
Enable Interrupts
Enable Capture1

If Timercounter = 0 Then
F = 0

Period = Timercounter * T
F1 = 1 / Period
F = Abs(f1)

EndIf
Coefstr = Str(f)
Coefstrf = Format(coefstr , " ")
Locate 1 , 1
Lcd "«ac¿o¿a" ; " " ; Coefstrf ; "¡å"
Waitms 100

Zaxvat:
Timercounter = Timer1
Timer1 = 0
Return

Спам
Спам
Спам
+1 Спам
Спам
Спам
Спам
Спам
Спам
+1 Спам
Спам
Спам

Поэтому, когда промежуток слишком большой (как у тебя 0,01-10 сек), конфигурируем таймер на прерывание по переполнению, в прерывании увеличиваем значение переменной. Время, через которое происходит увеличение переменной, можно подсчитать. Пускай сделали так, чтобы переполнение происходило каждые 0,01 сек. Все, зная значение переменной, знаем сколько точно прошло времени: к примеру в переменной лежит число 156, значит счетчик протикал 1,56 сек. А дальше привязываем к значению нашей переменной выполнение нужных действий.

Аппаратная ШИМ в микроконтроллере ATmega8

В этой заметке я постараюсь немного затронуть тему аппаратной ШИМ (широтно-импульсной модуляции, англ. PWM — Pulse-width modulation) в микроконтроллерах семейства AVR на примере микроконтроллера ATmega8. Классический ШИМ сигнал представляет собой цифровой сигнал, определенной постоянной частоты.

Читайте так же:
Мпи что это для счетчиков

Меняться в нем может скважность — длительность состояния логической единицы в периоде сигнала. Например, на рисунке внизу показаны разные ШИМ сигналы, скважность которых увеличивается с верхнего графика к нижнему:

ШИМ совместно с RC цепочкой используется для генерации аналогового сигнала, а если позволяет частота – то я для воспроизведения звука. Мое первое столкновения с ШИМ произошло, когда я захотел плавно менять яркость мощного одноваттного светодиода. После ШИМ помогла решить проблему управления скоростью вращения двигателя постоянного тока, и управления цветом RGB светодиода.

Для демонстрации работы с ШИМ напишем программу, которая будет плавно менять яркость светодиода от нуля до максимума, а потом плавно ее снижать. То есть нам нужно сгенерировать примерно такой ШИМ сигнал (масштаб не соблюден):

Генерировать сигнал будем аппаратными средствами микроконтроллера ATmega8. Можно конечно сгенерировать все и программно, но это не экономично и неудобно, если микроконтроллер должен выполнять что-то еще, кроме генерации ШИМ сигнала. Принципиальная схема макета:

На схеме показана стандартная обвязка ATmega8. Q1 — любой pnp транзистор, способный выдержать ток 500мА, я использовал биполярный pnp транзистор ZXTN19020, так как у него очень малое сопротивление открытого канала коллектор-эмиттер, всего 18 миллиом и при токах 500ма он не будет ощутимо греться. Транзисторный ключ открывается при высоком уровне на PB1 и пропускает через цепочку резистор R4-коллектор-эмиттер-светодиод ток, который по закону Ома равен I=5B/R4. (сопротивлением светодиода в рабочем состоянии и канала коллектор-эмиттер на транзисторе Q1 мы пренебрежем).

Зададимся, что наш светодиод во включенном состоянии будет питаться током 500мА (максимальный ток для светодиода Cree MC-E, используемого мною в этом макете, при последовательном соединении 4-х кристаллов составляет 2.8А), для этого вычислим номинал ограничительного резистора: R4=5В/0,5А=10 Ом. R3 номиналом 1 кОм. Следует не забывать про охлаждение светодиода, иначе очень быстро сгорит. Для небольших мощностей достаточно использовать радиоатор и термопасту. Теперь перейдем к написанию прошивки:

Рассмотрим подробнее инициализацию ШИМ.
Будем использовать так называемый Phase correct PWM на таймере 1. Счетчик TCNT1 постепенно увеличивается (согласно установленному делителю), когда его содержимое становиться равным содержимому OCR1A, то на выводе OC1A в зависимости от битов COM1A0, COM1A1 (в регистре TCCR1A), устанавливается нолик или единица. После счетчик достигает 0xFF (в зависимости от битности ШИМ) и начинает уменьшатся. Как только TCNT1 снова сравняется с OCR1A, на пине OC1A уровень меняется на противоположный. После чего счетчик достигает 0х00 и все повторяется снова.
В нашем случае COM1A1=1,COM1A0=0. И это означает, что при начале счета, на выводе OC1A устанавливается высокий уровень. При достижении счетчиком значения OCR1A при возрастании уровень на OC1A становится нулевым. А при достижении счетчиком значения OCR1A при убывании, уровень на OC1A становиться высоким, и т.д. Проще говоря: «чем больше значение OCR1A – тем больше заполнение сигнала».

Битность и режим ШИМ задается с помощью битов WGM13-WGM10 (биты WGM13,WGM12 находятся в регистре TCCR1B, а биты WGM10, WGM11 в регистре TCCR1A).

Для нашего 8-ми битного Phase correct PWM требуется, чтобы WGM10=1.

фото макета

Видео работы программы:

Пример реализации аппаратной ШИМ в несколько каналов на микроконтроллере ATmega8

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector