import mcujavasource.mcu.*; import mcujavasource.mcu.io.*; /** Tutorial 5: UART with LEDs and buttons. * When button is pressed, sends message to UART. * Receives control chars from UART. * Control chars: {led number (1 or 2)}{state (1=on, 0=off)} * Examples: 11 - turn on led1, 20 - turn off led2, 21 - turn on led2 * Button is connected to GND and MCU INT0 pin (PD2 for ATmega8). * LED's anode is connected to +5V through 330 Ohm resistor, * cathode - to MCU port. * 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 Tutorial5 extends Microcontroller { /** Specifies delay. * 197 at 1 MHz, 22 at 4 MHz (60 ms). * 0 at 8 MHz (32 ms). * Note: at 8 MHz it's impossible to get 60 ms, delay will be 32 ms. */ private static final int BUTTON_TIMER_INITIAL_VALUE = 197; private static final String POWER_ON = "Power on.\r\n"; private static final String BUTTON_PRESSED = "Button pressed.\r\n"; private static final String LED_STRING = "LED"; private static final String WAS_TURNED = " was turned "; private static final String ON_STRING = "on.\r\n"; private static final String OFF_STRING = "off.\r\n"; private UartInputStream uartInput; private UartOutputStream uartOutput; /** Pin of the first LED, PB1 */ private final Pin led1 = getHardware().getPort("B").getPin(1); /** Pin of the second LED, PB0 */ private final Pin led2 = getHardware().getPort("B").getPin(0); private ExternalInterrupt buttonInterrupt; private Timer buttonTimer; private volatile boolean buttonPressed = false; private volatile boolean buttonPressedTransmitted = true; public void init() { //register initialization on startup getHardware().setAllPortsDirection(Pin.IN); getHardware().setAllPortsPullUp(true); led1.setDirection(Pin.OUT); // leds are initially turned on led1.setOutput(Pin.LOW); led2.setDirection(Pin.OUT); led2.setOutput(Pin.LOW); // button external interrupt buttonInterrupt = getHardware().getExternalInterrupt(0); buttonInterrupt.setEdge(InterruptEdge.FALLING); ButtonListener bl = new ButtonListener(); buttonInterrupt.addExternalInterruptListener(bl); buttonInterrupt.setInterruptRequestFired(true); // button timer buttonTimer = getHardware().getDefaultTimer(8); buttonTimer.setMode(TimerMode.NORMAL); buttonTimer.setPrescaling(1024); buttonTimer.setEnabled(false); ButtonTimerListener btl = new ButtonTimerListener(); buttonTimer.addTimerListener(btl); buttonTimer.setTimerOverflowedFired(true); // UART Uart uart = getHardware().getDefaultUart(); uart.init(25, true, 8, Uart.Parity.NONE, false); uartInput = uart.getInputStream(); uartOutput = uart.getOutputStream(); } public void start() { //main program getHardware().setInterruptsEnabled(true); uartOutput.write(POWER_ON); while(true) { if(!buttonPressedTransmitted) { uartOutput.write(BUTTON_PRESSED); buttonPressedTransmitted = true; } if(uartInput.available() >= 2) { char led = (char) uartInput.read(); if(led == '1' || led == '2') { char state = (char) uartInput.read(); uartOutput.write(LED_STRING); uartOutput.write(led); uartOutput.write(WAS_TURNED); if(state == '0') { if(led == '1') { led1.setOutput(Pin.HIGH); } else { led2.setOutput(Pin.HIGH); } uartOutput.write(OFF_STRING); } else { if(led == '1') { led1.setOutput(Pin.LOW); } else { led2.setOutput(Pin.LOW); } uartOutput.write(ON_STRING); } } } } } private class ButtonListener implements ExternalInterruptListener { public void interruptRequested() { if(!buttonPressed) { buttonPressed = true; buttonPressedTransmitted = false; buttonTimer.setValue(BUTTON_TIMER_INITIAL_VALUE); // timer delay start buttonTimer.setEnabled(true); } } } private class ButtonTimerListener implements TimerListener { public void timerOverflowed() { buttonPressed = false; //stopping timer buttonTimer.setEnabled(false); } } }