Цитата(MrYuran @ Apr 10 2012, 08:53)

Нормально.
Я, кажется, понял.
Вам надо просто несколько фиксированных уровней?
Так это ещё проще.
Забиваете формулу в макрос, и даже считать ничего не придется в рантайме. Константы сосчитаются на этапе компиляции.
Вы имеете ввиду написать чтото наподобие этого (но так что то не хочет работать) ?
Код
#include <msp430x20x3.h>
#define V_REF 1200ul // опора в мВ
#define MAX_SCALE 0xffff // вся шкала АЦП
#define V_10 590 // V10 в мВ
#define V_9 531 // V9 в мВ
#define V_8 472 // V8 в мВ
#define V_7 413 // V7 в мВ
#define V_6 354 // V6 в мВ
#define V_5 295 // V5 в мВ
#define V_4 236 // V4 в мВ
#define V_3 177 // V3 в мВ
#define V_2 118 // V2 в мВ
#define V_1 59 // V1 в мВ
#define V_0 0 // V0 в мВ
#define CODE(v) (V_REF * v / MAX_SCALE)// макросы пересчета мВ в код АЦП
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction
SD16CTL = SD16REFON + SD16SSEL_1; // 1.2V ref, SMCLK
SD16INCTL0 = SD16INCH_1; // A1+/-
SD16CCTL0 = SD16UNI + SD16IE; // 256OSR, unipolar, interrupt enable
SD16AE = SD16AE2; // P1.1 A1+, A1- = VSS
SD16CCTL0 |= SD16SC; // Set bit to start conversion
_BIS_SR(LPM0_bits + GIE);
}
#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
if (SD16MEM0 < CODE(V_6)) P1OUT &= ~0x01;
else
P1OUT |= 0x01;
/* P1OUT|= 0x08 + 0x10+0x40 + 0x80;
P2OUT|= 0x80;
if (CODE(V_8)< SD16MEM0 < CODE(V_9))
P1OUT|= 0x04 + 0x08 + 0x10 + 0x20 + 0x80;
P2OUT|= 0x80;
if (CODE(V_7)< SD16MEM0 < CODE(V_8))
P1OUT|= 0x04 + 0x08 + 0x10 + 0x20 + 0x40 + 0x80;;
P2OUT|= 0x80;
if (CODE(V_6)< SD16MEM0 < CODE(V_7))
P1OUT|= 0x04 + 0x08 + 0x10 + 0x80;
if (CODE(V_5)< SD16MEM0 < CODE(V_6))
P1OUT|= 0x04 + 0x10 + 0x20 + 0x40 + 0x80;
P2OUT|= 0x80;
if (CODE(V_4)< SD16MEM0 < CODE(V_5))
P1OUT|= 0x04 + 0x10 + 0x20 + 0x80;
P2OUT|= 0x80;
if (CODE(V_3)< SD16MEM0 < CODE(V_4))
P1OUT|= 0x08 + 0x10+0x80;
P2OUT|= 0x80;
if (CODE(V_2)< SD16MEM0 < CODE(V_3))
P1OUT|= 0x04 + 0x08 + 0x10 + 0x20;
P2OUT|= 0x80;
if (CODE(V_1)< SD16MEM0 < CODE(V_2))
P1OUT|= 0x04 + 0x08 + 0x20 + 0x40;
P2OUT|= 0x80;
if (CODE(V_0)< SD16MEM0 < CODE(V_1))
P1OUT|= 0x08 + 0x10;
if (SD16MEM0 < CODE(V_0))
P1OUT|= 0x04 + 0x08 + 0x10 + 0x20 + 0x40 + 0x80;
P2OUT|= 0x80; */
_BIC_SR_IRQ(LPM0_bits); // Exit LPM0
}
}
в if (SD16MEM0 < CODE(V_6)) P1OUT &= ~0x01;
else
P1OUT |= 0x01; светодиод горит даже при отсутствии напряжения хотя елси вместо CODE(V_6) написать 0x7FFF //SD16MEM0 > 0.3V?, clears IFG то покра немерее яркость светодида меняется при изменении напряжения (почти выключается)
Сообщение отредактировал chainikru - Apr 10 2012, 10:07