Учебник 6
Аналогово-цифровой преобразователь

АЦП в MCU Java source

По умолчанию, результат АЦП 10-битный (2 байта). Метод setOneByteResult(boolean oneByteResult) устанавливает 8-битный (1 байт) результат. Метод getValue() возвращает 10- или 8-битный результат в зависимости от того, установлен ли 8-битный результат. Количество бит результата определяется во время компиляции, значит, вызов setOneByteResult(true) должен быть расположен в исходнике раньше, чем первое обращение к getValue()

Чтобы проверить, происходит ли преобразование, вызвите метод isBusy() Чтобы начать преобразование, вызвите setBusy(true) Код setBusy(false) ничего не делает и никогда не используется.

Вольтметр

Каждую секунду меряет напряжение на выводе ADC0 (PC0 для ATmega8) и посылает результат в UART как строку. Ничего не принимает, приемник выключен, метод getInputStream никогда не вызывается.

import mcujavasource.mcu.*;
import mcujavasource.mcu.io.*;

/** Учебник 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);
    }
  }
  
}

Скачать файл исходного кода программы