small changes
This commit is contained in:
parent
f7270fd437
commit
f67475e8e4
@ -20,13 +20,6 @@ static inline void adc_next() {
|
|||||||
|
|
||||||
if (!adc.current_channel) {
|
if (!adc.current_channel) {
|
||||||
adc.current_sample = adc.buffer.ptr-1;
|
adc.current_sample = adc.buffer.ptr-1;
|
||||||
|
|
||||||
// update app state (remap channels)
|
|
||||||
app.state.state.slider = adc.buffer.ptr[4];
|
|
||||||
app.state.state.poti[0] = adc.buffer.ptr[3];
|
|
||||||
app.state.state.poti[1] = adc.buffer.ptr[2];
|
|
||||||
app.state.state.poti[2] = adc.buffer.ptr[0];
|
|
||||||
app.state.state.poti[3] = adc.buffer.ptr[1];
|
|
||||||
}
|
}
|
||||||
} while(!(adc.channel_mask & (1<<adc.current_channel)));
|
} while(!(adc.channel_mask & (1<<adc.current_channel)));
|
||||||
|
|
||||||
@ -55,7 +48,7 @@ void adc_init(adc_buffer_t buffer, uint8_t mask) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ADMUX = 0;
|
ADMUX = 0;
|
||||||
ADCSRA = (1<<ADATE) | (1<<ADEN) ; // enable adc, maximum prescaler value
|
ADCSRA = (1<<ADATE) | (1<<ADEN) | 5 ; // enable adc, maximum prescaler value
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_start() {
|
void adc_start() {
|
||||||
@ -66,8 +59,9 @@ void adc_stop( ){
|
|||||||
ADCSRA &= ~(1<<ADIE);
|
ADCSRA &= ~(1<<ADIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "led.h"
|
||||||
ISR(ADC_vect) {
|
ISR(ADC_vect) {
|
||||||
*adc.current_sample = ADC;
|
**adc.current_sample = ADC;
|
||||||
adc_next();
|
adc_next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
typedef uint16_t adc_sample_t;
|
typedef uint16_t adc_sample_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
adc_sample_t * ptr;
|
adc_sample_t ** ptr;
|
||||||
uint8_t size;
|
uint8_t size;
|
||||||
} adc_buffer_t;
|
} adc_buffer_t;
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ typedef struct adc {
|
|||||||
adc_buffer_t buffer;
|
adc_buffer_t buffer;
|
||||||
|
|
||||||
uint8_t current_channel;
|
uint8_t current_channel;
|
||||||
adc_sample_t * current_sample;
|
adc_sample_t ** current_sample;
|
||||||
uint8_t channel_mask;
|
uint8_t channel_mask;
|
||||||
} adc_t;
|
} adc_t;
|
||||||
|
|
||||||
|
@ -13,35 +13,71 @@
|
|||||||
#include <interface.h>
|
#include <interface.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
byte_t * buffer_start, * buffer_end;
|
||||||
|
|
||||||
|
volatile byte_t * read;
|
||||||
|
volatile byte_t * write;
|
||||||
|
volatile byte_t count;
|
||||||
|
|
||||||
iface_t iface;
|
iface_t iface;
|
||||||
} comm_t;
|
} comm_t;
|
||||||
|
|
||||||
comm_t comm;
|
comm_t comm;
|
||||||
|
|
||||||
void comm_write(iface_t * iface, byte_t byte) {
|
void comm_write(iface_t * iface, byte_t byte) {
|
||||||
// disable interrupt (temporarily)
|
if ((comm.write == comm.read) && comm.count) {
|
||||||
uint8_t temp = USICR;
|
// write overflow
|
||||||
USICR &= ~(1<<USIOIE);
|
return;
|
||||||
|
}
|
||||||
// write data register
|
|
||||||
USIDR = byte;
|
*comm.write = byte;
|
||||||
|
++comm.count;
|
||||||
// wait for buffer overflow
|
|
||||||
while(!(USICR&(1<<USIOIE))) {}
|
// advance write pointer
|
||||||
|
if ((++comm.write) >= comm.buffer_end) {
|
||||||
// restore control register
|
comm.write = comm.buffer_start;
|
||||||
USICR = temp;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void comm_init() {
|
inline byte_t comm_read() {
|
||||||
|
if (!comm.count)
|
||||||
|
return 0x00;
|
||||||
|
|
||||||
|
byte_t result = *comm.read;
|
||||||
|
|
||||||
|
--comm.count;
|
||||||
|
if ((++comm.read) >= comm.buffer_end) {
|
||||||
|
comm.read = comm.buffer_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte_t comm_buffer[10];
|
||||||
|
|
||||||
|
void comm_init()
|
||||||
|
{
|
||||||
|
comm.buffer_start = comm_buffer;
|
||||||
|
comm.buffer_end = comm_buffer + sizeof(comm_buffer);
|
||||||
|
|
||||||
|
// reset buffer
|
||||||
|
comm.write = comm.buffer_start;
|
||||||
|
comm.read = comm.buffer_start;
|
||||||
|
comm.count = 0;
|
||||||
|
|
||||||
// TODO: setup pins
|
// TODO: setup pins
|
||||||
|
DDRA |= (1<<PA5); // setup MOSI as output
|
||||||
|
|
||||||
// TODO: setup USART in synchronous mode
|
// TODO: setup USART in synchronous mode
|
||||||
USICR = (1<<USIWM0)|(1<<USICS1);
|
USICR = (1<<USIWM0)|(1<<USICS1);
|
||||||
|
|
||||||
// init interface
|
// init interface
|
||||||
comm.iface.write = comm_write;
|
comm.iface.write = comm_write;
|
||||||
|
comm.iface.on_read = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void comm_start() {
|
void comm_start()
|
||||||
|
{
|
||||||
// don't start without interrupt handler
|
// don't start without interrupt handler
|
||||||
if (!comm.iface.on_read)
|
if (!comm.iface.on_read)
|
||||||
return;
|
return;
|
||||||
@ -50,19 +86,18 @@ void comm_start() {
|
|||||||
USICR |= (1<<USIOIE);
|
USICR |= (1<<USIOIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(USI_OVF_vect) {
|
ISR(USI_OVF_vect)
|
||||||
// call interrupt handler
|
{
|
||||||
comm.iface.on_read(&comm.iface, USIBR, comm.iface.callback_data);
|
cli();
|
||||||
}
|
// write buffer out if there is data to be written
|
||||||
|
//if (!comm.count) {
|
||||||
void on_read(iface_t * sender, byte_t b) {
|
// call interrupt handler
|
||||||
if (!IS_EOM(b)) {
|
//comm.iface.on_read(&comm.iface, USIDR, comm.iface.callback_data);
|
||||||
sender->write(sender, b);
|
//}
|
||||||
return;
|
|
||||||
}
|
USIDR = 0x02;
|
||||||
|
sei();
|
||||||
// strip EOM message
|
//USIDR = comm_read();
|
||||||
sender->write(sender, b&0x7F);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
@ -70,8 +105,18 @@ void on_read(iface_t * sender, byte_t b) {
|
|||||||
// the public instance of the app buffer
|
// the public instance of the app buffer
|
||||||
struct app app = {};
|
struct app app = {};
|
||||||
|
|
||||||
|
adc_sample_t * channel_map[] = {
|
||||||
|
// update app state (remap channels)
|
||||||
|
&app.state.state.poti[2],
|
||||||
|
&app.state.state.poti[3],
|
||||||
|
&app.state.state.poti[1],
|
||||||
|
&app.state.state.poti[0],
|
||||||
|
&app.state.state.slider
|
||||||
|
};
|
||||||
|
|
||||||
// initalizes the application modules
|
// initalizes the application modules
|
||||||
void init() {
|
void init()
|
||||||
|
{
|
||||||
// init button module (making the button light up on press)
|
// init button module (making the button light up on press)
|
||||||
// module also updates app.buffer.button for us
|
// module also updates app.buffer.button for us
|
||||||
button_init();
|
button_init();
|
||||||
@ -80,8 +125,8 @@ void init() {
|
|||||||
// will sample 0x8F (CHANNEL 8 and 0-3)
|
// will sample 0x8F (CHANNEL 8 and 0-3)
|
||||||
// this module also updates app.buffer.poti and slider for us
|
// this module also updates app.buffer.poti and slider for us
|
||||||
adc_init((adc_buffer_t){
|
adc_init((adc_buffer_t){
|
||||||
.ptr = app.adc_buffer,
|
.ptr = channel_map,
|
||||||
.size = 5,
|
.size = sizeof(channel_map),
|
||||||
}, 0x8F);
|
}, 0x8F);
|
||||||
|
|
||||||
// init communication module
|
// init communication module
|
||||||
@ -98,21 +143,22 @@ void init() {
|
|||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
// little debug helper function
|
// little debug helper function
|
||||||
// FIXME: remove when not needed
|
// FIXME: remove when not needed
|
||||||
void delay(uint16_t d) {
|
void delay(uint16_t d)
|
||||||
while(d--) {
|
{
|
||||||
__asm("nop");
|
while(d--)
|
||||||
|
{
|
||||||
|
_delay_ms(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main()
|
||||||
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
// start relevant periphials
|
|
||||||
adc_start();
|
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
// nothing to do here, the application is interrupt-driven
|
// nothing to do here, the application is interrupt-driven
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
struct app {
|
struct app {
|
||||||
slave_t state;
|
slave_t state;
|
||||||
adc_sample_t adc_buffer[5];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct app app;
|
extern struct app app;
|
||||||
|
Loading…
Reference in New Issue
Block a user