jeka101 хоть мегу, хоть тини: настраиваешь таймер на генерацию прерываний, по ним идут пара программных счётчиков и программное же сравнение с уставками, всё.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Всем добрый день. Вопросик есть, мне нужен таймер, с 2мя каналами на atmega8 или 328, к сожалению программную среду атмег я почти не знаю. Тем не менее хочу спросить может кто поможет. Суть, нужно что-бы канал работал допустим 10ч а потом был выключен 14ч, 2й так-же но независимо от первого, и фоторезистор который не останавливает таймеры но блокирует работу обоих каналов, то есть если я посветил светом, канал отключиться но когда наступит темнота если время рабочего состояния на таймере еще не истекло он включит канал.
Я поискал на просторах интернета и нашел некоторые схемы и прошивки к ним но они все с дисплеями и ручными настройками, я ищу вариант без дисплея где у меня есть 1 кнопка RESET которая коротким нажатием запускает таймер одного канала и начинает его отсчет а последующим коротким нажатием запускает таймер второго канала и начинает его счет, а долгим нажатием сбрасывает оба, настройка интервалов таймеров через исходники. Схему вроде собрать могу а вот программную часть не знаю как реализовать...
Можно сделать на одной atmega8, вешаем на нее часовой кварц, запускаем таймер в асинхронном режиме так, чтобы прерывание возникало раз в секунду. На каждом прерывании инкрементируем необходимые счетчики и проверяем достигли порога или нет (10ч = 36000с). Кнопки и инициализация каналов рулится через флаги, например. Читать здесь http://easyelectronics.ru/avr-uchebnyj- ... jmera.html
Может неправильная последовательность запуска и очистки?
Попробуйте так
Так еще одно лишнее прерывание появляется. Скидываю проект в 4й студии и 7м протеусе чтобы Вы попробовали сами. На скрине красным обведено прерывание которое возникать не должно.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Конечно все можно исправить с помощью cli. Но дело то в другом, по теории прерывание не должно возникать потому что таймер был остановлен, сброшен, очищен флаг прерывания и запущен заново. Ну не может оно возникнуть с режиме стс на первом такте в то время как сравнение идёт не с 1 а с числом 124. Я пока что расцениваю это явление как очередной баг протеуса, тк симулятор студии этого прерывания не показывает. Постараюсь проверить в железе этот код, отпишусь.
Последний раз редактировалось Feruz Пн янв 15, 2018 12:55:39, всего редактировалось 1 раз.
Добрый день, изучаю AVR и делаю управление для вытяжки, за основу взял ATmega8. требуется помощь в правильности написания алгоритма при выполнении временных задержек.
Основные задачи:
1.Режим включение на 15мин. одного из трех режимов вентилятора. 2.Режим включения на 2 минуты подсветки, при чем не зависимо от 1 пункта. 3.Режимы оповещения т.к. моргание светодиодов (короткое, длинное, плавное) и звуки динамика (короткие, длинные).
Почитав литературу понял, что правильно это реализовывать через таймеры, но как правильно пока не понимаю, из просмотра форума понял что мигание и опрос кнопок лучше реализовать через создание одного таймера как системный, а как правильно формировать временные задержки на выполнение?
А это вообще нормально - использовать cli для остановки таймера? Разве запрет прерываний остановит таймер?
Не остановит! Он только перестанет плевать прерываниями, но продолжит работать. Чтобы его остановить, надо или явно прописать это в регистр, или остановить соответствующий тактовый генератор.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Сижу туплю. Есть таймер, прерывание раз в 10мкс. Как сделать аппаратный delay при помощи таймера?
Т.е. мне нужно взять текущее значение которое на тикал таймер, и отсчитать от этого значение времени задержки? Или управлять таймером - включать и выключать его на нужно время?
Последний раз редактировалось alex38779 Вс фев 18, 2018 16:39:53, всего редактировалось 1 раз.
10мкс задержка на секундном таймере? Это как? Если не нужны задержки мкс и сек, минуты одновременно, то таймер настраиваем на соответствующий диапазон. Напр, надо 120 мкс, настраиваем таймер на 10мкс, в переменную заносим 12 и в прерывании декремент, если переменная=0, выставляем некий флаг, на который в основном теле обратите внимание. Т.е.: 1. Каждые 10 мкс по таймеру возникает прерывание 2. В прерывании проверяем переменную. Если 255 - выходим ничего не делая, те вам не нужна задержка. 3. Вам потребовалась задержка. Переменной присваиваем значение равное нужной задержке /на частоту прерывания, те 120/10=12 4. В прерывании обнаруживаете, что переменная не равна 255 и декрементируете её, проверяете на 0, выходите из прерывания 5. Как только переменная стала =0 выставляете флаг и выходите. В следующем прерывании переменная декрементируется и автоматом станет=255 6. В теле по флагу запускаете/останавливаете свой процесс и сбрасываете флаг
Пременная может быть и 2хбайтовой, в этом случае я проверяю оба байта. Если надо секунды-минуты-часы и т.д. настраиваем соответственно и таймер, а то замучаетесь по 10мкс насчитать десяток часов Взяв несколько переменных можно организовать несколько задержек одновременно Если одновременно должны тикать и минуты и микросекунды, может рациональнее задействовать другой таймер?
_________________ Я всё-всё узнAю и стану профессором.
я проще сделал, если надо считать время и точность не особо важна (розетка с таймером для подогрева машины и соседу делал управление светом в курятнике) использовал ватчдог, настроил на пол секунды, и в каждом прерывании по ватчдогу добавляю переменные. только плавает время в зависимости от температуры на улице. но от этого никуда не деться если только часы реального времени использовать. за неделю разбег в час не особо напрягает, тем более есть кнопки, которыми можно время поправить. Спойлер
Код:
#define F_CPU 8000000 #include <avr/io.h> #include <avr/wdt.h> // здесь организована работа с ватчдогом #include <avr/sleep.h> // здесь описаны режимы сна #include <avr/interrupt.h> // работа с прерываниями #include <util/delay.h>
unsigned char tc=0; unsigned char tm=0; unsigned char th=0; // Массив значений для индикатора //---------- char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // Функция вывода 1 разряда void write_byte_1(char data) { for(char i = 0; i < 8 ; i++) { if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем PORTA |= (1 << PA0); // DATA 1 else PORTA &= ~(1 << PA0); // DATA 0 PORTA &= ~(1 << PA1); // CLK 0 PORTA |= (1 << PA1); // CLK 1 data = data << 1; // Сдвигаем биты } }
// Функция вывода 2 разряда void write_byte_2(char data) { for(char i = 0; i < 8 ; i++) { if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем PORTA |= (1 << PA0); // DATA 1 else PORTA &= ~(1 << PA0); // DATA 0 PORTA &= ~(1 << PA1); // CLK 0 PORTA |= (1 << PA1); // CLK 1 data = data << 1; // Сдвигаем биты } } // Функция вывода 3 разряда void write_byte_3(char data) { for(char i = 0; i < 8 ; i++) { if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем PORTA |= (1 << PA0); // DATA 1 else PORTA &= ~(1 << PA0); // DATA 0 PORTA &= ~(1 << PA1); // CLK 0 PORTA |= (1 << PA1); // CLK 1 data = data << 1; // Сдвигаем биты } }
ISR (WDT_vect) {
tc++;
if (tc==54) { tm++; tc=0;
} if (tm==60) { th++; tm=0; tc=0;
} if (th==24) { th=0; tm=0; tc=0;
}
if ((PINB&(1<<PB0))==0) { th++; }
if ((PINB&(1<<PB1))==0) { th--; } if (th>24) { th=0; } if ((3<=th)&&(th<=5)) { PORTB |= (1 << PB2);
} else { PORTB &= ~(1 << PB2); }
WDTCSR |= (1 << WDIE);
}
int main(void) { DDRB = 0b00000100; PORTB = 0b00000011; DDRA = 0b00011111; PORTA = 0b00000000; wdt_reset(); // сбрасываем wdt_enable(WDTO_1S); // разрешаем прерывания по ватчдогу. Иначе будет резет. WDTCSR |= (1<<WDIE); sei(); // разрешаем прерывания
while(1) { write_byte_1(SEGMENTE[th%100/10]); PORTA |= (1 << PA2); // Выводим 1 разряд _delay_us(5000); PORTA &= ~(1 << PA2); write_byte_2((SEGMENTE[th%10])|0x80); // Выводим 2 разряд PORTA |= (1 << PA3); // Включаем индикатор _delay_us(5000); PORTA &= ~(1 << PA3); write_byte_3(SEGMENTE[tm%100/10]); // Выводим 3 разряд PORTA |= (1 << PA4); // Включаем индикатор _delay_us(5000); PORTA &= ~(1 << PA4);
} }
_________________ Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Существует ли достаточно мелкий AVR контроллер (чтобы не совать M88), который имеет минимум два независимых таймера с ШИМ-выходами? Нужно именно два отдельных таймера - мне надо выдавать две частоты одновременно. Лучше, если хотя бы один из них будет 16-битным, но это не столь критично.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
тини 25: 8 ног два таймера по 8 бит, по два ШИМ выхода ADC, AC, внешние прерывания... (по памяти, на всяк скачай ДШ, проверь)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Добавлено after 1 minute 2 seconds: а с 2313й по размерам уже и мега 8 сравнится (даже мельче будет)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения