#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "MAIN.h"
#include "3310LCD.h"
#include "MISC.h"
#include "UltraDelay.h"
#define WONS 10
#define WOFFS (25-1-WONS)
#define WONM 13
#define WOFFM (25-1-WONM)
void msDelay(unsigned int T)
{
while(T--)
_delay_loop_2(1000*FREQ/4);
}
void HEX2toASC5(unsigned int Ldata, char *ptr,unsigned char len,unsigned char nHIDE)
{
unsigned char k;
unsigned char S[]="XXXXX";
unsigned char *Ptr=S;
k=0;
while (Ldata>=10000) //5
{
Ldata-=10000;
k++;
}
if (k)
{
k+=0x30;
nHIDE=1;
}
else if(nHIDE)
k='0';
else
k=' '; //hide
*Ptr++=k;
k=0;
while (Ldata>=1000) //4
{
Ldata-=1000;
k++;
}
if (k)
{
k+=0x30;
nHIDE=1;
}
else if(nHIDE)
k='0';
else
k=' '; //hide
*Ptr++=k;
k=0;
while (Ldata>=100) //3
{
Ldata-=100;
k++;
}
if (k)
{
k+=0x30;
nHIDE=1;
}
else if(nHIDE)
k='0';
else
k=' '; //hide
*Ptr++=k;
k=0;
while (Ldata>=10) //2
{
Ldata-=10;
k++;
}
if (k)
k+=0x30;
else if(nHIDE)
k='0';
else
k=' '; //hide
*Ptr++=k;
k=(unsigned char)Ldata;
if (k)
{
k+=0x30;
}
else
k='0';
*Ptr++=k;
Ptr-=len;
while (len--)
*ptr++=*Ptr++;
}
unsigned int read_adc(unsigned char adc_input)
{//AD转换设置:ADCSR=0x86;(DIV=64 )ADMUX=0xc0;
ADMUX=(0xc0|adc_input); //adc_input:选择通道; 0xc0:选择内部2.56V参考电压
msDelay(1);
ADCSRA|=0x40; //启动AD转换
while ((ADCSRA&0x10)==0); //等待AD转换结束
ADCSRA|=0x10; //clear
return ADC; //ADC=ADCH & ADCL
}
//从RS232发送一个字节
void uart_putchar(char c)
{
while(!(UCSRA & 0x20));
UDR = c;
}
void uart_puts(char *ptr)
{
while (*ptr)
uart_putchar(*ptr++);
}
void OUT_40KHz(void)
//T0 prescale=1,WGM=CTC 12.5uS+12.5uS
{
unsigned char pulsecnt;
asm volatile("cli"::);
PORTB|= (1<<TX_nOC0);
OCR0 = 0x63;
TCNT0 = 0x00; //clear
TCCR0 = (1<<WGM01)|(1<<CS00)|(1<<COM00);
for (pulsecnt=0;pulsecnt<4;pulsecnt++)
{
while (PINB&(1<<TX_nOC0)); //1
while (!(PINB&(1<<TX_nOC0))); //0
}
TCCR0 = 0x00; //stop
PORTB|= (1<<TX_nOC0);
asm volatile("sei"::);
}
void DP_DEC(unsigned char step)
{
PORTB&=~(1<<DP_UnD); //DOWN
PORTD&=~(1<<DP_nCS);
while (step--)
{
PORTB&=~(1<<DP_nINC);
PORTB|= (1<<DP_nINC);
}
PORTD|= (1<<DP_nCS);
}
void DP_INC(unsigned char step)
{
PORTB|= (1<<DP_UnD); //UP
PORTD&=~(1<<DP_nCS);
while (step--)
{
PORTB&=~(1<<DP_nINC);
PORTB|= (1<<DP_nINC);
}
PORTD|= (1<<DP_nCS);
}
unsigned int Calc_Distance(void)
{
//Speed =33150+(temp*607/10)
//Dist= Speed*T/(100000*2))
unsigned long speed;
unsigned long Distance_mm;
unsigned long XMM;
speed =(TEMP[0]<<4)+(TEMP[1]>>4); //12bit
speed =speed*607;
speed =speed/160;
speed+=33150;
Distance_mm=speed*CAPTIME;
XMM=(Distance_mm/200000);
return (unsigned int)XMM;
}
void setOverTime(void)
{
TCNT1 = 0;
TCCR1B= (1<<ICNC1)|(0<<ICES1)|(1<<CS12)|(1<<CS10); //8S stanby
TIFR = 0xFF;
TIMSK = (1<<TOIE1); //T1OVF
RUN_ST= 0x00;
PORTD&=~(1<<SIG_ICP);
DDRD |= (1<<SIG_ICP);
_delay_loop_2(10*FREQ/4);
DDRD &=~(1<<SIG_ICP); //FORCE ICP to low
}
void OUT_D_40KHz(void)
{
asm volatile("cli"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONS*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFS*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONM*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFM*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONM*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFM*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONM*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFM*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONM*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFM*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
PORTB&=~(1<<TX_nOC0);
_delay_loop_2(WONM*FREQ/4);
PORTB|= (1<<TX_nOC0);
_delay_loop_2(WOFFM*FREQ/4);
asm volatile("nop"::);
asm volatile("nop"::);
asm volatile("sei"::);
}
void get_DT(void)
{
unsigned char gaincnt=0;
unsigned int gaindelay;
SPCR &=~(1<<SPE); //Disenable SPI
DP_DEC(255);
DP_DEC(1); //min GAIN
CAP_ST =START;
CAPTIME=0;
CAPCNT =0;
TCNT1 =0;
OUT_D_40KHz(); //TX 4puls
TCCR1B =(1<<ICNC1)|(0<<ICES1)|(1<<CS11); //1uS,Fail,4Sample
_delay_loop_2(200*FREQ/4);
TIFR=0xFF;
TIMSK = (1<<TOIE1)|(1<<TICIE1); //T1OVF+ICP
while (CAP_ST==START) //waitting Overflow
{
gaindelay=pgm_read_word(&Udelay[gaincnt++]);
_delay_loop_2(gaindelay);
DP_INC(1);
}
TIMSK &=~(1<<TICIE1); //disenable ICP
while (CAP_ST!=OVER)
; //waitting Overflow
setOverTime();
DP_DEC(255);
DP_DEC(1); //min GAIN
SPCR |=(1<<SPE); //Enable SPI
AGAIN=gaincnt;
}
void get_FIX(void)
{
SPCR &=~(1<<SPE); //Enable SPI
DP_DEC(255);
DP_DEC(1); //min GAIN
DP_INC(GAIN);
CAP_ST =START;
CAPTIME=0;
CAPCNT =0;
TCNT1 =0;
OUT_D_40KHz(); //TX 4puls
TCCR1B =(1<<ICNC1)|(0<<ICES1)|(1<<CS11); //1uS,Fail,4Sample
msDelay(BLANK);
TIFR=0xFF;
TIMSK =(1<<TOIE1)|(1<<TICIE1); //T1OVF+ICP
while (CAP_ST==START); //waitting Overflow
TIMSK &=~(1<<TICIE1); //disenable ICP
while (CAP_ST!=OVER); //waitting Overflow
setOverTime();
DP_DEC(255);
DP_DEC(1); //min GAIN
SPCR |=(1<<SPE); //Enable SPI
}