Перейти к содержанию
    

Непонятна логика программы

Вчера написал программу для плавного пуска с использованием Timer0 (8 bit).

 

Сегодня решил усовершенствовать программу. Сделать на Timer1 (16 bit). Чтобы увеличить точность и плавность включения.

 

Пол дня промучался - ничего не получается.

 

Прошу помощи.

 

Сначала что имею. Имею МК ATMega 16. Вчера ещё всё включалось на 1МГц. Сегодня поставил кварц на 16МГц и прошил фузы.

 

Моя программа - alpha.rar (есть подробные коментарии)

 

Cкорее всего проблема в синтаксисе языка или логике выполнения.

 

 

Каждый блок программы проверял с помощью светодиода, установленого на плате. Если блок выполнялся - светодиод загорался. Например в блоке подачи импульса на симистор - светодиод загорается, но лампа не зажигается. Хотя если просто подать длительный импульс на симистор - лампа зажигается.

 

Не пойму в чём дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TCNT1H = (time[n] & 0xFF00) >> 8;

TCNT1L = time[n] & 0xFF;

... и открыть ветку "изучаем С интерактивно" :)

TCNT1H = time[n] >> 8;

TCNT1L = (unsigned char)time[n];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил. Всё равно пока не работает.

 

Обновлённая программа - alpha.rar

 

Обидно, что не осталась рабочая версия программы для 8-ми битного счётчика.

Изменено пользователем Владимир_КПИ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TCNT1H = time[n] >> 8;

TCNT1L = (unsigned char)time[n];

 

можно еще проще:

 

TCNT1H = time[n] >> 8;

TCNT1L = time[n];

 

результирующий код во всех трех случаях один, вопрос в наглядности написания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может проблема с тактированием. Устанавливал фъюзы. Припаивал кварцевый резонатор и 2 конденсатора на 22 пФ. По идее, если фъюзы установил на кварцевый резонатор, то должен работать кварцевый резонатор на 16МГц либо тактирования вообще не должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

результирующий код во всех трех случаях один, вопрос в наглядности написания.

В первом Вашем варианте придется полностью положиться на способность компилятора соптимизировать, а зачем? Наглядность из-за обилия ненужных символов тоже оставдяет желать лучшего.

В последнем все зависит от разрядности TCNT1L и реализации адресации, а зачем помнить о его разрядности, если сделав явное преобразование типов я получу и гарантированный, и читабельный код и без накладных расходов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как же всё просто было. Я увеличил тактовую частоту в 16 раз. А время отпирающего импульса симистора забыл увеличить. Блин.........

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил в схему кнопку для увеличения яркости. Столкнулся с дребезгом контактов.

 

Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:

while (1)

{

while (PINC.0==1){}

delay_us(200);

user=user+10;

n=user;

delay_us(200);

}

 

В результате при нажатии на кнопку яркость становиться произвольной. То есть дребезг присутствует. В чём ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки.

Не лучше, просто самый лобовой вариант.

Применил такой код:

Каким генератором случайных текстов пользуетесь, если не секрет?

 

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каким генератором случайных текстов пользуетесь, если не секрет?

 

Плохо знаю язык, поэтому и ошибки.

 

Должен же и такой "лобовой" вариант работать

Изменено пользователем Владимир_КПИ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:

Вы бы код свой комментировали словами, а? :(

Что такое user, что такое n?

Люди готовы помочь, Вы уж постарайтесь облегчить им задачу.

Пока будете слова писать, может причина неработоспособности кода и самому станет понятнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

while (1)

{

while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор

delay_us(200); //функция задержки на 200 мкс

user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10%

delay_us(200); //функция задержки на 200 мкс

}

Изменено пользователем Владимир_КПИ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плохо знаю язык, поэтому и ошибки.

Все хуже :( - попробуйте просто описать, что хотели сделать с задержкам и дребезгом на русском языке. Это уже будет бред.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) Яркость будет увеличиваться, пока нажата кнопка и не произойдет переполнение.

У Вас проблема не со знанием языка, а с ленью продумывания алгоритма. Правильно, зачем думать, проще выложить здесь фигню, не подумав (вот вторая задержка - для чего введена?), и подождать добрую душу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В постоянном цикле происходит проверка линия порта на нажатие. Если нажатия нет, то ничего не делать.

Если нажатие есть - произвести задержку на 200 мкс. После этого увеличить значение переменной user на 10.

 

 

Последняя задержка не нужна

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...