Перейти к содержанию

Подключение Ультразвукового Датчика Hc-Src4


deemn72835

Рекомендуемые сообщения

Вопрос к тем кто имел дело с подключением ультразвукового датчика HC-SRC4 к avr микроконтроллеру, именно к attiny 2313a. Подскажите как написать код программы на СИ. В интернете нашел несколько статей для других МК. Пробовал переписать в CodevisionAVR, но ничего так и не заработало. В некоторых случаях датчик издает щелчки некоторое время, но по UART не передает. Из статей понял, что нужно отправлять импульс и ловить его с помощью таймера через внешнее прерывание. После компиляции в Codevision выдает ошибку Warning: overflow is possible in 16 bit multiplication, casting to 'long' may be required, также когда переписывал заметил что в attiny2313a в UART нет регистра URSEL.

Вот код, подскажите где неправильно:

#define F_CPU 8000000UL

#include <tiny2313a.h>

#include <delay.h>

#include <stdio.h>

//определяем ножку Echo

#define Echo_PORT PORTD

#define Echo_DDR DDRD

#define Echo_PIN PIND

#define Echo_N 3

//определяем ножку Trig

#define Trig_PORT PORTD

#define Trig_DDR DDRD

#define Trig_PIN PIND

#define Trig_N 4

void HC_SRC4_Init(void)

{

//устанавливаем ножки на выход и вход соответственно

Trig_DDR |= 1<<Trig_N;

Trig_PORT &= ~(1<<Trig_N);

Echo_DDR &= ~(1<<Echo_N);

Echo_PORT &= ~(1<<Echo_N);

}

void HC_SRC4_Send_strob(void) // отправляем 20мкс Строб

{

Trig_PORT |= 1<<Trig_N; //устанавливаем ЛОГ 1

delay_us(20); //длительность импульса

Trig_PORT &= ~(1<<Trig_N); //устанавливаем ЛОГ 0

}

void init_interp (void) //разрешение прерываний по любому фронту

{

MCUCR |=(1<<ISC10); //Прерывание по любому фронту

GIFR |= (1<<INT1); //разрешение прерывания на INT0

}

#define Start 1

#define Stop 0

unsigned int timer_Start_Stop (char flag) //функция Запуска и Остановки

{

unsigned int rez; // для хранения тактов

if(flag)

{

TCNT1H = 0; //обнуляем

TCNT1L = 0;

TCCR1B |=(1<<CS11); //запуск таймера с предделителем 8

}

else

{

TCCR1B &= ~(1<<CS11); //Останавливаем таймер

rez = TCNT1H;

rez <<= 8;

rez |=TCNT1L;

return rez;

}

}

//функция преобр числа насчитанных тактов в растояние

unsigned int HC_SRC4_Convert_CM (unsigned int N_t)

{

unsigned long int C;

C = N_t * 8; //определяем время импульса

C /= 58; // вычисляем расстояние в сантиметрах

C +=2;

return (unsigned int)C;

}

unsigned int N_takt=0;

interrupt [EXT_INT1] void ext_int1_isr(void)

{

if(Echo_PIN & (1<<Echo_N)) //если передний фронт

timer_Start_Stop (Start); //Запускаем таймер

else //если задний фронт

N_takt = timer_Start_Stop (Stop); //останавливаем таймер

}

unsigned int HC_SRC4_Get_CM (void)

{

HC_SRC4_Send_strob(); //отправляем строб

delay_ms(100);

return HC_SRC4_Convert_CM(N_takt); //возвращаем значение в СМ

}

#define BAUD 2400

#define UBRR_VAL F_CPU/16/BAUD-1

void usart_init (unsigned int speed)

{

// устанавливаем скорость Baud Rate: 4800

UBRRH=(unsigned char)(speed>>8);

UBRRL=(unsigned char) speed;

UCSRA=0X00;

UCSRB|=(1<<TXEN)|(1<<RXEN);// Разрешение работы приемника

// Установка формата посылки: 8 бит данных, 1 стоп-бит

UCSRC=(1<<UCSZ1)|(1<<UCSZ0);

}

//функция передачи инф по юарт с контролем флага

void Uart_tr (char s[])

{

char k;

for (k=0;s[k]!=0;k++)

{

UDR=s[k];

while(!(UCSRA&(1<<TXC)));//ждем окончания передачи

UCSRA|=(1<<TXC);//сбрасываем флаг

}

}

// Standard Input/Output functions

void main(void)

{

char Buuf[10];

// Declare your local variables here

// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=(1<<CLKPCE);

CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

// Input/Output Ports initialization

// Port A initialization

// Function: Bit2=In Bit1=In Bit0=In

DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);

// State: Bit2=T Bit1=T Bit0=T

PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port D initialization

// Function: Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In

DDRD=(0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit6=T Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T

PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// External Interrupt(s) initialization

// INT0: Off

// INT1: On

// INT1 Mode: Any change

// Interrupt on any change on pins PCINT0-7: Off

// Interrupt on any change on pins PCINT8-10: Off

// Interrupt on any change on pins PCINT11-17: Off

MCUCR=(0<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);

GIMSK=(1<<INT1) | (0<<INT0) | (0<<PCIE0) | (0<<PCIE2) | (0<<PCIE1);

GIFR=(1<<INTF1) | (0<<INTF0) | (0<<PCIF0) | (0<<PCIF2) | (0<<PCIF1);

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: On

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud Rate: 2400

UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);

UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

UCSRC=(0<<UMSEL1) | (0<<UMSEL0) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);

UBRRH=0x00;

UBRRL=0xCF;

HC_SRC4_Init();

usart_init(UBRR_VAL);

init_interp();

// Global enable interrupts

#asm("sei")

while (1)

{

sprintf(Buuf,"%d ",HC_SRC4_Get_CM());

Uart_tr(Buuf);

delay_ms(900);

}

}

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...