firmware msp430f2274
Ciao a tutti,
ho realizzato un circuitino cosi fatto: 8 fotodiodi collegati ad un micro msp430f2274 a sua volta collegato a 8 led. L'obiettivo è accendere i led confrontando la tensione su ogni canale del micro con una soglia fissata. Ho quindi realizzato un programma in c e programmato la scheda con il software IAR Embedded Workbench tramite USB ez430f2013. Il problema è che qualsiasi modifica faccia mi si accendono tutti iled simultanemante (anche provando ad accenderne solo 1 con il semplice programma 'Hello World', oppure tentando di spegnerne alcuni e altri no). Non so se c'è qualcosa che sbaglio nella selezione delle porte o qualcos'altro nel codice, oppure se può essere un errore nelle impostazioni del software.
Vi posto il codice:
Spero possiate darmi una mano...grazie in anticipo
ho realizzato un circuitino cosi fatto: 8 fotodiodi collegati ad un micro msp430f2274 a sua volta collegato a 8 led. L'obiettivo è accendere i led confrontando la tensione su ogni canale del micro con una soglia fissata. Ho quindi realizzato un programma in c e programmato la scheda con il software IAR Embedded Workbench tramite USB ez430f2013. Il problema è che qualsiasi modifica faccia mi si accendono tutti iled simultanemante (anche provando ad accenderne solo 1 con il semplice programma 'Hello World', oppure tentando di spegnerne alcuni e altri no). Non so se c'è qualcosa che sbaglio nella selezione delle porte o qualcos'altro nel codice, oppure se può essere un errore nelle impostazioni del software.
Vi posto il codice:
- Codice: Seleziona tutto
#include "msp430f2274.h"
void main( void )
{
P4DIR=0x00; // reset delle porte
P2DIR=0x00;
P3DIR=0x00;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10 ON, interrupt enable
ADC10AE0=0xFF; // seleziona A0/1/2/3/4/5/6/7 come ingressi dell'ADC
P4DIR |=0xFF; // imposta P4.0/1/2/3/4/5/6/7 come uscite
for (;;)
{
ADC10CTL1 = INCH_6; // seleziona il canale da campionare (A.6----->P4.0)
ADC10CTL0 |= ENC + ADC10SC; // campiona e inizia la conversione
__bis_SR_register(CPUOFF + GIE); //LPM0 , ADC10_ISR will force exit
ADC10MEM = INCH_6; // copia nel registro ADC10MEM il valore sul canale A.6
float VAL1 = ADC10MEM; // copia in VAL1 il contenuto del registro
ADC10CTL1 = INCH_7;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_7;
float VAL2 = ADC10MEM;
ADC10CTL1 = INCH_5;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_5;
float VAL3 = ADC10MEM;
ADC10CTL1 = INCH_2;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_2;
float VAL4 = ADC10MEM;
ADC10CTL1 = INCH_1;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_1;
float VAL5 = ADC10MEM;
ADC10CTL1 = INCH_0;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_0;
float VAL6 = ADC10MEM;
ADC10CTL1 = INCH_3;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_3;
float VAL7 = ADC10MEM;
ADC10CTL1 = INCH_4;
ADC10CTL0 |= ENC + ADC10SC;
__bis_SR_register(CPUOFF + GIE);
ADC10MEM = INCH_4;
float VAL8 = ADC10MEM;
ADC10CTL0 &= ENC; // ferma il campionamento
if (VAL1 < 0x1FF)
P4OUT &= ~0x01;
else
P4OUT ^= 0x01;
if (VAL2 < 0x1FF)
P4OUT &= ~0x02;
else
P4OUT ^= 0x02;
if (VAL3 < 0x1FF)
P4OUT &= ~0x04;
else
P4OUT ^= 0x04;
if (VAL4 < 0x1FF)
P4OUT &= ~0x08;
else
P4OUT ^= 0x08;
if (VAL5 < 0x1FF)
P4OUT &= ~0x10;
else
P4OUT ^= 0x10;
if (VAL6 < 0x1FF)
P4OUT &= ~0x20;
else
P4OUT ^= 0x20;
if (VAL7 < 0x1FF)
P4OUT &= ~0x40;
else
P4OUT ^= 0x40;
if (VAL8 < 0x1FF)
P4OUT &= ~0x80;
else
P4OUT ^= 0x80;
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void);
{
__bic_SR_register_on_exit(CPUOFF);
}
}
Spero possiate darmi una mano...grazie in anticipo