diff --git a/Control/firmware/uart_echo/adc.c b/Control/firmware/uart_echo/adc.c new file mode 100644 index 0000000..365acc5 --- /dev/null +++ b/Control/firmware/uart_echo/adc.c @@ -0,0 +1,27 @@ +/* + * adc.c + * + * Created: 20.02.2019 20:46:32 + * Author: jens + */ + +#include +#include "adc.h" + +void adc_init() +{ + PRR &= ~(1 << PRADC); + ADCSRA |= (1 << ADEN) | 7; +} + +void adc_start_conversion(int ch) +{ + ADMUX = (ADMUX & 0xF0) | (ch & 0x0F) | (1 << REFS0); + ADCSRA |= (1 << ADSC) | (1 << ADIE); +} + +int adc_is_fininshed() +{ + return (int)(0 == (ADCSRA & (1 << ADSC))); +} + diff --git a/Control/firmware/uart_echo/adc.h b/Control/firmware/uart_echo/adc.h new file mode 100644 index 0000000..3f00adc --- /dev/null +++ b/Control/firmware/uart_echo/adc.h @@ -0,0 +1,16 @@ +/* + * adc.h + * + * Created: 20.02.2019 20:46:44 + * Author: jens + */ + + +#ifndef ADC_H_ +#define ADC_H_ + +void adc_init(); +void adc_start_conversion(int ch); +int adc_is_fininshed(); + +#endif /* ADC_H_ */ \ No newline at end of file diff --git a/Control/firmware/uart_echo/fifo.c b/Control/firmware/uart_echo/fifo.c new file mode 100644 index 0000000..58f183a --- /dev/null +++ b/Control/firmware/uart_echo/fifo.c @@ -0,0 +1,73 @@ +/* + * fifo.c + * + * Created: 20.02.2019 20:33:06 + * Author: jens + */ + +#include "fifo.h" + +void fifo_init(Fifo *pObj, size_t capacity, size_t itemSize, const char *pName) +{ + pObj->wi = 0; + pObj->ri = 0; + pObj->fill = 0; + pObj->capacity = capacity; + pObj->itemSize = itemSize; + pObj->ppData = (void**)malloc(capacity); + + for (int i=0; i < capacity; i++) + { + pObj->ppData[i] = (void*)malloc(itemSize); + } + pObj->pName = pName; +} + +void fifo_free(Fifo *pObj) +{ + for (int i=0; i < pObj->capacity; i++) + { + free(pObj->ppData[i]); + } + free (pObj->ppData); + pObj->itemSize = 0; + pObj->capacity = 0; +} + +int fifo_push(Fifo *pObj, void *pItem) +{ + if (pObj->fill >= pObj->capacity) + { + return 0; + } + memcpy(pObj->ppData[pObj->wi], pItem, pObj->itemSize); + pObj->wi++; + pObj->fill++; + if (pObj->wi == pObj->capacity) + { + pObj->wi = 0; + } + return 1; +} + +int fifo_pop(Fifo *pObj, void *pItem) +{ + if (!pObj->fill) + { + return 0; + } + memcpy(pItem, pObj->ppData[pObj->ri], pObj->itemSize); + pObj->ri++; + pObj->fill--; + if (pObj->ri == pObj->capacity) + { + pObj->ri = 0; + } + return 1; +} + +int fifo_isEmpty(Fifo *pObj) +{ + return pObj->fill == 0; +} + diff --git a/Control/firmware/uart_echo/fifo.h b/Control/firmware/uart_echo/fifo.h new file mode 100644 index 0000000..eff8f77 --- /dev/null +++ b/Control/firmware/uart_echo/fifo.h @@ -0,0 +1,32 @@ +/* + * fifo.h + * + * Created: 20.02.2019 20:35:48 + * Author: jens + */ + + +#ifndef FIFO_H_ +#define FIFO_H_ + +#include +#include + +typedef struct _sFifo +{ + void **ppData; + size_t capacity; + size_t itemSize; + size_t fill; + size_t wi; + size_t ri; + const char *pName; +} Fifo; + +void fifo_init(Fifo *pObj, size_t capacity, size_t itemSize, const char *pName); +void fifo_free(Fifo *pObj); +int fifo_push(Fifo *pObj, void *pItem); +int fifo_pop(Fifo *pObj, void *pItem); +int fifo_isEmpty(Fifo *pObj); + +#endif /* FIFO_H_ */ \ No newline at end of file diff --git a/Control/firmware/uart_echo/i2c.c b/Control/firmware/uart_echo/i2c.c new file mode 100644 index 0000000..40d3fc7 --- /dev/null +++ b/Control/firmware/uart_echo/i2c.c @@ -0,0 +1,76 @@ +/* + * i2c.c + * + * Created: 20.02.2019 20:33:30 + * Author: jens + */ + +#include +#include +#include "i2c.h" + +void i2c_init() +{ + TWBR = 0xFF; + TWSR = 0x00; +} + +void i2c_send(uint8_t addr, uint8_t rw, uint8_t *data, size_t size) +{ + TWCR = (1< + +enum I2C +{ + I2C_START = 0x08, + I2C_REPEATED_START = 0x10, + I2C_SLA_ACK = 0x18, + I2C_SLA_NACK = 0x20, + I2C_DATA_ACK = 0x28, + I2C_DATA_NACK = 0x30, + I2C_LOST = 0x38, + I2C_READ = 0x01, + I2C_WRITE = 0x00 +}; + +void i2c_init(); +void i2c_send(uint8_t addr, uint8_t rw, uint8_t *data, size_t size); + +#endif /* I2C_H_ */ \ No newline at end of file diff --git a/Control/firmware/uart_echo/mcp42x6.c b/Control/firmware/uart_echo/mcp42x6.c new file mode 100644 index 0000000..06d4f01 --- /dev/null +++ b/Control/firmware/uart_echo/mcp42x6.c @@ -0,0 +1,26 @@ +/* + * mcp42x6.c + * + * Created: 20.02.2019 20:44:16 + * Author: jens + */ + +#include "mcp42x6.h" + +size_t MCP47x6_write_volatile_dac(uint16_t dac_value, uint8_t *buffer, size_t size) +{ + *(buffer++) = ~mask & (uint8_t)(dac_value >> 8); + *(buffer++) = (uint8_t)(dac_value >> 0); + + return 2; +} + +size_t MCP47x6_write_volatile_mem(uint16_t dac_value, uint8_t *buffer, size_t size) +{ + *(buffer++) = mask & 0x40; + dac_value <<= 4; + *(buffer++) = (uint8_t)(dac_value >> 8); + *(buffer++) = (uint8_t)(dac_value >> 0); + + return 3; +} diff --git a/Control/firmware/uart_echo/mcp42x6.h b/Control/firmware/uart_echo/mcp42x6.h new file mode 100644 index 0000000..4758e1d --- /dev/null +++ b/Control/firmware/uart_echo/mcp42x6.h @@ -0,0 +1,28 @@ +/* + * mcp42x6.h + * + * Created: 20.02.2019 20:44:33 + * Author: jens + */ + + +#ifndef MCP42X6_H_ +#define MCP42X6_H_ + +#include +#include + +enum MCP47x6_flags +{ + C0 = 0x20, + C1 = 0x40, + C2 = 0x80, + PDN0 = 0x10, + PDN1 = 0x20, + mask = 0xF0 +}; + +size_t MCP47x6_write_volatile_dac(uint16_t dac_value, uint8_t *buffer, size_t size); +size_t MCP47x6_write_volatile_mem(uint16_t dac_value, uint8_t *buffer, size_t size); + +#endif /* MCP42X6_H_ */ \ No newline at end of file diff --git a/Control/firmware/uart_echo/port.c b/Control/firmware/uart_echo/port.c new file mode 100644 index 0000000..da83c55 --- /dev/null +++ b/Control/firmware/uart_echo/port.c @@ -0,0 +1,16 @@ +/* + * port.c + * + * Created: 20.02.2019 20:54:33 + * Author: jens + */ + +#include +#include "port.h" + +void port_init() +{ + PORTB = PORTB | 0x03; + DDRB = DDB1 | DDB2; + +} diff --git a/Control/firmware/uart_echo/port.h b/Control/firmware/uart_echo/port.h new file mode 100644 index 0000000..2327ef0 --- /dev/null +++ b/Control/firmware/uart_echo/port.h @@ -0,0 +1,14 @@ +/* + * port.h + * + * Created: 20.02.2019 20:54:45 + * Author: jens + */ + + +#ifndef PORT_H_ +#define PORT_H_ + +void port_init(); + +#endif /* PORT_H_ */ \ No newline at end of file diff --git a/Control/firmware/uart_echo/timer.c b/Control/firmware/uart_echo/timer.c new file mode 100644 index 0000000..1aaa832 --- /dev/null +++ b/Control/firmware/uart_echo/timer.c @@ -0,0 +1,21 @@ +/* + * timer.c + * + * Created: 20.02.2019 20:56:18 + * Author: jens + */ + +#include +#include "timer.h" + +void timer_init(uint16_t TIMER_RELOAD) +{ + + TCNT1 = TIMER_RELOAD; + + TCCR1A = 0x00; + TCCR1B = (1< +#include +#include "uart.h" + +void uart_init(uint16_t BAUD_PRESCALE) +{ + // Set baud rate + UBRR0L = (uint8_t)BAUD_PRESCALE; + UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); + + // Enable receiver and transmitter + UCSR0B = (1<