|
|
  |
Непонятна логика программы, Не могу найти ошибку. Подскажите. |
|
|
|
Feb 14 2008, 15:45
|

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

|
Вчера написал программу для плавного пуска с использованием Timer0 (8 bit). Сегодня решил усовершенствовать программу. Сделать на Timer1 (16 bit). Чтобы увеличить точность и плавность включения. Пол дня промучался - ничего не получается. Прошу помощи.Сначала что имею. Имею МК ATMega 16. Вчера ещё всё включалось на 1МГц. Сегодня поставил кварц на 16МГц и прошил фузы. Моя программа -
alpha.rar ( 33.08 килобайт )
Кол-во скачиваний: 87 (есть подробные коментарии) Cкорее всего проблема в синтаксисе языка или логике выполнения. Каждый блок программы проверял с помощью светодиода, установленого на плате. Если блок выполнялся - светодиод загорался. Например в блоке подачи импульса на симистор - светодиод загорается, но лампа не зажигается. Хотя если просто подать длительный импульс на симистор - лампа зажигается. Не пойму в чём дело.
|
|
|
|
|
Feb 14 2008, 15:51
|

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

|
Цитата(Liseev @ Feb 14 2008, 13:14)  TCNT1H = (time[n] & 0xFF00) >> 8; TCNT1L = time[n] & 0xFF; ... и открыть ветку "изучаем С интерактивно"  TCNT1H = time[n] >> 8; TCNT1L = (unsigned char)time[n];
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 14 2008, 16:01
|

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

|
Исправил. Всё равно пока не работает. Обновлённая программа -
alpha.rar ( 33.07 килобайт )
Кол-во скачиваний: 84Обидно, что не осталась рабочая версия программы для 8-ми битного счётчика.
Сообщение отредактировал Владимир_КПИ - Feb 14 2008, 16:13
|
|
|
|
|
Feb 14 2008, 16:28
|

Частый гость
 
Группа: Свой
Сообщений: 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]; результирующий код во всех трех случаях один, вопрос в наглядности написания.
|
|
|
|
|
Feb 14 2008, 18:12
|

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

|
Цитата(Liseev @ Feb 14 2008, 19:28)  результирующий код во всех трех случаях один, вопрос в наглядности написания. В первом Вашем варианте придется полностью положиться на способность компилятора соптимизировать, а зачем? Наглядность из-за обилия ненужных символов тоже оставдяет желать лучшего. В последнем все зависит от разрядности TCNT1L и реализации адресации, а зачем помнить о его разрядности, если сделав явное преобразование типов я получу и гарантированный, и читабельный код и без накладных расходов?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 15 2008, 07:03
|

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

|
Добавил в схему кнопку для увеличения яркости. Столкнулся с дребезгом контактов. Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код: Цитата while (1) { while (PINC.0==1){} delay_us(200); user=user+10; n=user; delay_us(200); } В результате при нажатии на кнопку яркость становиться произвольной. То есть дребезг присутствует. В чём ошибка?
|
|
|
|
|
Feb 15 2008, 07:22
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 15 2008, 07:29
|

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

|
Цитата Каким генератором случайных текстов пользуетесь, если не секрет? Плохо знаю язык, поэтому и ошибки. Должен же и такой "лобовой" вариант работать
Сообщение отредактировал Владимир_КПИ - Feb 15 2008, 07:32
|
|
|
|
|
Feb 15 2008, 07:31
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Владимир_КПИ @ Feb 15 2008, 11:03)  Прочёл, что лучше всего бороться с дребезгом, введя задержку после первого детектирования нажатия кнопки. Применил такой код: Вы бы код свой комментировали словами, а? Что такое user, что такое n? Люди готовы помочь, Вы уж постарайтесь облегчить им задачу. Пока будете слова писать, может причина неработоспособности кода и самому станет понятнее.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 15 2008, 07:55
|
Гуру
     
Группа: Свой
Сообщений: 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) Яркость будет увеличиваться, пока нажата кнопка и не произойдет переполнение. У Вас проблема не со знанием языка, а с ленью продумывания алгоритма. Правильно, зачем думать, проще выложить здесь фигню, не подумав (вот вторая задержка - для чего введена?), и подождать добрую душу.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|