- increased I2C bus speed

- added message Fifo

git-svn-id: http://moon:8086/svn/projects/HendiControl@12 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
2019-02-18 19:27:34 +00:00
parent 15df3f87ab
commit db04109912
+102 -15
View File
@@ -6,6 +6,8 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define ARDUINO_NANO
@@ -35,6 +37,89 @@ enum MessageCode
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;
@@ -44,8 +129,8 @@ ISR(ADC_vect)
if (((adc_value[adc_ch] - value) < -1) || ((adc_value[adc_ch] - value) > 1))
{
msgCode = AdcComplete;
msgData = adc_ch;
Msg_t msg = {AdcComplete, adc_ch};
Fifo_push(&messageFifo, &msg);
}
adc_value[adc_ch] = value;
@@ -68,15 +153,17 @@ ISR(USART_RX_vect)
}
else if (rx_data >= '0' && rx_data <= '9')
{
msgCode = Command;
msgData = rx_data;
Msg_t msg = {Command, rx_data};
Fifo_push(&messageFifo, &msg);
}
count++;
}
ISR (TIMER1_OVF_vect) // Timer1 ISR
{
msgCode = Timer;
Msg_t msg = {Timer, ledState};
Fifo_push(&messageFifo, &msg);
TCNT1 = TIMER_RELOAD;
ledState++;
if (ledState == 4)
@@ -126,7 +213,7 @@ enum I2C
void i2c_init()
{
TWBR = 0xFF;
TWSR = 0x03;
TWSR = 0x00;
}
void i2c_send(uint8_t addr, uint8_t rw, uint8_t *data, size_t size)
@@ -259,6 +346,7 @@ FILE uart_file = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
int main(void)
{
Fifo_init(&messageFifo, 64, sizeof(Msg_t), "Fifo");
/* Replace with your application code */
uart_init();
@@ -276,25 +364,24 @@ int main(void)
adc_start_conversion(adc_ch);
while (1)
{
if (msgCode)
Msg_t msg;
if (!Fifo_isEmpty(&messageFifo))
{
cli();
uint8_t _msgCode = msgCode;
uint8_t _msgData = msgData;
Fifo_pop(&messageFifo, &msg);
sei();
switch(_msgCode)
switch(msg.code)
{
case Command:
printf("Command : %c\n", _msgData);
uint8_t write_dac[] = {0x00+(_msgData-'0'), 0x00}; // 6.2 Write Volatile Memory (C2:C0 = 010)
printf("Command : %c\n", msg.data);
uint8_t write_dac[] = {0x00+(msg.data-'0'), 0x00}; // 6.2 Write Volatile Memory (C2:C0 = 010)
i2c_send(0x60, I2C_WRITE, write_dac, sizeof(write_dac));
break;
case AdcComplete:
{
size_t ch = _msgData;
size_t ch = msg.data;
if (ch == 6)
{
printf("ADC=%d\n", adc_value[ch]);
@@ -303,7 +390,7 @@ int main(void)
break;
case Timer:
switch(ledState)
switch(msg.data)
{
case 0:
DDRB = (DDRB & 0xFC) | 0x00;