Commit eb1c6306 authored by jp7g21's avatar jp7g21
Browse files

Merge remote-tracking branch 'refs/remotes/origin/master'

parents 8155f8e8 a40ea098
#include "buttons.hpp"
#include "uart.hpp"
#include "time.hpp"
#include <avr/io.h>
static bool lastStateA = false;
static bool lastStateB = false;
static uint32_t lastMillisA = 0;
static uint32_t lastMillisB = 0;
void initButtons()
{
DDRC &= ~(1 << DDC5) & ~(1 << DDC4); // set PC5 and PC4 as inputs
PORTC |= (1 << PORTC5) | (1 << PORTC4); // enable pullups
}
void updateButtons()
{
uint32_t currMillis = getCurrentMillis();
bool currStateA = (PINC & (1 << PINC5));
bool currStateB = (PINC & (1 << PINC4));
if (currStateA != lastStateA)
{
lastStateA = currStateA;
if (!currStateA && (currMillis - lastMillisA) > 50)
writeUart('a');
lastMillisA = currMillis;
}
if (currStateB != lastStateB)
{
lastStateB = currStateB;
if (!currStateB && (currMillis - lastMillisB) > 50)
writeUart('b');
lastMillisB = currMillis;
}
}
#ifndef BUTTONS_H
#define BUTTONS_H
/**
* Initialises the button logic.
*/
void initButtons();
/**
* Updates the button logic.
* Should be called periodically.
*/
void updateButtons();
#endif /* BUTTONS_H */
#include <util/delay.h>
#include <avr/io.h>
// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80
// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00
// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
#define RS_lo() PORTD &= ~(1 << PORTD2)
#define RS_hi() PORTD |= (1 << PORTD2)
#define EN_lo() PORTD &= ~(1 << PORTD3)
#define EN_hi() PORTD |= (1 << PORTD3)
void send(uint8_t value)
{
PORTD &= 0x0F;
PORTB &= 0xF0;
PORTD |= value & 0xF0;
PORTB |= value & 0x0F;
EN_hi();
_delay_us(1);
EN_lo();
_delay_us(50);
}
void command(uint8_t value)
{
RS_lo();
send(value);
}
void writeDisplay(uint8_t value)
{
RS_hi();
send(value);
}
void clearDisplay()
{
command(LCD_CLEARDISPLAY);
_delay_us(2000);
}
void initDisplay()
{
DDRD |= 0xF0 | (1 << DDD3) | (1 << DDD2);
DDRB |= 0x0F;
uint8_t _displayfunction = LCD_8BITMODE | LCD_2LINE | LCD_1LINE | LCD_5x8DOTS;
_delay_ms(50);
RS_lo();
EN_lo();
command(LCD_FUNCTIONSET | _displayfunction);
_delay_us(4500);
command(LCD_FUNCTIONSET | _displayfunction);
_delay_us(150);
command(LCD_FUNCTIONSET | _displayfunction);
command(LCD_FUNCTIONSET | _displayfunction);
uint8_t _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
command(LCD_DISPLAYCONTROL | _displaycontrol);
clearDisplay();
uint8_t _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
command(LCD_ENTRYMODESET | _displaymode);
}
void setDisplayCursor(uint8_t col, uint8_t row)
{
row &= 1;
command(LCD_SETDDRAMADDR | (col + row * 0x40));
}
#ifndef DISPLAY_H
#define DISPLAY_H
void initDisplay();
void writeDisplay(uint8_t value);
void setDisplayCursor(uint8_t col, uint8_t row);
void clearDisplay();
#endif /* DISPLAY_H */
......@@ -21,9 +21,9 @@ struct Servo
};
static Servo servos[NUM_SERVOS] = {
{ &PORTB, &DDRB, (1 << PB2), 0, 0 },
{ &PORTB, &DDRB, (1 << PB3), 0, 0 },
{ &PORTB, &DDRB, (1 << PB4), 0, 0 }
{ &PORTC, &DDRC, (1 << PB0), 0, 0 },
{ &PORTC, &DDRC, (1 << PB1), 0, 0 },
{ &PORTC, &DDRC, (1 << PB2), 0, 0 }
};
static uint16_t orderedValues[NUM_SERVOS]; // current servo values in ascending order
......
......@@ -12,7 +12,6 @@ void initUart()
UCSR0A = (1 << U2X0); // double transmission speed
UCSR0B = (1 << RXCIE0) // enable RX complete interrupt
| (1 << UDRIE0) // enable data register empty interrupt
| (1 << RXEN0) // enable receiver
| (1 << TXEN0); // enable transmitter
UCSR0C = (0 << UMSEL01) | (0 << UMSEL00) // asynchronous USART
......@@ -25,12 +24,14 @@ void initUart()
sei();
}
ISR(USART_RX_vect)
void writeUart(uint8_t value)
{
uart_add_ch(UDR0);
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = value;
}
ISR(USART_UDRE_vect)
ISR(USART_RX_vect)
{
// nothing to do right now
uart_add_ch(UDR0);
}
#ifndef UART_H
#define UART_H
#include <stdint.h>
/**
* Initialises the UART logic.
*/
void initUart();
/**
* Writes a character to the UART port.
*/
void writeUart(uint8_t value);
#endif /* UART_H */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment