X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=target%2Fadc-serial%2Fadc_serial.c;h=1f7b6880b1ffcb4133811cc7ad7ed8b9ce3781c7;hp=fb58b4c28c59d37a98c3d03894e8e074cf01d20e;hb=17d2432a8b9c15963cd3b821f025ad33972ef477;hpb=d3732fd405af03c3752a84c4b78da7ef5ebd3744 diff --git a/target/adc-serial/adc_serial.c b/target/adc-serial/adc_serial.c index fb58b4c2..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 -uint8_t __xdata adc_output[ADC_LEN*2]; +/* 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))) @@ -419,7 +427,7 @@ adc_init(void) dma_config.cfg1 = (DMA_CFG1_SRCINC_0 | 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,14 +526,16 @@ 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; @@ -533,33 +543,34 @@ usart_out_number(uint16_t v) } while (v); while (num_ptr != num_buffer) *--num_ptr = ' '; - usart_out_string(num_ptr); + usart_out_string(num_buffer); } -#define ADC(n) (((uint16_t) (adc_output[n<<1] << 8)) | (uint16_t) (adc_output[(n<<1)+1])) +#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(0)); - usart_out_string("pres: "); + usart_out_string(" pres: "); usart_out_number(ADC(1)); - usart_out_string("temp: "); + usart_out_string(" temp: "); usart_out_number(ADC(2)); - usart_out_string("batt: "); + usart_out_string(" batt: "); usart_out_number(ADC(3)); - usart_out_string("drogue: "); + usart_out_string(" drogue: "); usart_out_number(ADC(4)); - usart_out_string("main: "); + usart_out_string(" main: "); usart_out_number(ADC(5)); usart_out_string("\r\n"); delay(10);