реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Непонятна логика программы, Не могу найти ошибку. Подскажите.
Motion
сообщение Feb 14 2008, 15:45
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



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

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

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

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

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

Моя программа - Прикрепленный файл  alpha.rar ( 33.08 килобайт ) Кол-во скачиваний: 87
(есть подробные коментарии)

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


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

Не пойму в чём дело.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2008, 15:51
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Liseev @ Feb 14 2008, 13:14) *
TCNT1H = (time[n] & 0xFF00) >> 8;
TCNT1L = time[n] & 0xFF;
... и открыть ветку "изучаем С интерактивно" smile.gif

TCNT1H = time[n] >> 8;
TCNT1L = (unsigned char)time[n];


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 16:01
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



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

Обновлённая программа - Прикрепленный файл  alpha.rar ( 33.07 килобайт ) Кол-во скачиваний: 84


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

Сообщение отредактировал Владимир_КПИ - Feb 14 2008, 16:13
Go to the top of the page
 
+Quote Post
Liseev
сообщение Feb 14 2008, 16:28
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 99
Регистрация: 27-10-07
Из: СПб
Пользователь №: 31 797



Цитата(zltigo @ Feb 14 2008, 18:51) *
TCNT1H = time[n] >> 8;
TCNT1L = (unsigned char)time[n];


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

TCNT1H = time[n] >> 8;
TCNT1L = time[n];

результирующий код во всех трех случаях один, вопрос в наглядности написания.
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 17:46
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Может проблема с тактированием. Устанавливал фъюзы. Припаивал кварцевый резонатор и 2 конденсатора на 22 пФ. По идее, если фъюзы установил на кварцевый резонатор, то должен работать кварцевый резонатор на 16МГц либо тактирования вообще не должно быть?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2008, 18:12
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Liseev @ Feb 14 2008, 19:28) *
результирующий код во всех трех случаях один, вопрос в наглядности написания.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 14 2008, 18:30
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Как же всё просто было. Я увеличил тактовую частоту в 16 раз. А время отпирающего импульса симистора забыл увеличить. Блин.........
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:03
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



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

Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:
Цитата
while (1)
{
while (PINC.0==1){}
delay_us(200);
user=user+10;
n=user;
delay_us(200);
}


В результате при нажатии на кнопку яркость становиться произвольной. То есть дребезг присутствует. В чём ошибка?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2008, 07:22
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Владимир_КПИ @ Feb 15 2008, 10:03) *
Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки.

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

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

Код
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;
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:29
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



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


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

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

Сообщение отредактировал Владимир_КПИ - Feb 15 2008, 07:32
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 07:31
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 11:03) *
Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код:

Вы бы код свой комментировали словами, а? sad.gif
Что такое user, что такое n?
Люди готовы помочь, Вы уж постарайтесь облегчить им задачу.
Пока будете слова писать, может причина неработоспособности кода и самому станет понятнее.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:37
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



while (1)
{
while (PINC.0==1){} //кнопка подключена одним концом к земле, другим к PINC.0. Линия порта включена на ввод через поддягивающий резистор
delay_us(200); //функция задержки на 200 мкс
user=user+10; //по умолчанию user=50 (% яркости). При нажатии на кнопку она (яркость) должна увеличиться на 10%
delay_us(200); //функция задержки на 200 мкс
}

Сообщение отредактировал Владимир_КПИ - Feb 15 2008, 07:39
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2008, 07:48
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Владимир_КПИ @ Feb 15 2008, 10:29) *
Плохо знаю язык, поэтому и ошибки.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 15 2008, 07:55
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Владимир_КПИ @ Feb 15 2008, 11:37) *
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) Яркость будет увеличиваться, пока нажата кнопка и не произойдет переполнение.
У Вас проблема не со знанием языка, а с ленью продумывания алгоритма. Правильно, зачем думать, проще выложить здесь фигню, не подумав (вот вторая задержка - для чего введена?), и подождать добрую душу.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Motion
сообщение Feb 15 2008, 07:56
Сообщение #30


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



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


Последняя задержка не нужна
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th August 2025 - 18:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01496 секунд с 7
ELECTRONIX ©2004-2016