Compare commits
No commits in common. "684d552c1313bc2da2a91b8e7661ac68a5ec04ec" and "05795327117d4f0123e5b537556f01f173145068" have entirely different histories.
684d552c13
...
0579532711
2 changed files with 21 additions and 42 deletions
43
leia/leia.c
43
leia/leia.c
|
|
@ -80,8 +80,7 @@ struct conf {
|
||||||
uint8_t awake; // 22
|
uint8_t awake; // 22
|
||||||
uint8_t ledoff; // 23
|
uint8_t ledoff; // 23
|
||||||
uint8_t disable; // 24
|
uint8_t disable; // 24
|
||||||
uint8_t dac_ref; // 25
|
uint8_t pad[7]; // 25
|
||||||
uint8_t pad[6]; // 26
|
|
||||||
uint8_t adc_ch[16]; // 32
|
uint8_t adc_ch[16]; // 32
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -110,12 +109,10 @@ struct vars {
|
||||||
#define ADC_NTC1 (ADC_E | 8)
|
#define ADC_NTC1 (ADC_E | 8)
|
||||||
#define ADC_NTC2 (ADC_E | 9)
|
#define ADC_NTC2 (ADC_E | 9)
|
||||||
#define ADC_NTC3 (ADC_E | 10)
|
#define ADC_NTC3 (ADC_E | 10)
|
||||||
#define ADC_Temp (ADC_E | 11)
|
#define ADC_Temp (ADC_R | 11)
|
||||||
#define ADC_Vcc (ADC_E | 12)
|
#define ADC_Vcc (ADC_R | 12)
|
||||||
#define ADC_BG (ADC_E | 17)
|
#define ADC_BG (ADC_E | 17)
|
||||||
#define ADC_GND (ADC_E | 18)
|
#define ADC_GND (ADC_E | 18)
|
||||||
#define DAC_R ADC_R
|
|
||||||
#define DAC_S (DAC_R | ADC_S)
|
|
||||||
|
|
||||||
__attribute__((section(".eeprom")))
|
__attribute__((section(".eeprom")))
|
||||||
const struct conf runcon = {
|
const struct conf runcon = {
|
||||||
|
|
@ -130,22 +127,17 @@ const struct conf runcon = {
|
||||||
.ledoff = LEDON,
|
.ledoff = LEDON,
|
||||||
.awake = SLEEP,
|
.awake = SLEEP,
|
||||||
.reset = RESET,
|
.reset = RESET,
|
||||||
// The DAC uses the Vref selected here. For proper operation,
|
|
||||||
// all entries must use the same Vref!
|
|
||||||
.adc_ch = {
|
.adc_ch = {
|
||||||
ADC_BG|DAC_S, ADC_BG|DAC_R,
|
ADC_BG|ADC_SR, ADC_BG|ADC_R, ADC_GND|ADC_R,
|
||||||
ADC_GND|DAC_S, ADC_GND|DAC_R,
|
ADC_Iprim|ADC_SR, ADC_Iprim|ADC_R,
|
||||||
ADC_Iprim|DAC_S, ADC_Iprim|DAC_R,
|
ADC_Vcc|ADC_S, ADC_Vcc, ADC_Temp,
|
||||||
ADC_Vcc|DAC_S, ADC_Vcc|DAC_R,
|
ADC_BG|ADC_S, ADC_BG, ADC_GND,
|
||||||
ADC_Temp|DAC_R,
|
ADC_Iprim, ADC_NTC1, ADC_NTC2, ADC_NTC3,
|
||||||
ADC_Iprim|DAC_R,
|
|
||||||
ADC_NTC1|DAC_R, ADC_NTC2|DAC_R, ADC_NTC3|DAC_R,
|
|
||||||
},
|
},
|
||||||
.dac_ref = DAC_R | ADC_BG,
|
.adc_incr = 16, // one conversions per channel
|
||||||
.adc_incr = 16, // one conversion per channel
|
|
||||||
.adc_period = TICK_NS(1000000),
|
.adc_period = TICK_NS(1000000),
|
||||||
.dac_step = 0x20,
|
.dac_step = 0x20,
|
||||||
.pad = "\xff\xff\xff\xff\xff\xff",
|
.pad = "\xff\xff\xff\xff\xff\xff\xff",
|
||||||
};
|
};
|
||||||
|
|
||||||
void stepper_init()
|
void stepper_init()
|
||||||
|
|
@ -410,7 +402,6 @@ void adc_init()
|
||||||
DIDR0 = 1<<ADC3D;
|
DIDR0 = 1<<ADC3D;
|
||||||
DIDR1 = 1<<ADC8D | 1<<ADC9D | 1<<ADC10D;
|
DIDR1 = 1<<ADC8D | 1<<ADC9D | 1<<ADC10D;
|
||||||
ADCSRB = 1<<AREFEN | 2<<ADTS0;
|
ADCSRB = 1<<AREFEN | 2<<ADTS0;
|
||||||
ADMUX = v.conf.dac_ref;
|
|
||||||
ADCSRA = 1<<ADEN | 1<<ADIF | 6<<ADPS0;
|
ADCSRA = 1<<ADEN | 1<<ADIF | 6<<ADPS0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -856,8 +847,6 @@ void reg88(uint8_t *v1, uint8_t *v2, unsigned char *r, const unsigned char *c)
|
||||||
// ADC: capture conversion results, advance MUX config
|
// ADC: capture conversion results, advance MUX config
|
||||||
// EE_READY: write conf bytes to EEPROM
|
// EE_READY: write conf bytes to EEPROM
|
||||||
|
|
||||||
unsigned char error_msg[6] = "\xff\xff\xff" "EEE";
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
MCUSR = 0;
|
MCUSR = 0;
|
||||||
|
|
@ -874,11 +863,8 @@ int main()
|
||||||
unsigned char cmd[3];
|
unsigned char cmd[3];
|
||||||
unsigned char resp[3];
|
unsigned char resp[3];
|
||||||
stepper_run();
|
stepper_run();
|
||||||
unsigned char e = spi_slave_Rx(cmd, 3);
|
if (spi_slave_Rx(cmd, 3)) {
|
||||||
if (error_msg[5]) {
|
spi_slave_Tx((const unsigned char*)"\xff\xff\xff" "EEY", 6);
|
||||||
error_msg[4] = 'S';
|
|
||||||
error_msg[5] = e;
|
|
||||||
spi_slave_Tx(error_msg, sizeof(error_msg));
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
stepper_stop();
|
stepper_stop();
|
||||||
|
|
@ -891,11 +877,6 @@ int main()
|
||||||
resp[1] = 'E';
|
resp[1] = 'E';
|
||||||
resp[2] = cmd[0];
|
resp[2] = cmd[0];
|
||||||
break;
|
break;
|
||||||
case 'e':
|
|
||||||
resp[0] = 'e';
|
|
||||||
resp[1] = error_msg[4];
|
|
||||||
resp[2] = error_msg[5];
|
|
||||||
break;
|
|
||||||
case 'm': reg88(&v.conf.lmask, &v.conf.lval, resp, cmd); break;
|
case 'm': reg88(&v.conf.lmask, &v.conf.lval, resp, cmd); break;
|
||||||
case 'q': reg16(&v.conf.period, resp, cmd);
|
case 'q': reg16(&v.conf.period, resp, cmd);
|
||||||
if (0) case 'l': reg16(&v.conf.slen, resp, cmd);
|
if (0) case 'l': reg16(&v.conf.slen, resp, cmd);
|
||||||
|
|
|
||||||
20
spi_slave.h
20
spi_slave.h
|
|
@ -23,17 +23,15 @@ unsigned char spi_slave_Rx_status()
|
||||||
return SPSR & SPSR_IF && !(SPDR & 0x80);
|
return SPSR & SPSR_IF && !(SPDR & 0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SPI_LATE 0x80
|
|
||||||
#define SPI_SHORT 0x40
|
|
||||||
|
|
||||||
#define spi_slave_Rx spi_slave_Rx_n
|
#define spi_slave_Rx spi_slave_Rx_n
|
||||||
static inline
|
static inline
|
||||||
unsigned char spi_slave_Rx_n(unsigned char d[], unsigned char n)
|
unsigned char spi_slave_Rx_n(unsigned char d[], unsigned char n)
|
||||||
{
|
{
|
||||||
|
d[0] = 0xff;
|
||||||
if (SPSR & SPSR_IF) {
|
if (SPSR & SPSR_IF) {
|
||||||
SPDR = 0xff;
|
SPSR;
|
||||||
d[0] = SPDR;
|
SPDR;
|
||||||
return n | SPI_LATE;
|
return n;
|
||||||
}
|
}
|
||||||
register unsigned char b;
|
register unsigned char b;
|
||||||
do {
|
do {
|
||||||
|
|
@ -47,7 +45,7 @@ unsigned char spi_slave_Rx_n(unsigned char d[], unsigned char n)
|
||||||
while (!(SPSR & SPSR_IF))
|
while (!(SPSR & SPSR_IF))
|
||||||
if (PIN_SSEL) {
|
if (PIN_SSEL) {
|
||||||
if (s)
|
if (s)
|
||||||
return n | SPI_SHORT;
|
return n;
|
||||||
s = n;
|
s = n;
|
||||||
}
|
}
|
||||||
SPDR = 0xff;
|
SPDR = 0xff;
|
||||||
|
|
@ -75,7 +73,7 @@ unsigned char spi_slave_Rx_wdt(unsigned char d[], unsigned char n)
|
||||||
while (!(SPSR & SPSR_IF))
|
while (!(SPSR & SPSR_IF))
|
||||||
if (PIN_SSEL) {
|
if (PIN_SSEL) {
|
||||||
if (s)
|
if (s)
|
||||||
return n | SPI_SHORT;
|
return n;
|
||||||
s = n;
|
s = n;
|
||||||
}
|
}
|
||||||
SPDR = 0xff;
|
SPDR = 0xff;
|
||||||
|
|
@ -94,7 +92,7 @@ unsigned char spi_slave_Tx_n(const unsigned char d[], unsigned char n)
|
||||||
register unsigned char b = *d++;
|
register unsigned char b = *d++;
|
||||||
while (!(SPSR & SPSR_IF))
|
while (!(SPSR & SPSR_IF))
|
||||||
if (PIN_SSEL)
|
if (PIN_SSEL)
|
||||||
return n | SPI_SHORT;
|
return n;
|
||||||
SPDR = b;
|
SPDR = b;
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
|
|
@ -176,7 +174,7 @@ static inline
|
||||||
unsigned char spi_slave_Rx_sei(unsigned char d[], unsigned char n)
|
unsigned char spi_slave_Rx_sei(unsigned char d[], unsigned char n)
|
||||||
{
|
{
|
||||||
if (!PIN_SSEL)
|
if (!PIN_SSEL)
|
||||||
return n | SPI_LATE;
|
return 1;
|
||||||
PCIFR |= PCIF_SSEL;
|
PCIFR |= PCIF_SSEL;
|
||||||
sei();
|
sei();
|
||||||
n = spi_slave_Rx_n(d, n);
|
n = spi_slave_Rx_n(d, n);
|
||||||
|
|
@ -228,7 +226,7 @@ unsigned char spi_slave_Rx_sleep(unsigned char d[], unsigned char n)
|
||||||
cli();
|
cli();
|
||||||
}
|
}
|
||||||
d[0] = 0xff;
|
d[0] = 0xff;
|
||||||
return n | SPI_LATE | SPI_SHORT;
|
return n;
|
||||||
}
|
}
|
||||||
SPSR;
|
SPSR;
|
||||||
SPDR;
|
SPDR;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue