el código ADC no funcionará como estaba previsto

0

He podido encontrar el código a continuación, tratando de medir los voltajes de tres canales usando el método de interrupción. Si bien el código se ejecuta sin errores de aby, todavía no puedo mostrar nada en el lcd después de haber medido. No soy un profesional en cosas avr, solo comencé hace unos meses. Cualquier ayuda es muy apreciada '

ISR(ADC_vect)                                   //selecting between multiple adc channels
{
    char buffer[10];
    uint8_t theLow = ADCL;
    uint16_t theTenBitResult = ADCH<<8 | theLow;

    switch(ADMUX)
    {
        case 0x20:
        //calculate temperature
        temperature = ((theTenBitResult) * 1024/5);
        _delay_ms(10);
        ADMUX = 0x21;
        break;

        case 0x21:
        //calculate and print voltage
        voltage  = ((theTenBitResult * 1024/5) * (1324675/324675));         //1M plus 300k voltage divider resistor values
        dtostrf(voltage, 5, 2, buffer);
        //sprintf(buffer, "%f", voltage);                           //as lcd library does not include int and float conversion to string is necessary
        lcd_gotoxy(11,0);
        lcd_puts(buffer);
        _delay_ms(10);
        ADMUX = 0x22;
        break;

        case 0x22:
        //calculate and print current
        current = ((theTenBitResult * 1024/5) * 1.5);                       //1.5 is the maximum current range expected
        lcd_gotoxy(11,1);
        sprintf(buffer, "%f", current);
        lcd_puts(buffer);
        _delay_ms(10);
        ADMUX = 0x20;
        break;

        default:
        //don,t expect any value here
        break;
    } ;
        ADCSRA |= 1<<ADSC;
}'
    
pregunta Brian Asembo

1 respuesta

1
  1. no es una buena práctica poner tanto en una ISR.
  2. no es una buena práctica colocar las mismas rutinas en el isr, así como fuera del isr.
  3. reinicia el adc al principio de la isr para ahorrar algo de tiempo.
respondido por el dannyf

Lea otras preguntas en las etiquetas