X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=target%2Fadc-serial%2Fadc_serial.c;h=1f7b6880b1ffcb4133811cc7ad7ed8b9ce3781c7;hp=349f3d7e04e09afe4c683af5a3bfc9d47c80788b;hb=17d2432a8b9c15963cd3b821f025ad33972ef477;hpb=378227d869a3e8787c532c8c4e1563b44002c4b5 diff --git a/target/adc-serial/adc_serial.c b/target/adc-serial/adc_serial.c index 349f3d7e..1f7b6880 100644 --- a/target/adc-serial/adc_serial.c +++ b/target/adc-serial/adc_serial.c @@ -405,7 +405,15 @@ struct cc_dma_channel __xdata dma_config; #define ADC_LEN 6 -uint16_t __xdata adc_output[ADC_LEN]; +/* The DMA engine writes to XDATA in MSB order */ +struct dma_xdata16 { + uint8_t high; + uint8_t low; +}; + +struct dma_xdata16 adc_output[ADC_LEN]; + +#define DMA_XDATA16(a,n) ((uint16_t) ((a)[n].high << 8) | (uint16_t) (a[n].low)) #define ADDRH(a) (((uint16_t) (a)) >> 8) #define ADDRL(a) (((uint16_t) (a))) @@ -417,9 +425,9 @@ adc_init(void) DMA_CFG0_TMODE_REPEATED_SINGLE | DMA_CFG0_TRIGGER_ADC_CHALL); dma_config.cfg1 = (DMA_CFG1_SRCINC_0 | - DMA_CFG1_DESTINC_2 | + DMA_CFG1_DESTINC_1 | DMA_CFG1_PRIORITY_NORMAL); - + dma_config.src_high = ADDRH(&ADCXDATA); dma_config.src_low = ADDRL(&ADCXDATA); dma_config.dst_high = ADDRH(adc_output); @@ -434,7 +442,7 @@ adc_init(void) (1 << 3) | /* battery voltage */ (1 << 4) | /* drogue sense */ (1 << 5)); /* main sense */ - + ADCCON1 = (ADCCON1_STSEL_START); /* ST bit triggers */ ADCCON2 = (ADCCON2_SREF_VDD | /* reference voltage is VDD */ ADCCON2_SDIV_512 | /* 12 bit ADC results */ @@ -518,45 +526,52 @@ usart_out_string(uint8_t *string) usart_out_byte(b); } -uint8_t __xdata num_buffer[10]; +#define NUM_LEN 6 + +uint8_t __xdata num_buffer[NUM_LEN]; uint8_t __xdata * __xdata num_ptr; void usart_out_number(uint16_t v) { - num_ptr = num_buffer + 10; + num_ptr = num_buffer + NUM_LEN; *--num_ptr = '\0'; do { *--num_ptr = '0' + v % 10; v /= 10; } while (v); - usart_out_string(num_ptr); + while (num_ptr != num_buffer) + *--num_ptr = ' '; + usart_out_string(num_buffer); } +#define ADC(n) DMA_XDATA16(adc_output,n) + main () { - P1DIR |= 2; + P1DIR = 3; CLKCON = 0; while (!(SLEEP & SLEEP_XOSC_STB)) ; - + adc_init(); + P1_0 = 1; usart_init(); for (;;) { adc_run(); usart_out_string("accel: "); - usart_out_number(adc_output[0]); - usart_out_string("pres: "); - usart_out_number(adc_output[1]); - usart_out_string("temp: "); - usart_out_number(adc_output[2]); - usart_out_string("batt: "); - usart_out_number(adc_output[3]); - usart_out_string("drogue: "); - usart_out_number(adc_output[4]); + usart_out_number(ADC(0)); + usart_out_string(" pres: "); + usart_out_number(ADC(1)); + usart_out_string(" temp: "); + usart_out_number(ADC(2)); + usart_out_string(" batt: "); + usart_out_number(ADC(3)); + usart_out_string(" drogue: "); + usart_out_number(ADC(4)); usart_out_string(" main: "); - usart_out_number(adc_output[5]); + usart_out_number(ADC(5)); usart_out_string("\r\n"); delay(10); }