/*
Hardveres idomeres Input Capture-rel
SRF04 + AVR + soros LCD
Hardware: ATmega8 @ 7.372800MHz
*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define Trigger_PORT PORTD
#define Trigger_PIN PIND
#define Trigger_DDR DDRD
#define Trigger_Lab PD7 //SRF04 Trigger laba PORTD7-re kotve
#define Echo_PORT PORTB
#define Echo_PIN PINB
#define Echo_DDR DDRB
#define Echo_Lab PB0 //SRF04 Echo laba PORTB0-re kotve (Input Capture lab)
volatile uint16_t Time = 0;
void KonfigUART() // UART beallitasa
{
// 9600 bps soros kommunikacio sebesseg beallitasa
UBRRL = UBRR_ERTEK; // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
UBRRH = (UBRR_ERTEK>>8); // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
// Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
//Ado es Vevo aramkorok bekapcsolasa
UCSRB |= (1 << RXEN) | (1 << TXEN); //
}
char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
{
while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
{
//Varakozas
}
//Most mar van beerkezett adat, amit kiolvasunk a pufferbol
return UDR;
}
void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
{
while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
{
//Varakozas
}
// Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
UDR=data;
}
void UARTSzovegKuld( char *p)
{
while(*p)
{
UARTAdatKuld( *p++);
}
}
void Trigger()
{
//az SRF04 Trigger labara 15us-os, magas allapotu impulzus adasa
Trigger_PORT |= (1<<Trigger_Lab); //magas allapot
_delay_us(15); // varakozas 15 mikroszekundumig
Trigger_PORT &= (~(1<<Trigger_Lab)); //alacsony allapot
//input capture beallitasa a felfuto elre
TCCR1B|=(1<<ICES1);
//input capture megszakitas engedelyezese
TIMSK|=(1<<TICIE1);
}
int main(void) // Foprogram
{
uint16_t Tavolsag = 0;
KonfigUART(); // UART Konfiguralasa
//Trigger pin kimenet
Trigger_DDR |= (1<<Trigger_Lab);
//Echo pin bemenet
Echo_DDR &= (~(1<<Echo_Lab));
//globalis megszakitasok engedelyezese
sei();
while(1)
{
Trigger(); // Trigger impulzus adasa (tavolsagmeres elinditasa)
_delay_ms(50); // varakozas
Tavolsag = Time*10/54; // tavolsag kiszamitasa
UARTSzovegKuld("?f"); // ?f soros LCD parancs: LCD torlese
UARTAdatKuld('0'+(Tavolsag/10000) % 10); //Tizezresek kiirasa
UARTAdatKuld('0'+(Tavolsag/1000) % 10); // Ezresek ertekenek kiirasa
UARTAdatKuld('0'+(Tavolsag/100) % 10); // Szazasok ertekenek kiirasa
UARTAdatKuld('0'+(Tavolsag/10) % 10); // Tizesek ertekenek kiirasa
UARTAdatKuld('0'+Tavolsag % 10); // Egyesek ertekenek kiirasa
UARTSzovegKuld(" mm"); //
UARTSzovegKuld("?m"); // ?m soros LCD parancs: ugras a sor elejere
}
}
//input capture megszakitas kiszolgalo rutin (ISR)
ISR(TIMER1_CAPT_vect)
{
if (Echo_PIN & (1<<Echo_Lab)) //ha az Echo lab magas (felfuto el tortent)
{
//Timer1 input capture mod beallitasa, nullazasa es elinditasa
TCCR1A=0X00;
TCNT1=0; //szamlalo nullazasa
TCCR1B=(1<<CS11); // eloosztas 1/8
// input capture beallitasa lefuto elre
TCCR1B&=~(1<<ICES1);
}
else // ha lefuto el tortent
{
Time=ICR1; // a szamlalo ertekenek beirasa a Time valtozoba
//input capture megszakitas jelzobit torlese
TIFR=(1<<ICF1);
// input capture megszakitas kikapcsolasa
TIMSK &=~(1<<TICIE1);
// Timer leallitasa
TCCR1B=0x00;
}
}