Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 16000000UL
- #define BAUD 9600
- #define MYUBRR ((F_CPU/16/BAUD)-1)
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- volatile uint16_t time; // time before send
- volatile uint16_t time_cap; // start time capt
- volatile char buffer[3]; // store set of int value in char from time capture
- void USART_Transmit(unsigned char data){
- while( !(UCSR0A & (1<<UDRE0)));
- UDR0 = data;
- }
- void USART_init(unsigned int ubrr){
- //set baud rate
- UBRR0H = (unsigned char)(ubrr>>8);
- UBRR0L = (unsigned char)ubrr;
- UCSR0A &= 0xFD;
- //Enable transmitter
- UCSR0B = (1<<TXEN0);
- // set frame format 8data 2 stopbit
- UCSR0C = (3<<UCSZ00);
- }
- void Send_trig(void){
- UDR0 = 0x00;
- PORTB |= 0xF0; //PB0 LOGIC '1'
- _delay_us(10);
- PORTB &= 0x00; //PB0 LOGIC '0'
- }
- int main(void) {
- TCNT1 = 0;
- USART_init(MYUBRR);
- TCCR1A |= 0x00;// set up timer register TCCR1A - Normal Mode
- TCCR1B |= 0x45;// set up timer register TCCR1B prescaler 1024 and Normal Mode
- DDRB = 0xF0; // set port B pin 4 5 6 7 as output and 0 1 2 3 as input
- TIMSK1 = 0x21; // set interrupt
- TCNT1 = 57000; // start number
- sei(); // open interrupt
- Send_trig();
- while(1){
- // idle loop add after if want another function
- }
- }
- ISR(TIMER1_OVF_vect){
- TCCR1B = 0x45; // reset interrupt to rise edge
- Send_trig();
- TCNT1 = 57000;
- }
- ISR(TIMER1_CAPT_vect){
- if(TCCR1B == (0x45)){
- time_cap = TCNT1;
- TCCR1B = 0x05;
- }else{
- TIMSK1 &= ~((1<<ICIE1)|(1<<TOIE1));
- time = TCNT1 - time_cap;
- time = ((time*1024*34600)/F_CPU)/2; // cal time to distance
- itoa(time, buffer, 10);
- for (int i=0; i<sizeof(buffer); i++)
- USART_Transmit(buffer[i]);
- USART_Transmit('c');
- USART_Transmit('m');
- USART_Transmit(0x0a);
- TCCR1B = 0x45;
- TIMSK1|=(1<<ICIE1)|(1<<TOIE1);
- sei();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment