//--------------------------------includes--------------------------------// #include #include #include #include "binary_c.H" //--------------------------defines and variables-------------------------// data unsigned int CLOCKS=0; data unsigned int pixel=0; long SYS = 24500000; sbit CLK = P2^2; //clocking sbit ST = P2^3; //start pulse sbit EOS = P2^4; //end of signal (input from cmos-sensor) sfr16 TMR2RL = 0xca; // Timer2 reload value sfr16 TMR2 = 0xcc; // Timer2 counter sfr16 ADC0 = 0xbd; //sbit _RE = P0^5; //enable receiver sbit SV_e = P2^0; //sbit SV = P1^2; bit fl_enbl_ADC=0; //enable ADC0 flag (0-disable/1-enable) bit fl_print_expos=0; //this flag enables transmitting the 512 bytes to UART0 (0-disable/1-enable) bit fl_SerStartIzmer=0; //enable clocking cmos-sensor and converting by ADC0 (0-disable/1-enable) xdata unsigned char video_buf[512]; #define timer0_start()(TR0=1) #define timer0_stop()(TR0=0) void SYSCLK_Init (void); void Timer0_Init(char counts); void ADC0_Init(void); void UART0_Init(void); void PORT_Init (void); void Timer2_Init(void); void first_init() { CLK=1; ST=1; CLOCKS=0; } int adcL() { int rez=0, rez_c; long int sum=0; //AD0BUSY = 1; if(AD0INT) { rez = (ADC0H << 8) + ADC0L; //AD0BUSY = 0; AD0INT = 0; AD0BUSY = 1; } rez_c=rez&0x03FF; return rez_c; } void Pause(int tim) { int i; for(i=0;i19100 && sum1<19400) { printf("a"); // printf ("_"); } else if(sum1>3000 && sum1<3100) { printf("b"); // printf ("_"); } else if(sum1>4100 && sum1<4300) { printf("c"); // printf ("_"); } else if(sum1>4710 && sum1<4870) { printf("d"); // printf ("_"); } else if(sum1>5600 && sum1<5750) { printf("e"); // printf ("_"); } else if(sum1>6050 && sum1<6150) { printf("f"); //printf ("_"); } else if(sum1>7000 && sum1<7300) { printf("g"); // printf ("_"); } else if(sum1>8300 && sum1<88000) { printf("h");// printf ("_"); } else {//printf ("%d",sum1); // printf ("@"); } */ //} } } //----------------------------------------- //----------------------------------inits---------------------------------// //---------------------------------Sysclock void SYSCLK_Init(void) { OSCICN = 0x83; //24.5MHz } void Timer2_Init (void) { TMR2CN = 0x00; // Stop Timer2; Clear TF2; // use SYSCLK as timebase, 16-bit // auto-reload CKCON |= 0x10; // select SYSCLK for timer 2 source TMR2RL = 65535 - (SYS/ 10000); // init reload value for 10uS TMR2 = 0xffff; // set to reload immediately TR2 = 1; // start Timer2 } //---------------------------------ADC void ADC0_Init(void) { ADC0CN &= ~0x47; //ADC disabled, normal tracking //ADC conversions are initiated on write to AD0BUSY ADC0CF = 0x44; //AD0SC=8 -> conversoin clock = SYSCLK/(AD0SC+1)=24.5/9=2.72222...MHz //Left justify AMX0N = 0x1f; //Negative input = GND AMX0P = 0x02; //Positive input = Port1.2 REF0CN |= 0x0A; //Internal biase generator ON, Vdd uses as voltage reference ADC0CN |= 0x80; //ADC0 enabled // EIE1 |= 0x08; //Enable ADC0 interrupts AD0INT = 0; /* Clear AD0INT flag */ AD0BUSY = 1; } //---------------------------------UART void UART0_Init() { long BAUDR = 115200; SCON0 = 0x10; //8-bit variable bitrate //level of STOP-bit is ignored //RX enabled //ninth bits are zeroes //clear RI0 and TI0 bits if(SYS/BAUDR/2/256<1) { TH1 = -(SYS/BAUDR/2); CKCON |= 0x08; //timer1 clock based on sysclk } else if(SYS/BAUDR/2/256<4) { TH1 = -(SYS/BAUDR/2/4); CKCON &= ~0x0b; CKCON |= 0x01; } else if(SYS/BAUDR/2/256<12) { TH1 = -(SYS/BAUDR/2/12); CKCON &= ~0x0b; } else { TH1 = -(SYS/BAUDR/2/18); CKCON &= ~0x0b; CKCON |= 0x02; } TL1 = TH1; TMOD |= 0x20; //Timer1 in 8-bit autoreload mode TMOD &= ~0xd0; TR1 = 1; //Timer1 run TI0 = 1; //Indicate TX0 ready PS0 = 1; //Register IP: interrupt priority (IP.4) UART //interrupts set to high priority level } //---------------------------------Ports pins void PORT_Init (void) { XBR0 |= 0x01; // UART Enabled //PORTS push-pull outputs P0SKIP = _0b11001111; P0MDOUT = _0b00110000; P0 = _0b11111111;//switch to z-state P1SKIP = _0b11111100; P1MDOUT = _0b00000011; P1MDIN = _0b11110010; P1 = _0b11111111;//switch to z-state P2SKIP = _0b11111111; P2MDOUT = _0b01101111; P2MDIN = _0b11111111; P2 = _0b11111111; XBR1 |= 0xC0; //Enable crossbar and выключить подтяжки } void ADC0_ISR (void) interrupt 10 { static unsigned long accumulator = 0; // accumulator for averaging static unsigned int measurements = 2048; // measurement counter unsigned long result=0; unsigned long mV; // measured voltage in mV AD0INT = 0; // clear ADC0 conversion complete flag accumulator += ADC0; measurements--; if(measurements == 0) { measurements = 2048; result = accumulator / 2048; accumulator=0; // The 10-bit ADC value is averaged across 2048 measurements. // The measured voltage applied to P1.4 is then: // // Vref (mV) // measurement (mV) = --------------- * result (bits) // (2^10)-1 (bits) mV = result * 3250 / 1023; printf("P2.5 voltage: %1d mV\n",mV); } }