Проблемы с УЗ-дальнометром HC-SR04.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Получил эту фигню, значит. А что с ней дальше делать? Правильно, работать с нею надо. Так вот, завел я Echo на INT0, а Trig-3 бит порта D восьмой меги. Проблема в том,что в терминале-почти рандомные числа. Хотя при отключении дальнометра в терминале ничего не выводится. Вывод INT0 подтянут к земле резистором 2.4КОм. Кварц внешний на 10 МГц. Код в IAR-е:

Код: Выделить всё

#include<iom8.h>
#include <intrinsics.h>
#include "CPU_settings.h"
#include "makros.h"
#include "ks0066(wh0802).h"
int t;
char f=0;
int k=0;
unsigned char data;
char h=0;
char y=0;
int main()
{
DDRB=255;
CB(DDRD,2);
SB(DDRD,3);
CB(TCCR0,CS01);
SB(TCCR0,CS00);
CB(TCCR0,CS02);
TCNT0=0;
UCSRB|=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
UBRRH=0x00; 
UBRRL=64;
SB(MCUCR,ISC00);
CB(MCUCR,ISC01);
asm("sei");
while(1)
{
PORTD_Bit3=1;
delay_us(10);
PORTD_Bit3=0;
SB(GICR,INT0);
while(f!=2);
f=0;
t=int((y*255/10)+(h/10));
t=t/58;
data=(t%100)%10+0x30;
SB(UCSRB,UDRIE);
data=(t%10)+0x30;
SB(UCSRB,UDRIE);
t=0;
data='\n';
SB(UCSRB,UDRIE);
data='\r';
SB(UCSRB,UDRIE);
delay_ms(1000);
}
}
#pragma vector=INT0_vect
__interrupt void INT0_vector(void)//Функция прерывания
{
if((PIND_Bit2==1)&&(f==0))
{
k=0;
h=0;
y=0;
TCNT0=0;
SB(TIMSK,TOIE0);
f=1;
}
else
{
if((PIND_Bit2==0)&&(f==1))
{
h=TCNT0;
y=k;
CB(TIMSK,TOIE0);
f=2;
}
}
}
#pragma vector=TIMER0_OVF_vect 
__interrupt void T0_ovf(void)//Функция прерывания
{
k++;
}
#pragma vector =USART_UDRE_vect
__interrupt void UART_UDRE(void)
{
UDR=data;
CB(UCSRB,UDRIE);
}
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

После долгого мучения дальнометра кое-что выяснилось.... Направил в потолок(метра 2-2.5),в терминалку выводил кол-во переполнений таймера. Хм, оно колебалось от 650 до 100..... Что не так с моим кодом? :(
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Что-то код для меня непонятен. Может на васике пойдет: http://avrproject.ru/publ/kak_podkljuch ... 4/2-1-0-51
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Видел этот код, но там читерская команда pulsen. :(
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

ну так приспособить ардуиновскую иль самому написать

Код: Выделить всё

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
{
	// cache the port and bit of the pin in order to speed up the
	// pulse width measuring loop and achieve finer resolution.  calling
	// digitalRead() instead yields much coarser resolution.
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	uint8_t stateMask = (state ? bit : 0);
	unsigned long width = 0; // keep initialization out of time critical area
	
	// convert the timeout from microseconds to a number of times through
	// the initial loop; it takes 16 clock cycles per iteration.
	unsigned long numloops = 0;
	unsigned long maxloops = microsecondsToClockCycles(timeout) / 16;
	
	// wait for any previous pulse to end
	while ((*portInputRegister(port) & bit) == stateMask)
		if (numloops++ == maxloops)
			return 0;
	
	// wait for the pulse to start
	while ((*portInputRegister(port) & bit) != stateMask)
		if (numloops++ == maxloops)
			return 0;
	
	// wait for the pulse to stop
	while ((*portInputRegister(port) & bit) == stateMask) {
		if (numloops++ == maxloops)
			return 0;
		width++;
	}

	// convert the reading to microseconds. The loop has been determined
	// to be 20 clock cycles long and have about 16 clocks between the edge
	// and the start of the loop. There will be some error introduced by
	// the interrupt handlers.
	return clockCyclesToMicroseconds(width * 21 + 16); 
} 
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Вот ардуиновская функция мне не очень-то как раз понятна...
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

может оформите работу с USART как тут:
http://chipenable.ru/index.php/programm ... terom.html
наверное будет понятнее
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Не стал плодить темы, ситуация следующая: приобрел данный девайс, написал прошивку, подключил, результат нулевой.
Стал разбираться. Похоже у меня проблема с центральной микросхемой, это явно какой-то контроллер с затертой маркировкой, но по распиновке я его идентифицировать не смог. Судя по всему он просто не запускается. Подаю импульс 10мкс - на выходе постоянная "1", на ногах которые идут на кварц - на одной всегда четкий меандр, на второй - ноль, ноги идущие на входы MAX3232 и на ключ ее питания - ноль, соответственно передатчик просто не работает. Питание в норме - 5.05В, пульсации 0.5мВ. Заметил что если подергать конденсаторы в цепи питания, например перевернуть керамику 0.1мкФ (на макетке стоит электролит и керамика), то иногда схема начинает работать, на выходе появляется импульс пропорционально расстоянию до препятствия, на второй ноге кварца появляется "1", и видны импульсы управления и питания max3232. В чем глюк? Может есть какая-то хитрая последовательность в запуске дальномера, о которой не написано в даташите?

PS:Схему нашел, оказывается в центре "одноразовый" контроллер...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Ответить

Вернуться в «Периферия»