ReAl (29.03.2007 17:10, просмотров: 1) ответил LordN на вобщем кое-что нашел, но там сделано по другому
Ну, в первом варианте можно было без плавучки обойтись, в целых числах. Если я правильно помню, оно DDA называется.
В целых числах делается без проблем, а если "период" (число M) степень двойки, то и начальное <c>inr = 256*N/M</c> не нужно.
Если код мощности от 0 до 127, то можно вообще байтом обойтись:
<c>
uint8_t power;
ISR(AC_LINE_vect) {
enum { CARRY_BIT = 0x80 };
static uint8_t accum=0;
accum += power;
if( accum & CARRY_BIT) bit_on(TRIAC_GATE);
else bit_off(TRIAC_GATE);
accum &= ~CARRY_BIT;
}
</c>
Собственно, тут код мощности можно иметь от 0 до 128 для мощности от 0% до 100%
А "155ИЕ8" - это так
<c>
uint8_t bit_reversed_power_code;
ISR(AC_LINE_vect) {
static uint8_t ac_counter=0;
++ac_counter;
if( ac_couter & bit_reversed_power_code ) bit_on(TRIAC_GATE);
else bit_off(TRIAC_GATE);
}
</c>
bit_reversed - это из 0x15 делать 0xA8.