Ser60 писал(а):У меня есть таком МК на работе. Я завтра принесу домой, тогда продолжим.
Пойду я тоже спать.
Ser60 писал(а):У меня есть таком МК на работе. Я завтра принесу домой, тогда продолжим.
Код: Выделить всё
#include <msp430g2452.h>
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void); // function prototypes
void Ports_init(void);
void TimerA_init(void);
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // disable watchdog
Ports_init(); // init P1 and P2
ADC_init(); // init ADC
TimerA_init(); // init TimerA
for (;;)
__low_power_mode_0(); // enter sleep mode
}//main
void TimerA_init(void)
{
TACCR0 = 3125; // ADC trigger period ~22 мсек
TACCTL0 = OUTMOD_4; // toggle OUT0 to trigger ADC
TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK/8, up mode, start
}
void Ports_init(void)
{
P1DIR = 0xFF; // configure port for output
P1OUT = 0; // init port
P2DIR = 0xFF; // configure port for output
P2SEL = 0; // I/O on XTAL pins
P2OUT = 0; // init port
}
void ADC_init(void)
{
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // 16 clocks sample-and-hold
ADC10CTL1 = SHS_2 + CONSEQ_2; // trigger by TA0
ADC10AE0 = BIT0; // set ADC channel 0
ADC10CTL0 |= ENC; // enable conversion
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR (void) // ADC10 ISR
{
float volts = ADC10MEM * 0.0032258; // convert ADC into volts
char led1 = 0; // PORT1 leds stati
char led2 = 0; // PORT2 leds stati
if (volts >= 1.2) led1 |= BIT2; // new led states
if (volts >= 1.36) led1 |= BIT3;
if (volts >= 1.52) led1 |= BIT4;
if (volts >= 1.69) led1 |= BIT5;
if (volts >= 1.85) led2 |= BIT0;
if (volts >= 2.01) led2 |= BIT1;
if (volts >= 2.17) led2 |= BIT2;
if (volts >= 2.33) led2 |= BIT3;
if (volts >= 2.5) led2 |= BIT4;
if (volts >= 2.67) led2 |= BIT5;
if (volts >= 2.82) led1 |= BIT6;
if (volts >= 2.99) led1 |= BIT7;
if (volts >= 3.15) led2 |= BIT7;
if (volts >= 3.25) led2 |= BIT6;
P1OUT = led1; // copy led states to ports
P2OUT = led2;
}
Код: Выделить всё
#include <msp430g2452.h>
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void); // function prototypes
void Ports_init(void);
void TimerA_init(void);
int volts =0;
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // disable watchdog
Ports_init(); // init P1 and P2
ADC_init(); // init ADC
TimerA_init(); // init TimerA
for (;;)
__low_power_mode_0(); // enter sleep mode
}//main
void TimerA_init(void)
{
TACCR0 = 3125; // ADC trigger period ~22 мсек
TACCTL0 = OUTMOD_4; // toggle OUT0 to trigger ADC
TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK/8, up mode, start
}
void Ports_init(void)
{
P1DIR = 0xFF; // configure port for output
P1OUT = 0; // init port
P2DIR = 0xFF; // configure port for output
P2SEL = 0; // I/O on XTAL pins
P2OUT = 0; // init port
}
void ADC_init(void)
{
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE; // 16 clocks sample-and-hold
ADC10CTL1 = SHS_2 + CONSEQ_2; // trigger by TA0
ADC10AE0 = BIT0; // set ADC channel 0
ADC10CTL0 |= ENC; // enable conversion
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR (void) // ADC10 ISR
{
int volts = ADC10MEM; // convert ADC into volts
char led1 = 0; // PORT1 leds stati
char led2 = 0; // PORT2 leds stati
if (volts >= 60) led1 |= BIT2; // new led states
if (volts >= 132) led1 |= BIT3;
if (volts >= 204) led1 |= BIT4;
if (volts >= 276) led1 |= BIT5;
if (volts >= 348) led2 |= BIT0;
if (volts >= 420) led2 |= BIT1;
if (volts >= 492) led2 |= BIT2;
if (volts >= 564) led2 |= BIT3;
if (volts >= 636) led2 |= BIT4;
if (volts >= 708) led2 |= BIT5;
if (volts >= 280) led1 |= BIT6;
if (volts >= 852) led1 |= BIT7;
if (volts >= 924) led2 |= BIT7;
if (volts >= 996) led2 |= BIT6;
P1OUT = led1; // copy led states to ports
P2OUT = led2;
}
Код: Выделить всё
#include <msp430g2452.h>
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void); // function prototypes
void Ports_init(void);
void TimerA_init(void);
int volts =0;
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // disable watchdog
Ports_init(); // init P1 and P2
ADC_init(); // init ADC
TimerA_init(); // init TimerA
for (;;)
__low_power_mode_0(); // enter sleep mode
}//main
void TimerA_init(void)
{
TACCR0 = 3125; // ADC trigger period ~22 мсек
TACCTL0 = OUTMOD_4; // toggle OUT0 to trigger ADC
TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK/8, up mode, start
}
void Ports_init(void)
{
P1DIR = 0xFF; // configure port for output
P1OUT = 0; // init port
P2DIR = 0xFF; // configure port for output
P2SEL = 0; // I/O on XTAL pins
P2OUT = 0; // init port
}
void ADC_init(void)
{
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE; // 16 clocks sample-and-hold
ADC10CTL1 = SHS_2 + CONSEQ_2; // trigger by TA0
ADC10AE0 = BIT0; // set ADC channel 0
ADC10CTL0 |= ENC; // enable conversion
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR (void) // ADC10 ISR
{
int volts = ADC10MEM; // convert ADC into volts
char led1 = 0; // PORT1 leds stati
char led2 = 0; // PORT2 leds stati
if (volts >= 60) led1 |= BIT2; // new led states
if (volts >= 132) led1 |= BIT3;
if (volts >= 204) led1 |= BIT4;
if (volts >= 276) led1 |= BIT5;
if (volts >= 348) led2 |= BIT0;
if (volts >= 420) led2 |= BIT1;
if (volts >= 492) led2 |= BIT2;
if (volts >= 564) led2 |= BIT3;
if (volts >= 636) led2 |= BIT4;
if (volts >= 708) led2 |= BIT5;
if (volts >= 780) led1 |= BIT6;
if (volts >= 852) led1 |= BIT7;
if (volts >= 924) led2 |= BIT6;
if (volts >= 996) led2 |= BIT7;
P1OUT = led1; // copy led states to ports
P2OUT = led2;
}
Ser60 писал(а):Поздравляю! А как Вы хотели задействовать ногу 3 МК?
Ser60 писал(а):Если это для (переносной) рации, почему просто не индицировать частоту на ЖКИ?
Ser60 писал(а):В простейшем случае можно усреднять показания АЦП в кольцевом буфере. Скажем, 4 последних показания. Это существенно уменьшит дребезг. Погуглите на алгоритмы скользящего среднего.
Ser60 писал(а):Надо завести буфер для хранения показаний и переменную где будет храниться индех самого старого элемента (в начале 0). При получении нового значения от АЦП помещать его в буфер по этому индексу и увеличивать индех в
циклическом порядке. Считать сумму элементов в буфере и делить ее на длину буфера.
Код: Выделить всё
int i= 0 ;
int summa = 0;
int A[10];
{
for (i = 0; i < 10; i++)
{
A[i] = ADC10MEM;
summa += A[i];
}
volts = summa / 10;
Код: Выделить всё
int i= 0 ;
int summa = 0;
int A[8];
----------
summa = summa - A[i] + ADC10MEM;
A[i] = ADC10MEM;
i++;
if (i == 9) i=0;
int adcAverage = summa >> 3;
Код: Выделить всё
{
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE; // 16 clocks sample-and-hold
ADC10CTL1 = SHS_2 + CONSEQ_2; // trigger by TA0
ADC10AE0 = BIT0; // set ADC channel 0
ADC10CTL0 |= ENC; // enable conversion
}Код: Выделить всё
summa = summa - A[i] + ADC10MEM;
A[i] = ADC10MEM;
i++;
if (i == 9) i=0;
int adcAverage = summa >> 3;
volts = adcAverage;