Показать сообщение отдельно
Старый 17.09.2011, 22:13   #856   
Форумец
 
Аватар для Butik
 
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 59

Butik вне форума Не в сети
А кстати.. Вот если вернуться так сказать к истокам то в примере с использованием модуля ШИМ есть небольшая недоработка - там при нажатии кнопки больше или меньше контроллер не останавливается в максимальном или минимальном пределе- а проскакивает его и начинает новый цикл с минимума.. Это неплохо для общего понимания теории регулирования скважности, но на практике это мало применимо..
Вот исправил и доработал код- здесь начальное значение задано нулевым...И при нажатии кнопки больше происходит плавное нарастание до максимума с дискретностью 10% .. И с остановом в конечной точке. То же и при уменьшении.

Код:
unsigned short  j, old_j;
void Init() {
CMCON=7;                // все входы цифровые, компараторы отключены
PORTB = 0;              // установили PORTB в 0
TRISB = 0;              // настроили PORTB на выход
PORTA = 0xff;           // установили PORTA в 1
TRISA = 0xff;           // настроили PORTA на вход
Pwm_Init(5000);         // настроили ШИМ модуль, период ШИМ - 5 кГц
}//
void main() {
Init();
j   = 0;               // начальная инициализация j
old_j  = 0;             // начальная инициализация old_j
Pwm_Start();            // запуск ШИМ
while (1) {             // устроили бесконечный  цикл
if (Button(&PORTA, 0,1,0)){   // нажимаем кнопку на RA0
if(J<=245) j +=10;
else j = 255;}                 // увеличивается j (яркость больше)
if (Button(&PORTA, 1,1,0)){   // нажимаем кнопку на RA1
if (j>= 10)  J -=10;
else j = 0;}            // уменьшается j (яркость меньше)
if (old_j != j) {        // если было изменение j
Pwm_Change_Duty(j);    // то изменяем параметры ШИМ
old_j = j;             // и сохраняем новое значение
}
Delay_ms(200);        // задержка 200 мсек
}
}//~
  Ответить с цитированием