TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Carlos2302 en 23 de Agosto de 2017, 19:52:46

Título: Ayuda amigos.
Publicado por: Carlos2302 en 23 de Agosto de 2017, 19:52:46
Amigos y compañeros, estoy empezando a estudiar el micro MSP430G2553, y estoy en la parte del ADC, estoy creando el siguiente codigo
para hacer las practicas.
#include <msp430g2553.h>

/*
 * main.c
 * P1OUT&=~BIT0;         //apaga el LED
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    ADC10CTL1 |= INCH_0|ADC10SSEL_1|CONSEQ_1;//canal0, fuente reloj ACLK, secuencia de canales.
    ADC10CTL0 = SREF_1 | ADC10SHT_3 | REFON | ADC10IE | REF2_5V;
    ADC10AE0  |= BIT0|BIT1;  //Analog Enable
    ADC10CTL0 |= ADC10ON|ENC|ADC10SC;  /*El núcleo es habilitado, Enable conversion, Start conversion */
    //while(ADC10BUSY == 0)
    __delay_cycles(200);

    while(1){
        int temp = ADC10MEM;
        ADC10CTL0 &=~ ADC10ON;  /*Apagamos  */
        ADC10CTL0 &=~ ENC;
        //ADC10CTL0 &=~ ADC10SC;  //no es necesario ya q al terminar la conversion se pone a 0
        ADC10CTL0 |= ADC10ON|ENC|ADC10SC;
          //while(ADC10BUSY == 0)
        __delay_cycles(200);
       

        }

}
Al querer utilizar este ciclo
//while(ADC10BUSY == 0)
no me genera codigo para simular en proteus. Utilizo el Code Composer Studio 6. Mi me pueden ayudar les agradezco.
Sabemos que quiero esperar a que ADC10BUSY == 0 pero no se porque no me funciona el codigo.
No quiero utilizar la rutina de retardos pero no me queda de otra.
Título: Re:Ayuda amigos.
Publicado por: KILLERJC en 23 de Agosto de 2017, 20:12:41
Tenes un error seguramente.

Código: C
  1. #define ADC10BUSY              (0x0001)       /* ADC10 BUSY */

De este archivo ( el .h del MSP ):
http://web.eng.fiu.edu/watsonh/eel4730/Appendix/msp430g2553.h

entonces ese while queda como while( 0x1 == 0), por lo cual siempre nunca se cumpliria saltando el __delay que le sigue.

Por eso usan:

Código: C
  1. while (ADC10CTL1 & ADC10BUSY);

Donde ADC10CTL1 es el registro y hace una AND con el ADC10BUSY que es la posicion que indica el bit.
Título: Re:Ayuda amigos.
Publicado por: Carlos2302 en 23 de Agosto de 2017, 22:19:45
Gracias por tu ayudad killerjc mañana voy a probar lo que me planteas. Ahora otra pregunta como hago para apagar dos bits de un registro  al mismo tiempo por ejemplo estos dos:
ADC10CTL0 &=~ ADC10ON;  /*Apagamos  */
        ADC10CTL0 &=~ ENC;
Título: Re:Ayuda amigos.
Publicado por: KILLERJC en 23 de Agosto de 2017, 23:19:35
Asi:

Código: C
  1. ADC10CTL0 &= ~( ADC10ON | ENC );
Título: Re:Ayuda amigos.
Publicado por: Carlos2302 en 24 de Agosto de 2017, 10:59:30
Killerjc gracias amigo por responder, yo lo estaba haciendo así solo que me estaba comiendo los ().