Home Forum MICROCONTROLLORI firmware msp430f2274

Questo argomento contiene 1 risposta, ha 1 partecipante, ed è stato aggiornato da  Anonimo 2 anni, 3 mesi fa.

Stai vedendo 2 articoli - dal 1 a 2 (di 2 totali)
  • Autore
    Articoli
  • #59070

    reflex19
    Membro

    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

    #71653

    Anonimo

    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.

Stai vedendo 2 articoli - dal 1 a 2 (di 2 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.