По умолчанию, результат АЦП 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);
}
}
}