Здравствуйте, я прочитал про DDRX И PORTX. (Читал на сайте narodstream). Этот код я переделал чуть под hs-sr04, с ним работает а с ts-320 нет хотя функция счета длительности импульса одинаковая.
#include <avr/interrupt.h>
#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>
int trigPin = 3; // назначаем имя для Pin8
int еchо = 2; // назначаем имя для Pin9
volatile unsigned char status;
volatile int tim = 0;
ISR(INT0_vect)
{
//проверяем уровень синала PD2( еchо )
if (PIND & (1 << 2)
)
{
TCNT1 = 0;
status = 1;
}
else
{
//задний фронт - запоминаем значение таймера
tim = TCNT1;
status = 2;
}
}
void int_ini(void)
{
//включим прерывания INT0 по нисходящему фронту
EICRA |= (1 << ISC00);
//разрешим внешнее прерывание INT0 и INT1
EIMSK |= (1 << INT0);
}
//----------
void TIMER_INI(void)
{
TCCR1A = 0x00; //обычный режим работы таймера
TCCR1B = B00000010; //предделитель
TIMSK1 = 0x00; //прерывание по переполнению нет
}
void USORT_Init(unsigned int ubrr) {
UBRR0H = (unsigned char)(ubrr >>

;
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = 0x06; /* Set frame format: 8data, 2stop*/
UCSR0C = (1 << USBS0) | (3 << UCSZ00);
}
void UARTSend(uint8_t data) {
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}
void chislo_printin (unsigned char seg)
{
switch (seg)
{
case 1: UARTSend('1'); break;
case 2: UARTSend('2'); break;
case 3: UARTSend('3'); break;
case 4: UARTSend('4'); break;
case 5: UARTSend('5'); break;
case 6: UARTSend('6'); break;
case 7: UARTSend('7'); break;
case 8: UARTSend('8'); break;
case 9: UARTSend('9'); break;
case 0: UARTSend('0'); break;
}
}
//}
void chislo_print(unsigned int number)
{
unsigned int r1 = number % 10;
unsigned int r3 = number / 100;
unsigned int r2 = (number - r3 * 100) / 10;
chislo_printin(r3);
chislo_printin(r2);
chislo_printin(r1);
}
void data_ini(void)
{
DDRD |= (1 << 3); // назначаем trig, как выход
DDRD &= ~(1 << 2); // назначаем еchо, как вход
}
void hs_sro4_ini(void)
{
PORTD &= ~(1 << 3);;
_delay_us(2);
PORTD |= (1 << 3);
_delay_us(10);
PORTD &= ~(1 << 3);
}
int main(void)
{
data_ini();
USORT_Init(103);// подключаем монитор порта//speed 9600
TIMER_INI();
int_ini();
sei();
while (1)
{
hs_sro4_ini();
int cm; // назначаем переменную "cm" для показаний датчика
status = 0;
while ( status != 2 );
cm = tim / 58 / 2; // вычисляем расстояние в сантиметрах
chislo_print(cm); // выводим расстояние в сантиметрах
UARTSend('c');
UARTSend('m');
UARTSend(0x0d);
UARTSend(0x0a);
_delay_ms(1000); // ставим паузу в 1 секунду
}
}