Исходник
#include "iostm8s003f3.h"
#include "_eeprom_.h"
int pwm_val_a=0,pwm_val_b=0,time_out=0,ex1,ex2,exx1,exx2;
unsigned char set_mode=1,EncState=0;
void delay(int a)//Функция задержки
{int cnt;
for (cnt=a; cnt>0; cnt--);
}
unsigned char incod(void)
{
unsigned char cod0=0;
unsigned char k,cod1;
for(k=0;k<20;k++)
{
cod1=PC_IDR&0xC0;
if (cod0!=cod1)
{
k=0;
cod0=cod1;
}
}
return cod1;
};
void EncoderScan(void) // Функция опроса энкодера
{
unsigned char New=0;
New = incod(); // Берем текущее значение
// И сравниваем со старым
// Смотря в какую сторону оно поменялось -- увеличиваем
// Или уменьшаем соответствующий параметр
if (set_mode==1)
{
switch(EncState)
{
case 128:
{
if(New == 193) pwm_val_a++;
if(New == 0) pwm_val_a--;
break;
}
case 0:
{
if(New == 128) pwm_val_a++;
if(New == 64) pwm_val_a--;
break;
}
case 64:
{
if(New == 0) pwm_val_a++;
if(New == 193) pwm_val_a--;
break;
}
case 193:
{
if(New == 64) pwm_val_a++;
if(New == 128) pwm_val_a--;
break;
}
};
if (pwm_val_a>=1023)
{pwm_val_a=1023;}
else
{
if (pwm_val_a<=0)
{pwm_val_a=0;};
};
if (New!=EncState)
{
TIM2_CCR1H = ( pwm_val_a ) >> 8;
TIM2_CCR1L = ( pwm_val_a ) & 0xFF;
time_out=0;
};
PC_ODR_bit.ODR3 = 1;
PC_ODR_bit.ODR4 = 0;
}
if (set_mode==2)
{
switch(EncState)
{
case 128:
{
if(New == 193) pwm_val_b++;
if(New == 0) pwm_val_b--;
break;
}
case 0:
{
if(New == 128) pwm_val_b++;
if(New == 64) pwm_val_b--;
break;
}
case 64:
{
if(New == 0) pwm_val_b++;
if(New == 193) pwm_val_b--;
break;
}
case 193:
{
if(New == 64) pwm_val_b++;
if(New == 128) pwm_val_b--;
break;
}
};
if (pwm_val_b>=1023)
{pwm_val_b=1023;}
else
{
if (pwm_val_b<=0)
{pwm_val_b=0;};
};
if (New!=EncState)
{
TIM2_CCR2H = ( pwm_val_b ) >> 8;
TIM2_CCR2L = ( pwm_val_b ) & 0xFF;
time_out=0;
};
PC_ODR_bit.ODR4 = 1;
PC_ODR_bit.ODR3 = 0;
}
EncState = New; // Записываем новое значение
// Предыдущего состояния
};
int main( void )
{
//Настраиваем кнопку
PC_CR1_bit.C15 = 1;
PC_CR1_bit.C16 = 1;
PC_CR1_bit.C17 = 1;
//Светикi
PC_DDR_bit.DDR3 = 1; // U
PC_CR1_bit.C13 = 1; // Выход типа Push-pull
PC_DDR_bit.DDR4 = 1; // I
PC_CR1_bit.C14 = 1; // Выход типа Push-pull
///////////////////////////////////////////////////////////////////
CLK_ICKR = 0; // Reset the Internal Clock Register.
CLK_ICKR_HSIEN = 1; // Включаем внутреннйи кварц
CLK_ECKR = 0; // Отключаем внешний крвац
while (CLK_ICKR_HSIRDY == 0); // ждём стабилизации внутреннего кварца
CLK_CKDIVR = 0; // запускаем его на полную скорость - 16мГц
CLK_PCKENR1 = 0xff; // Включаем переферию
CLK_PCKENR2 = 0xff;
CLK_CCOR = 0;
CLK_HSITRIMR = 0;
CLK_SWIMCCR = 0;
CLK_SWR = 0xe1;
CLK_SWCR = 0;
CLK_SWCR_SWEN = 1;
while (CLK_SWCR_SWBSY != 0);
//Настройка вывода PB0.
TIM2_CCMR1_bit.OC1M = 0x06; //Устанавливаю PWM на PB0, активная 1.
TIM2_CCMR1_bit.OC1PE = 1; //Включаю прелоад, для правильной работы PWM.
TIM2_CCER1_bit.CC1E = 1; //Включаю вывод PB0.
TIM2_CCMR2_bit.OC2M = 0x06; //Устанавливаю PWM на PB0, активная 1.
TIM2_CCMR2_bit.OC2PE = 1; //Включаю прелоад, для правильной работы PWM.
TIM2_CCER1_bit.CC2E = 1; //Включаю вывод PB0.
TIM2_EGR_bit.UG = 1; //Вызываю UpdateEvent, чтобы таймер TIM2 принял установки.
// TIM2_IER_bit.UIE = 1; //Разрешаю прерывания по переполнению для TIM2.
TIM2_CR1_bit.CEN = 1; //Запускаю TIM2.
TIM2_PSCR = 0x01; // Делитель = 8.
TIM2_ARRH = (1023) >> 8; //Устанавливаю верхнее значение для TIM2.
TIM2_ARRL = (1023) & 0xFF;
asm("RIM"); //разрешаем прерывания
ex1 = EEPROM_Read_Byte(0x4000);
ex2 = EEPROM_Read_Byte(0x4001);
pwm_val_a = 256 * ex1 + ex2; // сложение
exx1 = EEPROM_Read_Byte(0x4003);
exx2 = EEPROM_Read_Byte(0x4004);
pwm_val_b = 256 * exx1 + exx2; // сложение
PC_ODR_bit.ODR3 = 0; // ложим светик U в ноль
PC_ODR_bit.ODR4 = 0; //ложим светик I в ноль
set_mode=0;
while (1)
{
// == Кнопарь переключения режимов ==
if(PC_IDR_bit.IDR5 == 0)
{
set_mode+=1;
if (set_mode>2)
{set_mode=0;}
while (PC_IDR_bit.IDR5 == 0)delay(30);
};
// ==================================
// ==== Регулятор напряжения ======
if (set_mode==1)
{
EncoderScan();
if(PC_IDR_bit.IDR5 == 0)
{
ex1 = TIM2_CCR1H;
ex2 = TIM2_CCR1L;
EEPROM_Unlock();
EEPROM_Program_Byte(0x4000,ex1);
EEPROM_Program_Byte(0x4001,ex2);
EEPROM_Lock();
}
};
if (set_mode==2)
{
EncoderScan();
if(PC_IDR_bit.IDR5 == 0)
{
exx1 = TIM2_CCR2H;
exx2 = TIM2_CCR2L;
EEPROM_Unlock();
EEPROM_Program_Byte(0x4003,exx1);
EEPROM_Program_Byte(0x4004,exx2);
EEPROM_Lock();
}
};
// ==== Работа ===================
if (set_mode==0)
{
TIM2_CCR1H = ( pwm_val_a ) >> 8;
TIM2_CCR1L = ( pwm_val_a ) & 0xFF;
TIM2_CCR2H = ( pwm_val_b ) >> 8;
TIM2_CCR2L = ( pwm_val_b ) & 0xFF;
PC_ODR_bit.ODR4 = 0;
PC_ODR_bit.ODR3 = 0;
}
// ==================================
}
}