Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ioavr.h>
- #include <intrinsics.h>
- #include <string.h>
- #include <stdlib.h>
- #define E 0
- #define RS 1
- #define delTime 30000
- #define delTime1 9000
- #define LCDPORT PORTB
- #define LCDCTRL PORTC
- static volatile int distance = 0;//interger to access all though the program
- static volatile int i=0;
- static volatile long q=0;
- static volatile long z=delTime1;
- //static volatile int timerVar=0;
- static volatile int mode=0;
- void init (void)
- {
- //DDRD=0xFF;
- DDRD=0x10;//0b00010000; the 4th as output for triggering, rest are the inputs
- PORTD=0x00;
- DDRC=0xFF;
- DDRB=0xFF;
- EICRA |= (1 << ISC00);
- EICRA |= (1 << ISC11);// zmiana logiczna
- EIMSK |= (1 << INT0);
- EIMSK |= (1 << INT1);// int 1 wlacz
- TCCR1B = 0;
- TCCR0B|=(1<<CS00);
- TIMSK0|=(1<<TOIE0);
- }
- void send (unsigned char data){
- LCDCTRL|=(1<<E);
- LCDPORT=(data>>4);
- __delay_cycles(1000);
- LCDCTRL&=~(1<<E);
- __delay_cycles(1000);
- LCDCTRL|=(1<<E);
- LCDPORT=(data);
- __delay_cycles(1000);
- LCDCTRL&=~(1<<E);
- __delay_cycles(1000);
- }
- void initlcd (void){
- __delay_cycles(100000);
- LCDCTRL&=~(1<<RS);
- send(0x33);
- send(0x32);
- send(0x28);
- send(0x06);
- send(0x0C);
- send(0x01);
- __delay_cycles(100000);
- }
- void clear (void){
- LCDCTRL&=~(1<<RS);
- send(0x01);
- __delay_cycles(400000);
- LCDCTRL|=(1<<RS);
- }
- void goTo10 (void){
- LCDCTRL&=~(1<<RS);
- send(0x8A);
- __delay_cycles(6000);
- LCDCTRL|=(1<<RS);
- }
- void goTo0 (void){
- LCDCTRL&=~(1<<RS);
- send(0x80);
- __delay_cycles(6000);
- LCDCTRL|=(1<<RS);
- }
- int main(void)
- {
- int r;
- int q;
- int check=mode;;
- init();
- initlcd();
- LCDCTRL|=(1<<RS);
- char txt[5];
- char n1[]="Object in ";
- // char tekst[]="Distance =";
- // char a3[]="Object in D";
- // char s4[]="Searching...";
- txt[3]='c';
- txt[4]='m';
- __enable_interrupt();
- while(1)
- {
- if(mode==0)
- {
- if(mode!=check)
- {
- clear();
- // for(q=0;q<10;q++)
- // {
- // send(w2[q]);
- // }
- check=mode;
- }
- if(distance<1000 && distance>=100/*&& z==delTime1*/)
- {
- txt[2]=distance%10+'0';
- distance=distance/10;
- txt[1]=distance%10+'0';
- distance=distance/10;
- txt[0]=distance%10+'0';
- for(r=0;r<5;r++)
- {
- send(txt[r]);
- }
- goTo0();
- z=0;
- __delay_cycles(5000000);
- }
- else if(distance<100 && distance>=10/*&& z==delTime1*/)
- {
- txt[2]=distance%10+'0';
- distance=distance/10;
- txt[1]=distance%10+'0';
- txt[0]=0+'0';
- for(r=0;r<5;r++)
- {
- send(txt[r]);
- }
- goTo0();
- z=0;
- __delay_cycles(5000000);
- }
- else if(distance<10 && distance>0/*&& z==delTime1*/)
- {
- txt[2]=distance%10+'0';
- txt[1]=0+'0';
- txt[0]=0+'0';
- for(r=0;r<5;r++)
- {
- send(txt[r]);
- }
- goTo0();
- z=0;
- __delay_cycles(5000000);
- }
- else if(distance<0/*&& z==delTime1*/)
- {
- send('-');
- send('-');
- send('-');
- goTo0();
- z=0;
- }
- }
- else
- {
- if(mode!=check)
- {
- clear();
- for(q=0;q<10;q++)
- {
- send(n1[q]);
- }
- // __delay_cycles(8000000000);
- check=mode;
- }
- if(distance<100&&distance>=50)
- {
- // for(q=0;q<11;q++)
- // {
- // send(n1[q]);
- // }
- send('D');
- send('1');
- goTo10();
- __delay_cycles(800000);
- }
- else if(distance<50&&distance>=20)
- {
- // for(q=0;q<11;q++)
- // {
- // send(w2[q]);
- // }
- send('D');
- send('2');
- goTo10();
- __delay_cycles(800000);
- }
- else if(distance<20&&distance>=0)
- {
- // for(q=0;q<11;q++)
- // {
- // send(a3[q]);
- // }
- send('D');
- send('3');
- goTo10();
- __delay_cycles(800000);
- }
- else if(distance>=100)
- {
- send('-');
- send('-');
- goTo10();
- }
- }
- PORTD|=(1<<PD4);
- __delay_cycles(300);///trigger
- PORTD &=~(1<<PD4);
- }
- }
- #pragma vector = TIMER0_OVF_vect
- __interrupt void click()
- {
- if(q<delTime)
- {
- q++;
- }
- // if(z<delTime1)
- // {
- // z++;
- // }
- }
- #pragma vector = INT0_vect
- __interrupt void mier()
- {
- if (i==1)//when logic from HIGH to LOW
- {
- TCCR1B=0;//wylaczamy counter
- /*
- 16MHz=1/T => T=0.0625us
- (0.0625us*340m/s)/2=0.001063 cm
- distance=TCNT1*0.001063 with prescaler =1
- distance=TCNT1*0.001063*8 with prescaler =8
- 1/900=0.0011
- */
- if(TCNT1<1600)
- {
- distance = TCNT1/108;
- }else if(TCNT1>=1600 && TCNT1<6500)
- {
- distance=TCNT1/114;
- }
- else if(TCNT1>=6500 /*&& TCNT1<18000*/)
- {
- distance=TCNT1/115;
- }
- // else if(TCNT1>=18000 )
- // {
- //// distance = (TCNT1/9)*8;
- //// distance=distance/101;
- // distance=TCNT1/116;
- // // distance=distance/910;
- // }
- if(distance>300)
- {
- distance=-1;
- }
- if(TCNT1<400)
- {
- distance=-1;
- }
- TCNT1=0;//reset
- i=0;
- }
- if (i==0)
- {
- //TCNT1=0;
- //TCCR1B|=(1<<CS10);//wlacznie counter
- TCCR1B|=(1<<CS11);
- i=1;
- }
- }
- #pragma vector = INT1_vect
- __interrupt void switchMode()
- {
- if(q==delTime)
- {
- if(mode==0)
- {
- mode=1;
- }else if (mode==1)
- {
- mode=0;
- }
- q=0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement