Compare commits

..

No commits in common. "684d552c1313bc2da2a91b8e7661ac68a5ec04ec" and "05795327117d4f0123e5b537556f01f173145068" have entirely different histories.

2 changed files with 21 additions and 42 deletions

View file

@ -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);

View file

@ -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;