ChipCard, у него там atmega16 и возможно другая версия. Просто поставьте точку останова на cnt++ внутри ISR и начните дебаг без остановки и без изменения битов в TCNT. Неужели не сработает прерывание? cnt как volatile обязательно только.
ChipCard, симулятор по-другому может работать для атмега16. А версия там 6.0 вроде, а у вас может 6.2, к примеру. Я же не знаю какая у вас версия. Не доверяйте вы так симулятору. Сказано и показано же - глючит. Всё что угодно может влиять. Симулятор - он как бы не железо настоящее, что-то не симулируется, что-то работает не так.
ChipCard - AVR Toolchain устанавливается поверх студии. Ищите самую последнюю версию. Студию 4.19 можете отдельно поставить. Главное, чтобы не было конфликтов драйверов. Jungo, кажется, если установлены, значит не ставьте. Мнение других вы слышали, мое мнение такое - боязнь сложностей. Считаю, что не нужно бояться сложностей (считайте это частью самовоспитания, характера, тренировки преодоления сложностей (но это не равно "в гамаке и стоя" ни в коей мере!)). Создание проектов и отладка в студии просто чуточку сложнее. Но когда привыкнешь, это перестанет быть сложным. Симуляция схем в протеусе на ваше усмотрение. Я всегда новый проект начинаю с макетирования. Это самая ненавистная часть работы. Но, все это окупается сторицей, потому что вот оно, в железе.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Это вы должны прочитать в книжках. Даташитах. А не в симуляторе, который как вы, наверное, уже поняли, не всегда корректно отображает работу периферии. Теперь вы поняли, почему нужно штудировать, как работает архитектура мк? Чтобы отталкиваться в дальнейшем от ЗНАНИЯ.
По идее он устанавливается перед переходом по вектору.
Он там очищается ) Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие. А уже потом проц видя взведенный флаг прерывания и разрешения на его выполнение, после завершения текущей инструкции, подменяет PC делая переход по вектору прерывания. А вот очищается флаг прологом ISR, генерируемый компилятором. Если бы шагали по ASMовским инструкциям, то увидели бы это. В коде C вы этого не видите, потому что ни одной строчки C нет между этапами "флаг установлен", "флаг очищен".
Добавлено after 41 second: Demiurg, даташит (равно как и "знание архитектуры") кстати вообще нихрена на этот вопрос не отвечает. Тут надо знать как компилятор avr-gcc работает, а это совсем отдельная история.
знание архитектуры при неработающем инструменте отладки никак не помогает при отладке, поскольку отладка - это отработка программы, а не аппаратуры. если создать ситуацию, когда программный участок получает управление, нельзя по причине неработоспособности симулятора, то никакое знание о железе не поможет этот участок программы отладить.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
NStorm, ARV - вы сейчас оба вводите в заблуждение всех, кто читает последние ваши сообщения. Встаньте оба в угол и подумайте над своим поведением. Намёк, вы симуляторы ставите наперёд знания архитектуры мк.
Я с 2007 года делаю отладку всех своих проектов в студии. Асм, си. Так как знаю архитектуру мк, ни единый глюк студии мне не мешает.
Берем толковую книжку или открываем даташит. В нем структурные схемы всех узлов периферии. И по этим схемам смотрим что и как. Справа вы увидите выходы таймера, которые дергают прерывания. Условия, по которым на этих выходах появляется активный уровень, четко прописаны в книжках и даташитах, притом вплоть до такта, что и когда будет происходить. Не в симуляторы нужно смотреть, а вдумчиво читать соответствующие разделы по архитектуре.
Demiurg, вы сейчас вообще не в тему несете. Вам видимо настолько в голову засела мысль про "знание архитектуры", что ветвь дискуссии вы уже не видите и проблем. Глаза откройте и перечитайте о чем речь шла. А то хамить уже начали вообще не к месту. Стыдобище вам, потому что не видите в чем вопрос даже был, только за симулятор зацепились.
Дальнейшее обсуждение в этой теме не вижу смысла. Единственное, не замечаю, как устанавливается флаг TOV0. По идее он устанавливается перед переходом по вектору.
Никто из вас не показал, куда действительно нужно смотреть. А смотреть нужно в книжки, даташиты, структурные схемы. Вот про что я говорю, прежде чем советовать симуляторы, прочитайте внимательно вопрос вопрошающего. Мы закончили?
Устанавливается железно периферией ДО перехода по вектору. Ставится он именно когда периферия детектирует событие.
?
Но вы не потрудились вникнуть в вопрос ChipCard. А был он не в этом даже. А в том, почему он флага в симуляторе не видит. Вы можете сколько угодно далдонить про "архитектуру", но тема про студию, а вопрос про симулятор. И вопрос был в том, почему именно в симуляторе не виден флаг прерывания. И я на него дал ответ. Потому что да, архитектура + особенности симулятора.
И я на него дал ответ. Потому что да, архитектура + особенности симулятора.
Да. Да! Я рад, что мы наконец-то пришли к консенсусу. Когда ты знаешь четко, что и как происходит в кишках мк, ты смело можешь плевать на то, что вытворяет любой симулятор. Лично мне по барабану глюки студии. Мне в ней комфортно работается. )
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Всем привет! Появиласть задачаь заряжать акб автомобиля, "модулированым током 35Гц", т.е. пачки 1кГц промодулированы 35Гц, вроде так)))) Истории всей затеи такова, что вроде как лучше заряжается современный акб по технологии Са/Са, и в тоже время идет десульфатация пластин акб, плюс не кипит. Я новичок в программирование, учусь потихоньку. Накидал код, посмотрел что получилось в Протусе. Вопрос - правильно ли настроил таймеры, особенно таймер1 на 1кГц, с ним у меня вышло больше всего плясок с бубном, и правильное я выбрал направления реализации кода для данных задач? К критике адекватно восприимчив, приминаются все мысли, буду рад поучиться у людей более разбирающихся в этих темах и их примерах на практике. Спасибо всем!
/*объявляем прерменные********************************************************************************************/ unsigned char PWR_1; //переменные, для изменения скважности ШИМ в программе unsigned char PWR_1_b; //переменные, для буферизации значений скважности ШИМ unsigned char timer1; //переменная-счетчик вызовов обработчика прерываний unsigned char PWR_2; //переменные, для изменения скважности ШИМ в программе unsigned char PWR_2_b; //переменные, для буферизации значений скважности ШИМ unsigned char timer2; //переменная-счетчик вызовов обработчика прерываний /*****************************************************************************************************************/
// Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { timer2++; if (PWR1==1){ //Синхронизируем с 35Hz if (timer2 == 0){ //если счетчик переполнился и принял значение 0 PWR_2_b = PWR_2; //сохранием значения в буфер PWR2=1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (PWR_2_b == timer2) { PWR2=0;} //по достижении заданной скважности выводим логический 0 в ножку МК } if(PWR1==0) {PWR2=0;} //не проскакивало иголок в паузе 35Hz }
// Timer2 output compare interrupt service routine interrupt [TIM2_COMP] void timer2_comp_isr(void) { timer1++; if (timer1 == 0){ //если счетчик переполнился и принял значение 0 PWR_1_b = PWR_1; //сохранием значения в буфер PWR1=1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (PWR_1_b == timer1) { PWR1 = 0;} //по достижении заданной скважности выводим логический 0 в ножку МК }
Помогите пожалуйста настроить таймер в Attiny1607, новое поколение выпущенное Microchip.
Я хочу настроить таймер TCA 16bit на период 0.2мс(5КГц) в режиме частоты(frequency mode). Я расчитываю CMP0 по формуле из даташита.
N = 16 CMP0 = 20000KHz/(2*N * 5KHz)-1 = 124 = 0x7C Но при таких настройках таймер работает не правильно. Я подбирала по осциллограме с ножки PB0(WO0), получилось, что для настройки периода 0.2мс CMP0 = 0x14 Таймер настраивала так:
А еще есть вторая проблема, с перываниями. Я хочу настроить прерывание с частотой 2мс. Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. Зато срабатывает ISR (TCA0_OVF_vect) с периодом ~0,05м Помогите пожалуйста разобраться.
2й таймер настроен неправильно... да и не нужен 2й таймер для этой задачи... ______ 1) настрой любой (пусть будет Т1) на 1кГц с режимом PWM и с генерацией прерывания выход PWM (ШИМ) будет управлять зарядкой, а самим этим режимом будет управлять соответствующий ему регистр OCR. Т.е. режимом зарядки теперь можно управлять, изменяя OCR. 2) т.к. прерывание вызывается с частотой 1кГц, то этим можно воспользоваться - в прерывании инкрементировать переменную i (счетчик) и сравнивать её с 2мя константами С1=заполнение, С2=1000. если i<C1 OCR=x иначе OCR=0; //(включение-отключение импульсов, х-ширина "иголок" заряда) если i>C2 i=0; //(перезапуск программного счетчика.)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения