/* * uart_echo.c * * Created: 16.08.2018 17:39:49 * Author : jens */ #include #include #include #include #include #define ARDUINO_NANO #ifdef ARDUINO_NANO #define F_CPU (16000000UL) // MHz #else #define F_CPU (18432000UL) // MHz #endif #define USART_BAUDRATE 9600UL #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) #define TIMER_RELOAD (0xFFFF-(F_CPU/1024/4-1)) static uint8_t rx_data; static uint8_t count = 0; volatile uint8_t msgCode = 0; static uint8_t msgData = 0; static uint8_t ledState = 0; static int16_t adc_value[16]; static size_t adc_ch = 0; enum MessageCode { NOP=0, Command, Timer, AdcComplete, Error = 0xFF }; typedef struct _sMsg_t { uint8_t code; uint8_t data; } Msg_t; typedef struct _sFifo { void **ppData; size_t capacity; size_t itemSize; size_t fill; size_t wi; size_t ri; const char *pName; } Fifo; static Fifo messageFifo; 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; } void Fifo_push(Fifo *pObj, void *pItem) { if (pObj->fill >= pObj->capacity) { printf("%s: Fifo is full\n", pObj->pName); return; } memcpy(pObj->ppData[pObj->wi], pItem, pObj->itemSize); pObj->wi++; pObj->fill++; if (pObj->wi == pObj->capacity) { pObj->wi = 0; } } 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; } ISR(ADC_vect) { int16_t value_low = (int16_t)ADCL; int16_t value_high = (int16_t)ADCH; ADCSRA |= (1< 1)) { Msg_t msg = {AdcComplete, adc_ch}; Fifo_push(&messageFifo, &msg); } adc_value[adc_ch] = value; adc_ch++; if (adc_ch == 16) { adc_ch = 0; } adc_start_conversion(adc_ch); } ISR(USART_RX_vect) { rx_data = UDR0; msgCode = NOP; if (rx_data == ' ') { msgCode = Error; } else if (rx_data >= '0' && rx_data <= '9') { Msg_t msg = {Command, rx_data}; Fifo_push(&messageFifo, &msg); } count++; } ISR (TIMER1_OVF_vect) // Timer1 ISR { Msg_t msg = {Timer, ledState}; Fifo_push(&messageFifo, &msg); TCNT1 = TIMER_RELOAD; ledState++; if (ledState == 4) { ledState = 0; } } void uart_init() { // Set baud rate UBRR0L = (uint8_t)BAUD_PRESCALE; UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); // Enable receiver and transmitter UCSR0B = (1<