comunicación USART con PIC16F688

0

Estoy intentando hacer mi foto para enviar el valor del potenciómetro (en PICKIT 1) a través de la serie. En este paso, estoy usando un osciloscopio para ver si está funcionando bien.

Escribí el siguiente código, pero no se cambia nada en la pantalla de alcance cuando muevo el medidor de potes. ¿Puedes echar un vistazo por favor?

void delay_ms(uns16 millisec)
{
        char next=0;
        OPTION=2;
        TMR0=1;
        do {next+=125; while(TMR0!=next);}
        while(--millisec!=0);
}     

void main()
 {
     char byte;
     int state = 1;
     uns16 y=255;
     TRISA=0b11000010; //RA1 is input
     ANSEL=0b00000001; //analogue input ANO
     CMCON0=7; //to switch off the comparator
     TRISC.4=1; //USART will automatically configure input-output.
     ADCON1=0b00010000; //Fosc/32
     ADCON0=0b00000001; //reference voltage VDD
     SPBRG=32; // the nearest int to achieve 9600 baud for 20MHZ
     BRG16 =0; //8 bit generator.
     BRGH=0; //recommended to be set to reduce baud rate error. clear is better.
     SYNC=0;// select asychronous
     SPEN=1;//serial port enable
     ADCON0=0;   //ANO selected
     ADFM=0;     //Left justified
     ADCON0.0=1; //Enable conversion
     TXEN=1; //Enable transmission
     //delay_ms(y); //wait while he's converting

    ADCON0.1=1;  //GO but turned on.

    while (1)
    {
    byte=ADRESH;
    TXREG=byte;
    delay_ms(100); //a short delay
    }
} 
    
pregunta Sean87

1 respuesta

3

Está habilitando el bit "GO", que realiza una conversión del ADC.

Una vez que se completa la conversión, el bit "GO" se desactiva y el ADC no hace nada más hasta que se vuelve a activar el bit "GO".

Deberías tener algo más como esto:

while (1)
{
    ADCON0.1=1;
    while(ADCON0.1==1);
    byte=ADRESH;
    TXREG=byte;
}

O, un mejor formato (dependiente del compilador):

while (1)
{
    ADCON0bits.GO=1;
    while(ADCON0bits.GO==1);
    byte=ADRESH;
    TXREG=byte;
}

Y aún mejor: compruebe si ha cambiado y solo envíe si tiene:

unsigned char byte,old;

... setup code ...

while (1)
{
    ADCON0bits.GO=1;
    while(ADCON0bits.GO==1);
    byte=ADRESH;
    if(byte!=old)
    {
        old=byte;
        TXREG=byte;
    }
}

Y realmente deberías comprobar si el búfer de transmisión está listo para recibir un nuevo byte:

unsigned char byte,old;

... setup code ...

while (1)
{
    ADCON0bits.GO=1;
    while(ADCON0bits.GO==1);
    byte=ADRESH;
    if(byte!=old)
    {
        old=byte;
        while(TCSTAbits.TRMT==0);
        TXREG=byte;
    }
}

Por supuesto, acabo de juntar este código en el navegador aquí, así que no lo he probado, pero debería darte una idea.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas