Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

firmware msp430f2274

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto Utentecarloc, Foto Utenteg.schgor, Foto UtenteBrunoValente, Foto UtenteIsidoroKZ

0
voti

[1] firmware msp430f2274

Messaggioda Foto Utenterichqueen19 » 4 set 2012, 18:34

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:

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
Ultima modifica di Foto Utentesimo85 il 4 set 2012, 23:03, modificato 1 volta in totale.
Motivazione: Inserito il codice nei tag code.
Avatar utente
Foto Utenterichqueen19
0 3
 
Messaggi: 8
Iscritto il: 24 feb 2012, 19:11

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Nessuno e 64 ospiti