З0дравствуйте. У меня возникла проблема с написанием часов на atmega16. Я хочу сделать кнопку Start_stop в функции инициализации таймера. Но он не работает. void timer_ini(void) {
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
if (!(PORTA&0b00000100)) { start_stop=0; if (start_stop==0) { TCCR1B |= (0<<CS12);//установим делитель. } } if ((PORTA&0b00000100)) { start_stop++; if (start_stop==1) { TCCR1B |= (1<<CS12);//установим делитель. } }
TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
OCR1AH = 0b01111010; //записываем в регистр число для сравнения OCR1AL = 0b00010010; //TCCR1B |= (1<<CS12);//установим делитель. }
Счетчик работает. Не работает кнопка. в цикле я написал что если на PORTA 0b00000001 приходит земля то в значение переменной я занесу ноль и таймер перестанет считать.
Остановка делается или по предделителю таймера (запись соответствует отключенному от предделителя входу таймера) или спецфлагом остановки/сброса предделителя таймера.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Я попытался сделать вот так но все равно не работает. void timer_ini(void) {
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению) TCCR1B |= (i<<CS12); TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L) OCR1AH = 0b01111010; //записываем в регистр число для сравнения OCR1AL = 0b00010010; //TCCR1B |= (1<<CS12);//установим делитель. }
//----------
while(1) { if (!(PORTA&0b00000001)) { start_stop=0; if (start_stop==0) { i=0; } } if ((PORTA&0b00000100)) { if (start_stop==1) { i=1; } } if (start_stop>1) { if (i>1) { i=0; start_stop=0; } } } }
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
1. Вам уже сказали, где неверный код, почему в новом коде вы эту лажу повторили? 2. Где изменяется переменная start_stop и как она может стать >1? 3. Вы планируете использовать таймер еще для какой-то другой цели? Если нет, то оставьте функцию инициализации в покое, пусть себе считает. В обработчике прерывания просто при старте нужно обнулить переменную, и с ней уже работать. Всю обработку нажатий кнопок я бы сделал в главном цикле, или в отдельной процедуре, которая из него вызывается. 4. Вам очень не помешает посмотреть на исходные коды, которые были написаны до вас (в аналогичных разработках). В сети их полно. Там найдёте, как и старт сделать, и стоп.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения