Tutorial 6
Analog to digital converter

ADC in MCU Java source

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.

Voltmeter

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);
    }
  }
  
}

Download java source file