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