Страница 39 из 72
Re: Таймеры/счётчики в AVR
Добавлено: Вс окт 30, 2016 10:22:03
akl
Замечу, тема называется
Таймеры/счётчики в AVR и предполагает использование таймеров AVR для отсчета временных интервалов. А задержки на циклах делаю без калькуляторов. Например, вышеупомянутая задержка 4600нсек в моем понимании
Код: Выделить всё
.equ Fo=20000000
;
;*************************************************
START:
;**************************
LDI XH,HIGH(4600*Fo/1000000000/4-1)
LDI XL,LOW(4600*Fo/1000000000/4-1)
SBIW X,1
BRNE PC-1
RJMP START
Re: Таймеры/счётчики в AVR
Добавлено: Вс окт 30, 2016 12:33:03
12val12
Нет слов одни эмоции
моя задежка это функция от переменной
при переменной равной 0 это 4600нсек
при переменной равной 1 это 4650нсек
при переменной равной 2 это 4700нсек
и т д
исправил
недосмотрел ..у Вас задежка но с шагом 3 такта .. моя с шагом в 1 такт
Добавлено after 9 minutes 32 seconds:
Vov123
запустите модель .. с каждым нажатием задержка увеличивается на 50нСек
не 150 не 100 . а 50 нСек ровно 1 такт
жать можно 65530 раз и каждое нажатие увеличит задержку на 50 нСек .. потом переполнеие
саму продедуру не покажу .хочу чтобы кто- то сделал лучше .
Добавлено after 3 minutes 4 seconds:
Jack_A будет будет .. шляпу сьешь?
Добавлено after 1 hour 16 minutes 5 seconds:
Вместо того чтобы выяснить реальное состояние дело эта ххххх akl минусует
Нарушение правил. п 2-3. предупреждение. FAKIR.
Re: Таймеры/счётчики в AVR
Добавлено: Ср ноя 02, 2016 21:20:58
COKPOWEHEU
Теоретически на таймере можно настроить вызов прерывания с точностью 1 такт. Минимальное время будет где-то тактов 10-20. Без аппаратных модулей получить такую точность в широком диапазоне почти нереально, и минимальная будет те же 10-20 тактов. Хотя...
Если сначала загрузить в ZH:ZL адрес процедуры и, при необходимости, в Х - аргумент. А потом в нужный момент icall'ом на выбранную процедуру
Код: Выделить всё
DELAY_8:nop ;8тактов
DELAY_7:ret ;7 тактов
DELAY_16VAR21:nop ;задержка 16Х+21 такт
...
DELAY_16VAR9:nop ;задержка 16Х+9 тактов
DELAY_16VAR8:nop ;задержка 16Х+8 тактов
DELAY_16VAR7:nop ;задержка 16Х+7 тактов
DELAY_16VAR6: ;задержка 16Х+6 тактов
push XL ;2 такта
pop XL ;2 такта
rcall DELAY_8 ;8 тактов
sbiw X,1 ;2 такта
brne DELAY_0VAR16 ;2 такта (1 такт в последний раз), суммарно 16Х тактов
ret ;4 такта -1 с прошлой команды. С учетом icall - 16X+6
DELAY_3VAR8:nop ;3Х+8 тактов
DELAY_3VAR7:nop ;3Х+7 тактов
DELAY_3VAR6: ;3X+6 тактов
dec XL
brne DELAY_0VAR8 ;3 такта
ret
Тут получилось нарисовать 3 процедуры - 7(8) тактов, 3Х+Y (9-776) тактов и 16Х+Y (от 22 до ~1e6, 50мс) тактов. Кому надо больший диапазон - вперед по шаблону
Придумывать процедуру выбора подходящей процедуры и аргумента по входному значению мне неохота. Но, надеюсь, идея понятна.
Re: Таймеры/счётчики в AVR
Добавлено: Чт ноя 03, 2016 06:13:30
AVK
Такое дело.
Организовал fast-pwm на mega8
В железе нет еще, симуляция в Протеусе.
При записи в OCR ноля все равно есть ШИМ с минимальной скважностью на выходе. А при 255 опять же не в единицу выход ставится, а максимальная скважность есть.
Это так и должно быть?
Я чото грешным делом думал, что при нуле в регистре, на выходе ноль должен быть, а при 255 единица.
Re: Таймеры/счётчики в AVR
Добавлено: Чт ноя 03, 2016 06:48:03
Z_h_e
Так же будет и в железе. Выключайте ШИМ в таких случаях.
Re: Таймеры/счётчики в AVR
Добавлено: Чт ноя 03, 2016 08:09:23
akl
COKPOWEHEU писал(а):Теоретически на таймере можно настроить вызов прерывания с точностью 1 такт. Минимальное время будет где-то тактов 10-20.
На практике, использование аппаратных возможностей таймера позволяет получить минимальную длительность импульса равную 1 такту и период следования оных 2 тактам. Справедливо для OCxB. С учётом того, что занесение нового значения сравнения производится через буферный регистр формирование временной диаграммы происходит без глюков.
Re: Таймеры/счётчики в AVR
Добавлено: Пн ноя 07, 2016 11:53:47
evgen_kz
Всем привет!
Помогите, пожалуйста, с таким заданием.
Необходимо создать программу, циклически "перемещающую" огонёк по цепочке светодиодов, подключённых к порту B микроконтроллера ATtiny2313. Для создания задержки между шагами (от 0,1 секунды до 1 секунды) использовать один из встроенных таймеров-счётчиков.
Помогите, правильно настроить инициализацию таймер счетчик и регистр прерываний.
Re: Таймеры/счётчики в AVR
Добавлено: Пн ноя 07, 2016 18:59:22
Z_h_e
Что за хрень на пикче, какой-то автокод?
evgen_kz писал(а):Необходимо создать программу, циклически "перемещающую" огонёк по цепочке светодиодов, подключённых к порту B микроконтроллера ATtiny2313.
К каждому порту светодиод подключен и их всего 8? При возникновении прерывания от таймера:
значение PORTB сдвигаете через флаг С;
Если С то PORTB =0x01 или 0x80 ( в зависимости направления сдвига)
evgen_kz писал(а): Для создания задержки между шагами (от 0,1 секунды до 1 секунды)
Наверное в Вашем задании было значение шага изменения времени и условие изменения.
evgen_kz писал(а):Помогите, правильно настроить инициализацию таймер счетчик и регистр прерываний.
Тактовая частота МК очень не последний параметр для данной задачи.
Re: Таймеры/счётчики в AVR
Добавлено: Чт янв 12, 2017 11:58:55
Gdan
Доброго дня.Небольшой вопрос.Контроллер Attiny13A.На выходах OC0A и OC0B требуется получить противофазный сигнал.Таймер работает в режиме CTC.В регистрах сравнения OCR0A и OCR0B находиться одинаковое число.Биты COM0...настроены на переключение в противоположное состояние при совпадении.Порты также предварительно настроены(0 и 1).
Все работает как и положено,кроме одного-порты переключаются синфазно.Proteus и Avr Simulator показывают,что все зашибись.В Avr Studio и в железе не работает так,как нужно.
Как добиться противофазной работы?Где и на чем я споткнулся?Спасибо.
Re: Таймеры/счётчики в AVR
Добавлено: Чт янв 12, 2017 14:29:47
COKPOWEHEU
Может попробовать бит FOCnx вместо установки порта?
Re: Таймеры/счётчики в AVR
Добавлено: Чт янв 12, 2017 16:44:04
Gdan
Попробовал-ничего не поменялось:(
Добавлено after 1 hour 43 minutes 32 seconds:
COKPOWEHEU СПАСИБО!.Разобрался.Действительно помогло.Установил биты вот так-( 0<<FOC0A|1<<FOC0B)-и все заработало,как и требовалось.Состояние выводов порта В OCR0A и OCR0B при этом оказалось совсем неважным,синфазные или противофазные сигналы на них выставлены изначально.А вот здесь прошу объяснить-по даташиту,если я правильно понял,биты FOC0A и FOC0B только принудительно изменяют состояние соответствующих выводов,не сбрасывая при этом счетный регистр,то есть он и далее продолжает считать до значения,установленного в регистрах сравнения.Тогда каким боком регистры FOC0A и FOC0B участвуют в процессе переключения????????????
Re: Таймеры/счётчики в AVR
Добавлено: Вт фев 07, 2017 12:31:18
baron_P
Доброго времени суток.
Есть задача: управление цветом RGB-ленты посредством трех потенциометров. Сделал на Attiny261A, используя три АЦП и три аппаратных ШИМа. Все, вроде работает, но не совсем так, как рассчитывал.
Программа:
Спойлер
Код: Выделить всё
/*
Используется МК Attiny261A
на частоте 8 МГц
Fuse-биты выставляем следующим оброазом:
(1 - unprogrammed, 0 - programmed)
Bit Low Bits High Bits
7 CKDIV8 1 RSTDISBL 1
6 CKOUT 1 DWEN 1
5 SUT1 1 SPIEN 0
4 SUT0 0 WDTON 1
3 CKSEL3 0 EESAVE 1
2 CKSEL2 0 BODLEVEL2 1
1 CKSEL1 1 BODLEVEL1 0
0 CKSEL0 0 BODLEVEL0 0 SELFPRGEN 1
*/
//Подключаемые файлы
//Файл стандартных функций ввода/вывода
#include <avr/io.h>
//Файл стандартных функций обработки прерываний
#include <avr/interrupt.h>
//Файл стандартных функций таймера WatchDog
#include <avr/wdt.h>
//Макроопределения
#define MAX_COLOR 255
//Прототипы функций
//Процедура инициализации АЦП
void init_ADC(void);
//Процедура инициализации входов/выходов
void init_IO(void);
//Процедура инициализации Т/С1
void init_TC1(void);
//Глобальные переменные
//Значения заданий на каналы ШИМ
volatile unsigned char value_ADC[3] = {1, 1, 1};
//Основная функция
void main(void)
{
//Инициализация АЦП
init_ADC();
//Инициализация Т/С1
init_TC1();
//Инициализация входов/выходов
init_IO();
//Разрешение работы WatchDog с периодом в 1 с
wdt_enable(WDTO_1S);
//Разрешение прерываний
sei();
//Рабочий цикл
while(1)
{
//Получение заданий ШИМ
//Канал 0
OCR1A = value_ADC[0];
//Канал 1
OCR1B = value_ADC[1];
//Канал 2
OCR1D = value_ADC[2];
//Сброс таймера WatchDog
wdt_reset();
}
}
//Функции
//Процедура инициализации АЦП
void init_ADC(void)
{
//Опорное напряжение питания,сдвиг влево вкл., источник ADC0
ADMUX |= (1 << ADLAR);
//Предделитель АЦП 128,
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
//вкл. АЦП,, старт АЦП, прерывание по АЦП вкл.,
ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADIE);
}
//Процедура инициализации входов/выходов
void init_IO(void)
{
//PB5, PB3, PB1 - выходы ШИМ
DDRB |= (1 << PB5) | (1 << PB3) | (1 << PB1);
}
//Процедура инициализации Т/С1
void init_TC1(void)
{
//В режиме FastPWM "0" при совпадении на OC1A и OC1B, вкл. ШИМ на них
TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << PWM1A) | (1 << PWM1B);
//Предделитель 1
TCCR1B |= (1 << CS10);
//В режиме FastPWM "0" при совпадении на OC1A и OC1B - теневые биты
TCCR1C |= (1 << COM1A1S) | (1 << COM1B1S);
//В режиме FastPWM "0" при совпадении на OC1D, вкл ШИМ на OC1D
TCCR1C |= (1 << COM1D1) | (1 << PWM1D);
//Режим FastPWM
TCCR1D &= ~((1 << WGM11) | (1 << WGM10));
//Количество дискрет ШИМ
OCR1C = MAX_COLOR;
//Начальные значения регистров сравнения
OCR1A = 0;
OCR1B = 0;
OCR1D = 0;
}
//Вектор прерывания по АЦП
ISR(ADC_vect)
{
//Если не зайдествованы каналы 1 или 2 АЦП
if ((ADMUX & ((1 << MUX0) | (1 << MUX1))) == 0)
{
//Получение задания канала 0
value_ADC[0] = ADCH;
//Переключение канала АЦП на 1
ADMUX |= (1 << MUX0);
}
else
//Если не зайдествован канал 2 АЦП
if ((ADMUX & (1 << MUX1)) == 0)
{
//Получение задания канала 1
value_ADC[1] = ADCH;
//Переключение канала АЦП на 2
ADMUX &= ~(1 << MUX0);
ADMUX |= (1 << MUX1);
}
else
{
//Получение задания канала 2
value_ADC[2] = ADCH;
//Переключение канала АЦП на 0
ADMUX &= ~(1 << MUX1);
};
//Старт АЦП
ADCSRA |= (1 << ADSC);
}
Проблема в том, что если не инициировать значение на D-канале ШИМа единицей (любым ненулевым числом), он не работает до тех пор, пока значение АЦП, которое ему передается, не изменится. Т.е. при volatile unsigned char value_ADC[3] = {0, 0, 0} (значения с АЦП, передающие в OCR1A, OCR1B и OCR1D соответственно) в программе и, например, 127 на выходе соотв. АЦП, на выводе OC1D висит ноль, пока значение с АЦП не поменяется на 126 или 128. Если прописать volatile unsigned char value_ADC[3] = {1, 1, 1} в программе, все работает без проблем. В принципе, мне и так норм, но просто интересно, почему так. Вроде как разницы между A, B и D ШИМами быть не должно, а она есть.
Re: Таймеры/счётчики в AVR
Добавлено: Вт апр 18, 2017 23:37:47
watchmaker
Вопрос по асинхронному 32768 Гц таймеру в Atmega88 и подобных. Запустится ли его генератор, если кварц подключить к чипу без каких-либо конденсаторов? Пытаюсь развести плату для очень мелких наручных светодиодных часов - из-за этих конденсаторов дороги к кварцу приходится тянуть через всю плату (порядка 40 мм каждая, на расстоянии 0.2..0.5 мм от цифровых линий). Или это тут менее критично, чем отсутствие конденсаторов?
Re: Таймеры/счётчики в AVR
Добавлено: Ср апр 19, 2017 15:42:03
COKPOWEHEU
Для часового кварца подходящие конденсаторы встроены прямо в кристалл и включаются фузами, если не ошибаюсь.
Re: Таймеры/счётчики в AVR
Добавлено: Ср апр 19, 2017 22:03:54
watchmaker
Это на 8, но не 88/168. И включаются не автоматически, а фьюзом.
Re: Таймеры/счётчики в AVR
Добавлено: Ср апр 19, 2017 23:19:53
COKPOWEHEU
В некоторых ATmega8 баг из-за которого конденсаторы не включаются. На счет 48-328 согласен - там не встроены. Про фуз вы, очевидно, невнимательно прочитали.
Неужели конденсаторы нельзя скажем с обратной стороны припаять?
Без них может запуститься, но это не гарантируется, как не гарантируется и точность частоты. У меня так и было - кварц запустился, но частота была далека от заявленной.
Re: Таймеры/счётчики в AVR
Добавлено: Вс апр 23, 2017 09:56:44
Starichok51
у меня без конденсаторов стоит кварц 8 МГц, погрешность составила 0,15%. АТМега8.
Re: Таймеры/счётчики в AVR
Добавлено: Вс апр 23, 2017 21:41:32
B@R5uk
Многовато для кварца то.
Re: Таймеры/счётчики в AVR
Добавлено: Пн апр 24, 2017 16:38:06
COKPOWEHEU
Ну так без конденсаторов же. У меня без конденсаторов заводилось v-usb. Но, само собой, в финальной версии поставил их.
Re: Таймеры/счётчики в AVR
Добавлено: Пн апр 24, 2017 18:42:46
Starichok51
B@R5uk писал(а):Многовато для кварца то.
может, из-за отсутствия конденсаторов, а может, что кварцы самые дешевые купил...