¿Cómo cambiar la lectura de un ADC de 10 bits a los registros del temporizador 0 usando un PIC18f4550?

0

Estoy leyendo un valor anlogue usando el ADC de 10 bits del canal 0. He implementado una interrupción usando el temporizador 0, donde establezco algún valor para los registros del temporizador 0 (TMR0H y TMR0L - 8 bits) y espero el exceso de flujo.

Con referencia a la pregunta, quiero usar la lectura de 10 bits del ADC para los registros de 2 8 bits del temporizador 0. Se me ocurrió la idea de multiplicar la lectura del ADC por 64 (aproximadamente 16 bits de lectura) , luego algunos de cómo transferir ese valor a TMR0H y TMR0L. Sé que al hacer la multiplicación estoy perdiendo algunos datos.

No he encontrado una manera de lograr el cambio entre el registro de 16 bits a los registros de 2 8 bits. Intenté usar el enmascaramiento de bits con los operadores de cambio.

void interrupt ISR(){
    //Check if it is TMR0 Overflow ISR
    if(INTCONbits.TMR0IE && INTCONbits.TMR0IF){//TMR0 Overflow ISR
            if(giro){
                    if(aux && PORTD == aux){
                        PORTD = 0x01;
                    }else{
                        PORTD <<=1;
                    }
                }else{
                    if(PORTD == 0x01){
                        PORTD = aux;
                    }else{
                        PORTD >>= 1;
                        }
                }    

        TMR0H  = (auxADC && 0xFF00) >> 8;
        TMR0L  = auxADC && 0xFF;
        INTCONbits.TMR0IF = 0;
    }
}

No hay problemas para compilar el código, pero cuando se depura el código con el pickit 3, los valores de TMR0H y TMR0L no cambian correctamente, no se actualizan con la parte alta y baja de auxADC.

¡Muchas gracias!

    
pregunta Mac

1 respuesta

2
  

Sé que al hacer la multiplicación estoy perdiendo algunos datos.

Multiplicar su resultado ADC de 10 bits (almacenado en una variable de 16 bits) por 64 no le hará perder datos, ya que el resultado se ajusta a 16 bits (registro TMR0)

Y para responder tu pregunta principal: usaste lógicas y && en lugar de bitwise y &

TMR0H  = (auxADC & 0xFF00) >> 8;
TMR0L  = auxADC & 0xFF;
    
respondido por el Julien

Lea otras preguntas en las etiquetas