Motion 0 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба Вчера написал программу для плавного пуска с использованием Timer0 (8 bit). Сегодня решил усовершенствовать программу. Сделать на Timer1 (16 bit). Чтобы увеличить точность и плавность включения. Пол дня промучался - ничего не получается. Прошу помощи. Сначала что имею. Имею МК ATMega 16. Вчера ещё всё включалось на 1МГц. Сегодня поставил кварц на 16МГц и прошил фузы. Моя программа - alpha.rar (есть подробные коментарии) Cкорее всего проблема в синтаксисе языка или логике выполнения. Каждый блок программы проверял с помощью светодиода, установленого на плате. Если блок выполнялся - светодиод загорался. Например в блоке подачи импульса на симистор - светодиод загорается, но лампа не зажигается. Хотя если просто подать длительный импульс на симистор - лампа зажигается. Не пойму в чём дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба TCNT1H = (time[n] & 0xFF00) >> 8; TCNT1L = time[n] & 0xFF; ... и открыть ветку "изучаем С интерактивно" :) TCNT1H = time[n] >> 8; TCNT1L = (unsigned char)time[n]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 14 февраля, 2008 Опубликовано 14 февраля, 2008 (изменено) · Жалоба Исправил. Всё равно пока не работает. Обновлённая программа - alpha.rar Обидно, что не осталась рабочая версия программы для 8-ми битного счётчика. Изменено 14 февраля, 2008 пользователем Владимир_КПИ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Liseev 0 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба TCNT1H = time[n] >> 8; TCNT1L = (unsigned char)time[n]; можно еще проще: TCNT1H = time[n] >> 8; TCNT1L = time[n]; результирующий код во всех трех случаях один, вопрос в наглядности написания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба Может проблема с тактированием. Устанавливал фъюзы. Припаивал кварцевый резонатор и 2 конденсатора на 22 пФ. По идее, если фъюзы установил на кварцевый резонатор, то должен работать кварцевый резонатор на 16МГц либо тактирования вообще не должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба результирующий код во всех трех случаях один, вопрос в наглядности написания. В первом Вашем варианте придется полностью положиться на способность компилятора соптимизировать, а зачем? Наглядность из-за обилия ненужных символов тоже оставдяет желать лучшего. В последнем все зависит от разрядности TCNT1L и реализации адресации, а зачем помнить о его разрядности, если сделав явное преобразование типов я получу и гарантированный, и читабельный код и без накладных расходов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 14 февраля, 2008 Опубликовано 14 февраля, 2008 · Жалоба Как же всё просто было. Я увеличил тактовую частоту в 16 раз. А время отпирающего импульса симистора забыл увеличить. Блин......... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба Добавил в схему кнопку для увеличения яркости. Столкнулся с дребезгом контактов. Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код: while (1) { while (PINC.0==1){} delay_us(200); user=user+10; n=user; delay_us(200); } В результате при нажатии на кнопку яркость становиться произвольной. То есть дребезг присутствует. В чём ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Не лучше, просто самый лобовой вариант. Применил такой код: Каким генератором случайных текстов пользуетесь, если не секрет? uint_least8_t press_cnt; for(;; ) { if( !PINC.0 ) { if( ++press_cnt > 250 ) { user += 10; press_cnt = 0; } else delay_us( 1000 ); } else press_cnt = 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 (изменено) · Жалоба Каким генератором случайных текстов пользуетесь, если не секрет? Плохо знаю язык, поэтому и ошибки. Должен же и такой "лобовой" вариант работать Изменено 15 февраля, 2008 пользователем Владимир_КПИ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код: Вы бы код свой комментировали словами, а? :( Что такое user, что такое n? Люди готовы помочь, Вы уж постарайтесь облегчить им задачу. Пока будете слова писать, может причина неработоспособности кода и самому станет понятнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 (изменено) · Жалоба while (1) { while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор delay_us(200); //функция задержки на 200 мкс user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10% delay_us(200); //функция задержки на 200 мкс } Изменено 15 февраля, 2008 пользователем Владимир_КПИ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба Плохо знаю язык, поэтому и ошибки. Все хуже :( - попробуйте просто описать, что хотели сделать с задержкам и дребезгом на русском языке. Это уже будет бред. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба while (1) { while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор delay_us(200); //функция задержки на 200 мкс user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10% delay_us(200); //функция задержки на 200 мкс } 1) Типичный дребезг около миллисекунды, а в плохих кнопках достигает 5 мс. 2) Яркость будет увеличиваться, пока нажата кнопка и не произойдет переполнение. У Вас проблема не со знанием языка, а с ленью продумывания алгоритма. Правильно, зачем думать, проще выложить здесь фигню, не подумав (вот вторая задержка - для чего введена?), и подождать добрую душу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Motion 0 15 февраля, 2008 Опубликовано 15 февраля, 2008 · Жалоба В постоянном цикле происходит проверка линия порта на нажатие. Если нажатия нет, то ничего не делать. Если нажатие есть - произвести задержку на 200 мкс. После этого увеличить значение переменной user на 10. Последняя задержка не нужна Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться