///////////////////////////////////////////////////////////////////////// //// ПРИМЕР РАБОТЫ С МИКРОСХЕМОЙ АЦП AD7683 ver 1.0 //// //// author:V.Andreev //// //// http://variate.narod.ru //// //// e-mail:ne-rad@mail.ru //// //// compiler:CCS PCWH 4.013 //// ///////////////////////////////////////////////////////////////////////// //// автор не несет ответственности за возможный /// //// и/или принесенный ущерб и т.п. /// // чтение данных осуществляется по прерыванию TIMER0, // контроллер работает на частоте 48МГц, для соблюдения // временных задержек преобразования, преамбула содержит // 12 тиков, в отличие от документированной, // page[n] - глобальный массив, // после директивы #use fast_io (c) необходимо вручную настроить // порт C, например: set_tris_c (0x04). #define CS PIN_C0 #define DCLOCK PIN_C1 #define Dout PIN_C2 #use fast_io (c) byte buffer[2]; #int_TIMER0 HIGH // обработка прерывания от TIMER0 HIGH !!! void TIMER0_isr () { // в принципе, необходимости в ASM'ых вставках нет #asm BCF 0xF8B.0 ; output_low(CS); BSF 0xF8B.1 ; output_high(DCLOCK); // 1st BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 2 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 3 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 4 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 5 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 6 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 7 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 8 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // 9 BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // A BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // B BCF 0xF8B.1 ; output_low(DCLOCK); BSF 0xF8B.1 ; output_high(DCLOCK); // C BCF 0xF8B.1 ; output_low(DCLOCK); #endasm for(j=0; j<16; j++) // Get 16 bits of data from ADC { #asm BSF 0xF8B.1 ; output_high(DCLOCK); #endasm shift_left(buffer, 2, input(Dout)); #asm BCF 0xF8B.1 ; output_low(DCLOCK); #endasm } #asm BSF 0xF8A.1 ; output_high(DCLOCK); BSF 0xF8B.0 ; output_high(CS); #endasm // перенос данных в глобальный массив page[n]=buffer[0]; n++; page[n]=buffer[1]; n++; } #use delay(clock=48000000) //------------------------------------------------------------------------------- // ещё как вариант // AD7683 #ifndef CS #define CS PIN_C0 #define DCLOCK PIN_C1 // PIN_B1 #define Dout PIN_C2 // PIN_B0 #endif void ext_adc_get2Bytes(BYTE* data); void get_Bytes_page(BYTE* data); void ext_adc_get2Bytes(BYTE* data) {int i, j, c; output_high(CS); output_low(CS); for (c=0; c<6; ++c){ output_high(DCLOCK); delay_cycles(5); output_low(DCLOCK); } for (i=0; i<2; ++i){ for(j=0; j<8; ++j) // Get 16 bits of data { output_high(DCLOCK); shift_left(data+i, 1, input(Dout)); output_low(DCLOCK); } } output_high(DCLOCK); delay_cycles(5); output_low(DCLOCK); output_high(CS); } void get_Bytes_page(BYTE* data) { int adc[2]; int16 n; for (n=0; n<512; n++){ ext_adc_get2Bytes(adc); data[n] = adc[0]; n++; data[n] = adc[1]; delay_us (40); // ! ! ! } }