Вс окт 30, 2016 10:22:03
.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
Вс окт 30, 2016 12:33:03
Ср ноя 02, 2016 21:20:58
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
Чт ноя 03, 2016 06:13:30
Чт ноя 03, 2016 06:48:03
Чт ноя 03, 2016 08:09:23
На практике, использование аппаратных возможностей таймера позволяет получить минимальную длительность импульса равную 1 такту и период следования оных 2 тактам. Справедливо для OCxB. С учётом того, что занесение нового значения сравнения производится через буферный регистр формирование временной диаграммы происходит без глюков.COKPOWEHEU писал(а):Теоретически на таймере можно настроить вызов прерывания с точностью 1 такт. Минимальное время будет где-то тактов 10-20.
Пн ноя 07, 2016 11:53:47
Пн ноя 07, 2016 18:59:22
К каждому порту светодиод подключен и их всего 8? При возникновении прерывания от таймера:evgen_kz писал(а):Необходимо создать программу, циклически "перемещающую" огонёк по цепочке светодиодов, подключённых к порту B микроконтроллера ATtiny2313.
Наверное в Вашем задании было значение шага изменения времени и условие изменения.evgen_kz писал(а): Для создания задержки между шагами (от 0,1 секунды до 1 секунды)
Тактовая частота МК очень не последний параметр для данной задачи.evgen_kz писал(а):Помогите, правильно настроить инициализацию таймер счетчик и регистр прерываний.
Чт янв 12, 2017 11:58:55
Чт янв 12, 2017 14:29:47
Чт янв 12, 2017 16:44:04
Вт фев 07, 2017 12:31:18
/*
Используется МК 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);
}
Вт апр 18, 2017 23:37:47
Ср апр 19, 2017 15:42:03
Ср апр 19, 2017 22:03:54
Ср апр 19, 2017 23:19:53
Вс апр 23, 2017 09:56:44
Вс апр 23, 2017 21:41:32
Пн апр 24, 2017 16:38:06
Пн апр 24, 2017 18:42:46
может, из-за отсутствия конденсаторов, а может, что кварцы самые дешевые купил...B@R5uk писал(а):Многовато для кварца то.