Jump to content
Duhas

Примеры Кода Для Avr

Recommended Posts

написал подпрограмму обработки кнопки, на atmega48, получилось следующее творенье, только это творенье не работает, может кто подскажет чего не так намудрил.

key:

sbic 0x03,5	; определяем сброшен ли 6 бит, на порту B, что означает что кнопка нажата
			; если бит установлен пропускаем следующую команду
rjmp key_01	; переход если 1

ldi r29,0x02 ; выгружаем значение регистра антидребезга из ячейки 0х201
ldi r28,0x01
ldd r16,y+0
cpi r16,0 ; проверяем значение загруженное из памяти регистра антидребезга на равенство 0
breq key_0 ; переход при равенстве 0
dec r16 ; уменьшение значения регистра антидребезга
sts 0x0201,r16 ; здесь наверно можно было использовать просто регистр но я использовал память т.к.регистры могут понадобиться
rjmp key

key_0:

ldi r29,0x02 ; выгружаем значение поддиапазона адрес 0х0202
ldi r28,0x02
ldd r16,y+0
inc r16

sts 0x0202,r16 ; записываем увеличенное значение в память, значение поддиапазона	

key_01:	

ldi r16,0x50
sts 0x0201,r16 ; снова устанавливаем значение для регистра антидребезга

ret

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

Share this post


Link to post
Share on other sites

Есть два вопроса. Теоретический и практический.

1). Подскажите, кто пишет на С, можно ли использовать прерывания?

2). Как использовать встроенный в Мегу интерфейс I2C. Библиотека для программной реализации есть,но геморроиться не хочется, к тому же читал, что он капризный. Желательно на Ассемблере.

3). Модераторам-администраторам-еще-незнаю-кому-ответственному-за-сайт. Когда пытаюсь в поисковике найти тот же I2C или USB, он меня посылает по поводу поиска по 3-м буквам. Нельзя ли с этим что-нибудь сделать? Я же не могу их описать более расширенно (я же не помню\знаю как расшифровывается, а если и знаю,наверняка ж нету на сайте, а если и есть, то не то, а если и то, то на английском)(прошу прощения, что пишу здесь)

4). По поводу АВР-студио. Что за глюк, что приходится в начало кода дописывать " ldi r16,0b10000000 out SREG,r16 " Иначе не реагирует на прерывания. Как это исправить?

ЗЫ). A_0681h - не у всех механических кнопок есть дребезг.

- подключи .include "что_нибудь_def.inc". Мне лично не удобно читать 0х03 а компилятору пофиг. Лучше (в 3-ей же строке) sbic PINB,5 ... и читать легче и не прочитаешь из PortB или DDRB.

- если дребезг и есть, я бы обрабатывал кнопки (и еще что-нибуди) по таймеру.

Edited by COKPOWEHEU

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

2). Как использовать встроенный в Мегу интерфейс I2C. Библиотека для программной реализации есть,но геморроиться не хочется, к тому же читал, что он капризный. Желательно на Ассемблере.
 

;********************************************************************************

;* БИБЛИОТЕКА РАБОТЫ С МИКРОСХЕМАМА 24CXX ЧЕРЕЗ TWI *

;********************************************************************************

;регистры для TWI

.def statusTWI = r16

.def doneTWI = r17

.equ SLA_W =

.equ SLA_R =

;Подпрограмма инициализации интерфейса TWI

TWI_INICIAL:

типа сами напишите

ret

;Подпрограмма передачи команды "старт"

TWI_START:

ldi statusTWI,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

out TWCR,statusTWI

ret

;Подпрограмма передачи команды "стоп"

TWI_STOP:

ldi statusTWI,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

out TWCR,statusTWI

ret

;Подпрограмма передачи адреса микросхемы

TWI_ADR:

ldi statusTWI, SLA_W

out TWDR, statusTWI

ldi statusTWI, (1<<TWINT) | (1<<TWEN)

out TWCR, r16

ret

;Подпрограмма передачи данных

TWI_DATA_W:

ldi statusTWI,DATA;в вызывающей программе

out TWDR,statusTWI

ldi statusTWI,(1<<TWINT) | (1<<TWEN)

out TWCR,statusTWI

ret

;------------------------------------------------------------------

;оптимизация по размеру предыдущих функций

TWI_ADR:

ldi statusTWI,SLA_W

TWI_DATA_W:

out TWDR,statusTWI

ldi statusTWI,(1<<TWINT) | (1<<TWEN)

rjmp TWI_END

TWI_START:

ldi statusTWI,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

rjmp TWI_END

TWI_STOP:

ldi statusTWI,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

TWI_END: out TWCR,statusTWI

ret

;обработчик прерывания от модуля TWI

TWI_INT:

in doneTWI,TWSR

andi doneTWI, 0xF8 ;считываем статус модуля TWI

sbrc statusTWI,TWSTA

rjmp

а дальше сами

код не дописан, но должен показать куда идти. Отвечу если будут конкретные вопросы

Edited by rtfcnf

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

3). Модераторам-администраторам-еще-незнаю-кому-ответственному-за-сайт. Когда пытаюсь в поисковике найти тот же I2C или USB, он меня посылает по поводу поиска по 3-м буквам. Нельзя ли с этим что-нибудь сделать?

Попробуйте пожаловаться на поисковик.

Первая же ссылка http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR315.htm

ртфцнф

Я имел в виду аппаратный. Библиотека эмуляции у меня есть

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

Share this post


Link to post
Share on other sites
4). По поводу АВР-студио. Что за глюк, что приходится в начало кода дописывать " ldi r16,0b10000000 out SREG,r16 " Иначе не реагирует на прерывания. Как это исправить?

Для разрешения прерываний у АВР необходимо установить в 1 бит I регистра SREG. В ассемблере для этого существует команда SEI, ваш вариант выполняет почти то же самое ldi  r16,0b1000000, за исключением того, что SEI не трогает остальных битов регистра.

Share this post


Link to post
Share on other sites

Спасибо, ртфцнф! Я совсем забыл о SEI. За I2C тоже спасибо. Тут я, конечно, ступил.

Share this post


Link to post
Share on other sites

При прошивке аттини2313 столкнулся с такой проблемой: для программирования прилагается два файла ( .hex, .eep ), в Пони Прог зашиваю сначала .hex, учитываю-всё правильно, потом зашиваю второй файл и считываю только Eeprom-получается просто каша из обоих файлов. Схема, конечно работает не правильно. Может, надо както иначе прошивать в таком случае?

Share this post


Link to post
Share on other sites
При прошивке аттини2313 столкнулся с такой проблемой: для программирования прилагается два файла ( .hex, .eep ), в Пони Прог зашиваю сначала .hex, учитываю-всё правильно, потом зашиваю второй файл и считываю только Eeprom-получается просто каша из обоих файлов. Схема, конечно работает не правильно. Может, надо както иначе прошивать в таком случае?

.hex – файл прошивки, прошивается во FLASH памяти программ

.eep – файл данных, прошивается в EEPROM памяти данных.

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

Share this post


Link to post
Share on other sites

.eep и .hex зашиваю соответствующими кнопками в программаторе.

Share this post


Link to post
Share on other sites

COKPOWEHEU спасибо за совет, но я по другому выкрутился, примудрить пришлось но работает.

сижу тут голову ломаю, подскажите может кто сталкивался.

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

кроме регистра флагов и используемых регистров что ещё надо запихнуть в стек?

Share this post


Link to post
Share on other sites

не забываем, что выход из обработчика прерывания "reti" а не "ret". А лучше приведите код обработчика

Share this post


Link to post
Share on other sites

A_0861h

.include "8515def.inc"
.def tmp=r16
rjmp RESET

rjmp INT0
reti
reti
reti

reti
rjmp TIMER1_OVF
reti
reti

reti
reti
reti
reti

RESET:
ldi tmp,high(RAMEND)
out SPH,tmp
ldi tmp,low(RAMEND)
out SPL,tmp
ldi tmp,0b01000000
out GIMSK,tmp
ldi tmp,0b00000011
out TCCR1B,tmp
ldi tmp,(1<<TOIE1)
out TIMSK,tmp
sei
CYCLE:
rjmp CYCLE

INT0:
;-код по прерыванию Int0
reti

TIMER1_OVF:
;-код по переполнению таймера1
reti

Это пример кода для AT90S8515 (ATmega8515) с использованием внешнего прерывания и переполнения таймера1

С процедурами/прераваниями еще один нюанс, который я заметил: точка возврата сохраняется в стеке. Поэтому чтобы процедура передавала через него данные придется помучаться. Через регистр (или даже ОЗУ)проще.

Кстати у меня появилось еще 3 вопроса ( :rolleyes: ) - как именно ассемблирется программа (структура HEX-файла). Насколько я понял первая строка - заглавие, всегда постоянна; последняя - завершение, тоже постоянна.

В основном блоке. Суммарное количество байт (у меня было всегда кратно 2, но, возможно зто и не обязательно). Потом 2 байта нулей (в некоторых прогах там не только нули - это первый вопрос. потом то 1 до 5 двухбайтовых команд (младший байт потом старший). И в конце 1 байт видимо контрольный - это второй вопрос. Как именно он высчитывается?

И третий вопрос есть ли какие-то еще особенности?

Share this post


Link to post
Share on other sites

Непонятно мене зачем передавать параметры через стек в програме на АСМ??? ладно это оправдано в С но в АСМ это не саое удачное.. гораздо проще передавать параметр в регистру или вообще выделить память отдельно...

HEX-файл - содержит в начале сторки адрес, потом данные и на конце контрольную сумму. если хотите видеть чистый код - переведите его в бинарник любой утилитой hex_to_bin

Share this post


Link to post
Share on other sites

Знаю :) я сам столкнулся когда прогал на асме для компа. Это больше как теория.

А как считается контрольная сумма (что-то у меня не получается :0200 0000 FFEF 10)

И зачем после адреса 1,5 (!)байта (три шестнадцатеричных разряда)нулей

И насчет перевода мне скорее понадобится делать HEX-файлы чем редактировать а это можно делать с помощью хелпа.

Да, чуть не забыл. Как в АТмеге8 разбирается РЕСЕТ. Он же к PC6 присоединен! И внешнее тактирование.

Edited by COKPOWEHEU

Share this post


Link to post
Share on other sites
Да, чуть не забыл. Как в АТмеге8 разбирается РЕСЕТ. Он же к PC6 присоединен! И внешнее тактирование.

Фузами включаются эти порты

ИМХО: RESET лучше не трогать, мне как-то всегда спокойней когда есть аппаратная возможность перезапустить МК

Share this post


Link to post
Share on other sites

Аппаратаая возможность - жесткое выдирание батарейки :-Е или контроллера из панельки. Безотказная вещь, еще ни один контроллер не придумал как с этим бороться :)

Но в целом - согласен.

Share this post


Link to post
Share on other sites

спасибо за ответ. скелет программы такой же.

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

объяснение корявое я знаю, но код всей программы большой сразу не разобраться:)

вот код подпрограмм по работе с прерываниями

int1: ; подпрограмма по внешнему прерыванию
push r8
lds r8,0x3F
push r8
push r16
push r17
sei		
ldi r16,0x00
sts 0x80,r16	; записываем регистры установки счетчика T1,
ldi r16,0x00
sts 0x81,r16	; останавливаем счетчик

lds r16,0x84	; младший байт значения счетчика
lds r17,0x85	; старший байт значения счетчика
sts 0x0130,r16	; выгружаем значение счетчика в 0х0130 и 0х0131 для индикации частоты	
sts 0x0131,r17

ldi r29,0x01
ldi r28,0x90 ; специальная ячейка памяти для подсчёта старших разрядов 0х0180
ldd r16,y+0
sts 0x0132,r16

ldi r17,0x00	; обнуление регистров содержащих информацию об количестве импульсов
ldi r16,0x01
sts 0x85,r17
sts 0x84,r16
sts 0x0190,r17
clr r10

ldi r16,0x00
sts 0x80,r16	; записываем регистры установки счетчика T1,
ldi r16,0x01
sts 0x81,r16	; запускаем счетчик	

pop r17
pop r16
pop r8
sts 0x3f,r8
pop r8
reti

timer1_ovf: ; подпрограмма по переполнению
push r8
lds r8,0x3F

inc r10
sts 0x0190,r10


sts 0x3f,r8
pop r8
sei
reti

Share this post


Link to post
Share on other sites

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

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

для кнопки вроде как удалось победить, но мне кажется тут такой же способ не подойдёт.

Edited by A_0681h

Share this post


Link to post
Share on other sites

Ребят это мое первое творение поэтому прошу разьяснить,на схеме ниже справа распиновка до десяти,не понятно куда к контролеру для прошивки подключать выводы под номером 2,4,6,8,10

02b08a28948e.jpg

Share this post


Link to post
Share on other sites

2 - это плюс (+) питания (обычно 5 вольт) а остальные перечисленные это минус питания (он же корпус...)

Share this post


Link to post
Share on other sites

понял спасибо,кстати платку под него перевел ту чта на сайте в LAY, очень даже хорошо получилось после травления

Share this post


Link to post
Share on other sites

ребят ну вот все собрал программатор и теперь вдуплить не могу его система должна определять как новое оборудование или нет,как он инициализируется с виндой и еще все таки не до конца понятно куда на амегу8 цеплять согласно схеме массу так как по распиновке контроллера масса (GND)это 8й и 22й пин а выводов массы с программатора четыре как быть,и если вешать массу то какой пин задействовать 8й или 22й и че делать с оставшимися массами, а и еще 3й вывод программатора обозначено LED это куда?

Edited by Nokian

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
×
×
  • Create New...