By default, ADC conversion result is 10-bit (2 bytes). Method setOneByteResult(boolean oneByteResult)
sets result to be 8-bit (1 bytes). Method getValue()
returns 10 or 8 bit result, depending from if one byte result is set. Result bit count is determined during compilation, so setOneByteResult(true)
call must be situated in the source code before the first call of getValue()
To test if conversion is running, call isBusy()
To start conversion, call setBusy(true)
Code setBusy(false)
has no effect and is never used.
import mcujavasource.mcu.*;
import mcujavasource.mcu.io.*;
/** Tutorial 6: ADC.
* Every second voltage on ADC0 pin (PC0 for ATmega8) is measured, and result
* is sent to UART as String.
* Receives nothing, receiver is disabled, method getInputStream is never
* called.
* Uart speed = 4800 bps at 1 MHz MCU clock frequency, 38400 bps at 8 MHz.
* Uart settings: 8 bits character, no parity, one stop bit.
*/
public class Tutorial6 extends Microcontroller
{
/** Reference voltage, in mV */
private static final int REFERENCE_VOLTAGE = 5000;
private static final String POWER_ON = "Power on.\r\n";
private static final String MESSAGE_END = " V\r\n";
private UartOutputStream uartOutput;
private Adc adc;
public void init()
{ //register initialization on startup
getHardware().setAllPortsDirection(Pin.IN);
getHardware().setAllPortsPullUp(true);
// Adc
adc = getHardware().getAdc();
adc.setInput(0);
adc.setPrescaling(8);
adc.setVoltageReference(Adc.VoltageReference.AVCC);
VoltageSender voltageSender = new VoltageSender();
adc.addAdcListener(voltageSender);
adc.setConversionCompletedFired(true);
adc.setEnabled(true);
// second timer
Timer secondTimer = getHardware().getDefaultTimer(16, 1);
secondTimer.setMode(TimerMode.CTC);
secondTimer.setPrescaling(1024);
secondTimer.setEnabled(true);
TimerCompare compare = secondTimer.getOutputCompare("A");
// divide value: 976 at 1 MHz, 7812 at 8 MHz
compare.setValue(976);
SecondHandler secondHandler = new SecondHandler();
compare.addTimerCompareListener(secondHandler);
compare.setCompareMatchFired(true);
// UART
Uart uart = getHardware().getDefaultUart();
uart.init(25, true, 8, Uart.Parity.NONE, false);
uartOutput = uart.getOutputStream();
}
public void start()
{ //main program
getHardware().setInterruptsEnabled(true);
uartOutput.write(POWER_ON);
}
private void sendDigit(int a)
{ int b = a + 0x30;
uartOutput.write(b);
}
private class SecondHandler implements TimerCompareListener
{
public void compareMatched()
{ //start ADC conversion
adc.setBusy(true);
}
}
private class VoltageSender implements AdcListener
{
public void conversionCompleted()
{ int v = adc.getValue() * REFERENCE_VOLTAGE / 1024;
sendDigit(v/1000);
uartOutput.write('.');
sendDigit((v%1000) / 100);
sendDigit((v%100) / 10);
sendDigit(v%10);
uartOutput.write(MESSAGE_END);
}
}
}