Home
Accesso / Registrazione
 di 

firmware msp430f2274

1 risposta [Ultimo post]
ritratto di reflex19
Offline
Titolo: User
Utente
Ultima visita:
1 anno 31 settimane fa
Utente dal: 08/05/2012
Messaggi: 8

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:

#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

AndreaPasto (non verificato)
ritratto di AndreaPasto
A prima vista mi sembra ok,

A prima vista mi sembra ok, anche se non ho potuto dedicarci molto tempo in questo momento. Prova ad entrare in simulazione, step by step con il tool della Iar oppure con un simulatore qualsiasi per c.

 

 

Visita il sito EOS-Book con centinaia di progetti ed articoli!

Visita il nuovo sito di EOS-Book
Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 25 utenti e 64 visitatori collegati.

Ultimi Commenti