ARV писал(а):у меня дежавю? уже был впрос про макрос ICR... обработчик прерываний правильно называется ISR - ну читайте же документацию перед писаниной!
Большое спасибо за замечание Я сменил на ISR, но разрешение глобального прерывания всеравно пропадает на несколько тактов позже sei().В чем может быть проблема?
во-первых, показанный вами код все равно с ошибкой - после while(1) надо ставить точку с запятой. во-вторых, лично я не вижу никаких проблем в работе исправленного кода: прерывания вызываются. что именно вас беспокоит?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):во-первых, показанный вами код все равно с ошибкой - после while(1) надо ставить точку с запятой. во-вторых, лично я не вижу никаких проблем в работе исправленного кода: прерывания вызываются. что именно вас беспокоит?
Добрый вечер! Помогите, пожалуйста, найти ошибку. Суть программы: на PB5 (ADC0) подается напряжение 0..1.1 В, а на PB0 (OC0A) выходит ШИМ регулируемый. МК: ATTiny13.
Pink-Pank писал(а):Как вариант, можно запустить преобразование в авто режиме и потом просто копировать ADCH в OCR0A в каждом цикле без всяких проверок:
Подскажите, пожалуйста, есть ли в таймерах режим, позволяющий автоматически считать длительность периода внешнего сигнала в периодах тактовой частоты МК ?
Pink-Pank, скажите, пожалуйста, режим захват есть во всех устройствах? Вернее даже, в каких он есть? Так как, например, в ATtiny26 ничего подобного не нашёл, столько не читал спецификацию. Подскажите, пожалуйста, импортное название этого режима, которое гуглить/искать в фичах дейвайсов.
Вот книга. Ищите тему про 16-битные таймеры (лучше смотреть в семействе Mega. У Tiny вроде только 8-битные таймеры). Там в описании есть блок захвата. В 8-битных такого блока я что-то не встречал. А в Tiny26 оба таймера 8-битных. Но даже если такого блока нет - можно извернуться и программно сделать.
Во общем хочу сделать шим и выключить его по заданном интервалу времени.
К примеру включили устройство, регулируем шим (светодиоды) при помощи двух кнопок. Перед включением если нужно входим в режим программирования и выбираем время, через которое шим сигнал исчезает (выключаем устройство).
Делаю следующее : программный шим по переполнению (в прерывании) и считаю время так же в прерывании по сравнению (OCR0A=0xFF). Так как приоритет первого прерывания выше то ничего невыходит.
Всем доброго! Начинаю изучать программирование МК и вот столкнулся с проблемой! Прирывание по совпадению никак не хочет работать, вернее не запускается обработка прерывания. Флаг разрешения прерывания по событию «Совпадение A» таймера/счетчика T1 бит 4 установлен, флаг I регистра SREG тоже, индикация свидетельствущая о прерывании в регистре TIFR есть, но ничего не происходит, не хочет программа выходить из цикла на обработку прерывания помогите пожалуйста!
ldi Temp,0b00010000 ;разрешить прерывание компаратора out TIMSK,Temp
ldi Temp,0b00000011 ;тактовый сигнал = CK/64 out TCCR1B,Temp
ldi Temp,0x4C ;инициализация компаратора out OCR1AH,Temp ldi Temp,0x4B out OCR1AL,Temp
; инициализация стека LDI Temp4,Low(RAMEND) OUT SPL,Temp4 LDI Temp4,High(RAMEND) OUT SPH,Temp4
ldi Temp1,0b00000001 ;инициализация индикатора
ldi Temp,0 ;обнуление таймера out TCNT1H,Temp out TCNT1L,Temp
sei ;разрешить прерывания
;**************************************************** ; ОСНОВНОЙ ЦИКЛ ;**************************************************** Inf: jmp Inf ;бесконечный цикл
PLATON писал(а):Флаг разрешения прерывания по событию «Совпадение A» таймера/счетчика T1 бит 4 установлен, флаг I регистра SREG тоже, индикация свидетельствущая о прерывании в регистре TIFR есть, но ничего не происходит
В Студии гоняете?
PLATON писал(а):Вот код:
Почему не весь код приводите?
Нашёл. Внимательно посмотрите на свой вектор прерываний и на даташитовский. Снова на свой и на даташитовский
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Господа, есть глупый вопрос. Ковырялся в FastPWM-режиме таймера 1 ATTiny861. В документации такая таблица: BOTTOM The counter reaches the BOTTOM when it becomes 0. Счетчик достигает значения BOTTOM, когда он равен 0. MAX The counter reaches its MAXimum value when it becomes 0x3FF (decimal 1023). Счетчик достигает значения MAXимум, когда он равен 0x3FF (10 битный, очевидно). TOP The counter reaches the TOP value (stored in the OCR1C) when it becomes equal to the highest value in the count sequence. The TOP has a value 0x0FF as default after reset. Счетчик достигает значения TOP (записанного в OCR1C), когда его значение равно максимальному значению счетной последовательности. Значение TOP по умолчанию после сброса 0x0FF.
Первый и второй пункт понятны. А третий какой-то мутный, я не совсем понял для чего он нужен. TOP равен, например, 165. Можно сказать, что когда 8-битный счетчик дотикал до 255, он достиг значения TOP (165). Если я укажу в регистре, например, OCR1A значение 82 и включу прямой FastPWM, вывод OC1A будет сбрасывать в ноль при значении счетчика 127. Т.е. регистры сравнения сравниваются с TOP, а не напрямую со значеним счетчика. Это правильно, или я совсем запутался?
Доброго времени суток всем. Позвольте и мне сунуть свой пятак с вопросом. Подскажите, пожалуйста, как гарантированно отсчитать время прошедшее со старта контроллера в миллисекундах (в богомерзкой Ардуине за это отвечает функция millis()). Первое что приходит в голову так это запустить таймер и по прерыванию увеличивать переменную. Но таймер(их не так много ) жалко да и если понадобится запретить все прерывания подсчет будет неточным. Как быть? Готовое решение не обязательно, подскажите в какую сторону копать.
"Счетчик достигает значения TOP, когда его значение равно максимальному значению счетной последовательности." Это всего лишь определение термина TOP ( [топ], верхняя точка, максимальное значение) в этой спецификации и конкретно для описания таймеров. Соответственно, в зависимости от режима Таймера/ШИМ "верхушка" может быть как значением в регистре OCR1C, так и жёстко равняться MAX. Для FastPWM написано "The counter counts from BOTTOM to TOP (defined as OCR1C) then restarts from BOTTOM" Т.е. для этого режима TOP равно значению записанному в OCR1C и счёт будет производиться от 0 до OCR1C. Соответственно, осмысленными значениями OCR1A/B/D будут значения в том же диапазоне.
baron_P писал(а):TOP равен, например, 165. Можно сказать, что когда 8-битный счетчик дотикал до 255
В данном случае, для FastPWM, до 255 он никогда не дотикает, т.к. значение TOP равное 165 вы запишите в OCR1C.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)