Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/144: Рейтинг темы: голосов - 144, средняя оценка - 4.94
riftix
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 5
1

Ультразвуковой дальномер HC-SR04 и AVR

18.03.2012, 00:15. Просмотров 26128. Ответов 28
Метки нет (Все метки)

Здравствуйте!
Помогите пожалуйста решить проблему с программой получения данных у дальномера HC-SR04. Уже две недели бьюсь над программой, всё никак не выходит.
Программа
Код
.include "m16def.yms"   ; Используем ATMiko16

;- Макросы ------------------------------------------------------------
;Установить бит без испльзования регистров
.MACRO   SITBM
.if @0 < 0x20
SBI   @0,@1
.else
.if @0<0x40
PUSH   R17
IN   R17,@0
ORI   R17,1<<@1
OUT   @0,R17
POP   R17
.else
PUSH   R17
LDS   R17,@0
ORI   R17,1<<@1
STS   @0,R17
POP   R17
.endif
.endif
.ENDM

;Установить бит с регистрами
.MACRO   SITB
.if @0 < 0x20         ; Low IO
SBI   @0,@1
.else
.if @0<0x40      ; High IO
IN   @2,@0
ORI   @2,1<<@1
OUT   @0,@2
.else         ; Memory
LDS   @2,@0
ORI   @2,1<<@1
STS   @0,@2
.endif
.endif
.ENDM
;......................................................................
;Очитсить бит с регистрами
.MACRO   CLRB
.if @0 < 0x20         ; Low IO
CBI   @0,@1
.else
.if @0<0x40      ; High IO
IN   @2,@0
ANDI   @2,~(1<<@1)
OUT   @0,@2
.else         ; Memory
LDS   @2,@0
ANDI   @2,~(1<<@1)
STS   @0,@2
.endif
.endif
.ENDM

;Очистить бит без испльзования регистров
.MACRO   CLRBM
.if @0 < 0x20
CBI   @0,@1
.else
.if @0<0x40
PUSH   R17
IN   R17,@0
ANDI   R17,~(1<<@1)
OUT   @0,R17
POP   R17
.else
PUSH   R17
LDS   R17,@0
ANDI   R17,~(1<<@1)
STS   @0,R17
POP   R17
.endif
.endif
.ENDM
;......................................................................

.MACRO   INVB
.if   @0 < 0x40
IN   @2,@0
LDI   @3,1<<@1
EOR   @3,@2
OUT   @0,@3
.else
LDS   @2,@0
LDI   @3,1<<@1
EOR   @2,@3
STS   @0,@2
.endif
.ENDM

.MACRO   INVBM
.if   @0 < 0x40
PUSH   R16
PUSH   R17
IN   R16,@0
LDI   R17,1<<@1
EOR   R17,R16
OUT   @0,R17
POP   R17
POP   R16
.else
PUSH   R16
PUSH   R17
LDS   R16,@0
LDI   R17,1<<@1
EOR   R17,R16
STS   @0,R17
POP   R17
POP   R16
.endif
.ENDM

.macro    UOUT
.if   @0 < 0x40
OUT   @0,@1
.else
STS   @0,@1
.endif
.endm
; Использование макросов установки и сброса битов ---------------------

;SITB byte,bit,temp
;CLRB byte,bit,temp
;INVB byte,bit,temp,temp2

;SITBM byte,bit
;CLRBM byte,bit
;INVBM byte,bit

;----------------------------------------------------------------------

.MACRO outi
PUSH   R16
LDI R16,@1
OUT @0,R16
POP       R16
.ENDMACRO

.MACRO LDIL
PUSH   R17   ; Сохраним значение одного из старших регистров в стек.
LDI   R17,@1   ; Загрузим в него наше непосредственное значение
MOV   @0,R17   ; перебросим значение в регистр младшей группы.
POP    R17   ; восстановим из стека значение старшего регистра.
.ENDM
;- Конец макросов -----------------------------------------------------

;- Прерывания ---------------------------------------------------------
.CSEG
.ORG $000        ; (RESIT)
RJMP   Riset
.ORG $002
rjmp INIT0       ; (INT0) External Ymtirrupt Request 0
.ORG $004
rjmp INIT1       ; (INT1) External Ymtirrupt Request 1
.ORG $006
RETI            ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $008
RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG $00A
RETI            ; (TIMER1 CAPT) Timer/Counter1 Capture Ivimt
.ORG $00C
RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG $00E
RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG $010
RJMP TYM1_OVF    ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG $012
RJMP Timer0      ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG $014
RETI             ; (SPI,STC) Serial Transfer Complete
.ORG $016
RETI             ; (USORT,RXC) USORT, Rx Complete
.ORG $018
RETI             ; (USORT,UDRE) USORT Data Register Empty
.ORG $01A
RETI             ; (USORT,TXC) USORT, Tx Complete
.ORG $01C
Reti            ; (ADC) ADC Conversion CompleteISC0 1 53COM1A 6 47ISC0 1 53
.ORG $01E
RETI             ; (EE_RDY) EEPROM Ready
.ORG $020
RETI             ; (ANA_COMP) Analog Comparator
.ORG $022
RETI             ; (TWI) 2-wire Serial Interfosi
.ORG $024
RETI             ; (INT2) External Ymtirrupt Request 2
.ORG $026
RETI             ; (TIMER0 COMP) Timer/Counter0 Compare Match
.ORG $028
RETI             ; (SPM_RDY) Store Prokram Memory Ready

.ORG   INT_VECTORS_SIZE         ; Конец таблицы прерываний

;---- I -----------------------------------------------------------------
INIT1:

PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,0            ; Сравниваем флаг с 0
BRNE   Exit1          ; Переход если не равно (значит уже идёт измерние)

LDI flag,1             ; Если был флаг 0, то "взводим" флаг на измерение
;   OUTI GICR, 0x00         ; Запрет внешних прерываний

Exit1:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16

RETI
;---- II --------------------------------------------------------------
TIMER0:

PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,1            ; Сравниваем флаг с 1
BREQ  trig            ; Переход если равно (значит готов)
RJMP  Exit0
Trig:
LDI flag,2                ; флаг
SITB PORTB, 4, R16          ; Импульс 10 мс (80 тактов) 30 раз в сек ( 8МГц/1024/256)
LDI   R17,20               ; Счетный регистр

Loop1:

DEC   R17               ; Уменьшаем счетчик
BRNE   Loop1

CLRBM PORTB, 4
LDI flag,3                ; флаг
OUTI GICR, 0xc0            ; Прерывание по фронту для echo
Exit0:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16

RETI
;---- III - IV ----------------------------------------------------------
INIT0:
PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,4            ; Сравниваем флаг с 4
BREQ   Falling         ; Переход если равно (словили падение напряжения - конец измеряемого уровня)

CPI   flag,3            ; Сравниваем флаг с 3
BREQ   Rising          ; Переход если равно (начался импульс)
Rjmp    Exit          ; Если флаг не 3 или 4, значит не готовы
Rising:                  ; Фронт измеряемого импульса

OUTI TCCR1B, 0x02      ; Запуск таймера, предделитель 8 (1МГц)
OUTI TIMSK, 0x04      ; Прерывание по переполнению
LDI flag,4             ; Поднимаем флаг
OUTI MCUCR, 0x0a      ; Прерывание по спаду на INT0
RJMP Exit               ; Завершаем прерывание

Falling:               ; Конец измеряемого импульса

IN  count0, TCNT1L      ; Забираем время
IN  count1, TCNT1H

clr flag            ; Опускаем флаг
OUTI MCUCR, 0x0b      ; Прерывание фронту
OUTI TCCR1B, 0x02      ; Останавливаем таймер

LDI R16, 0x00         ; Оищаем таймер
OUT   OCR1AH,R16
OUT   OCR1AL,R16
setbm PORTD, 6            ; Измерение завршено, зажигаем светик

Exit:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16
RETI               ; Спокойно выходим. Регистры вернул как было.
;----------------------------------------------------------------------
TYM1_OVF : ; Переполнение таймера
INC count2 ; Увеличиваем старший разряд счётчика
Reti
;----------------------------------------------------------------------

; Инициализация

.def temp = R16
.def temp2 = R17
.def flag = R18
.def count0 = R20
.def count1 = R21
.def count2 = R22

Riset:
LDI R16,Low(ROMEND)      ; Инициализация стека
OUT SPL,R16

LDI R16,High(ROMEND)
OUT SPH,R16

OUTI DDRA,0x00         ; Порт A на вход
OUTI DDRB,0xFF         ; Порт В на выход
OUTI DDRC,0xFF         ; Порт C на выход
OUTI DDRD, 0b11110011   ; Порт D на выход но INT0 и INT1 на вход
OUTI PORTD,0b00001000

OUTI TCCR0, 0x04      ; Прерывания для таймера
OUTI TIMSK, 0x01

OUTI GICR, 0x80         ; Прерывание по низкому уровню на INT1
OUTI MCUCR, 0x0b

LDI R16, 0x00         ; Оищаем таймер
OUT   OCR1AH,R16
OUT   OCR1AL,R16

sei                     ;разрешить прерывания

; Тело программы ------------------------------------------------------
go:

CPI   count2,0      ; Сравниваем
BRNE no            ; Если не равно то далеко

CPI   count1,0x04     ; Сравниваем
BRCC no            ; Если больше то далеко

CPI   count0,0x88     ; Сравниваем
BRCC no            ; Если больше то далеко

yes:               ; Иначе зачение меньше 488 (20см)
setbm PORTD, 4      ; Препятствие близко, зажигаем светик
RJMP go

no:   CLRBM PORTD, 4      ; Препятствие далеко
rjmp go
Схема
<Изображение удалено>
Фьюзы (v=8МГц от внутреннего генератора)
<Изображение удалено>
В трассировке всё работает нормально - кол-во тактов/8 загружается в регистры count0-2, но в железе ничего не работает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2012, 00:15
Ответы с готовыми решениями:

Ультразвуковой датчик HC-SR04 и МК ATtiny20
Здравствуйте! Необходима ваша помощь в написании программы, хоть советом, хоть куском кода, чем...

Ультразвуковой дальномер на МК
нужен код программы и схема ультразвукового дальномера на микроконтроллере.сделать надо на Atmel...

Ультразвуковой дальномер HC-SR04 + сервопривод
#include &lt;Servo.h&gt; #define coef 10 //(коэффициент соответствия 10 градусов на 1см) #define...

Ультразвуковой дальномер
Добрый день, господа. Прошу помощи в КР Quartus II. Тема: &quot;Блок управления импульсным...

Arduino nano и дальномер HC-SR04
Добрый день. Я новичек в Ардуино. Приобрел дальномер HC-SR04, написал простенький скетч для него,...

28
pyzhmom
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 49
18.03.2012, 10:27 2
Код
   OUTI DDRD, 0b11111011   ; Порт D на выход но INT0 на вход (Hi-Z)
OUTI PORTD,0b00000100
Подтяжка не помогает? Схемы нет поэтому судить сложно.
Код
SITBM PORTB, 4, R16
Что за конструкция?
И по времени обработки прерывания от таймера что-то сомнения берут, не прогонял.
0
riftix
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 5
18.03.2012, 12:47 3
Код:
SITBM PORTB, 4, R16Что за конструкция?

Ошибся немного, надо писать SITB PORTB, 4, R16.
Это мы ставим лог.1 на ногу Trig - посылаем импульс для начала измерения.

P.S.: Добавил схему и фьюзы в пост.
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
18.03.2012, 19:46 4
А что значит "не работает"? Что не делает, конкретней. Не входит в прерывание? Сигнала нет о дальности или что? Таймер работает? Мне почему-то не нравится его инициализация. Лень лезть в даташит, но такое ощущение, что чего-то там не хватает...
0
18.03.2012, 19:46
riftix
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 5
21.03.2012, 00:36 5
Цитата Сообщение от BykTiho
А что значит "не работает"? Что не делает, конкретней. Не входит в прерывание? Сигнала нет о дальности или что? Таймер работает? Мне почему-то не нравится его инициализация. Лень лезть в даташит, но такое ощущение, что чего-то там не хватает...
Светодиод не горит. В студии всё работает ( таймер считает время ), в железе нет. Все соединения на плате проверены тестером.
Переписал программу, всё четко расставлено по флагам.
Программа
Код
.include "m16def.yms"   ; Используем ATMiko16

;- Макросы ------------------------------------------------------------
;Установить бит без испльзования регистров
.MACRO   SITBM
.if @0 < 0x20
SBI   @0,@1
.else
.if @0<0x40
PUSH   R17
IN   R17,@0
ORI   R17,1<<@1
OUT   @0,R17
POP   R17
.else
PUSH   R17
LDS   R17,@0
ORI   R17,1<<@1
STS   @0,R17
POP   R17
.endif
.endif
.ENDM

;Установить бит с регистрами
.MACRO   SITB
.if @0 < 0x20         ; Low IO
SBI   @0,@1
.else
.if @0<0x40      ; High IO
IN   @2,@0
ORI   @2,1<<@1
OUT   @0,@2
.else         ; Memory
LDS   @2,@0
ORI   @2,1<<@1
STS   @0,@2
.endif
.endif
.ENDM
;......................................................................
;Очитсить бит с регистрами
.MACRO   CLRB
.if @0 < 0x20         ; Low IO
CBI   @0,@1
.else
.if @0<0x40      ; High IO
IN   @2,@0
ANDI   @2,~(1<<@1)
OUT   @0,@2
.else         ; Memory
LDS   @2,@0
ANDI   @2,~(1<<@1)
STS   @0,@2
.endif
.endif
.ENDM

;Очистить бит без испльзования регистров
.MACRO   CLRBM
.if @0 < 0x20
CBI   @0,@1
.else
.if @0<0x40
PUSH   R17
IN   R17,@0
ANDI   R17,~(1<<@1)
OUT   @0,R17
POP   R17
.else
PUSH   R17
LDS   R17,@0
ANDI   R17,~(1<<@1)
STS   @0,R17
POP   R17
.endif
.endif
.ENDM
;......................................................................

.MACRO   INVB
.if   @0 < 0x40
IN   @2,@0
LDI   @3,1<<@1
EOR   @3,@2
OUT   @0,@3
.else
LDS   @2,@0
LDI   @3,1<<@1
EOR   @2,@3
STS   @0,@2
.endif
.ENDM

.MACRO   INVBM
.if   @0 < 0x40
PUSH   R16
PUSH   R17
IN   R16,@0
LDI   R17,1<<@1
EOR   R17,R16
OUT   @0,R17
POP   R17
POP   R16
.else
PUSH   R16
PUSH   R17
LDS   R16,@0
LDI   R17,1<<@1
EOR   R17,R16
STS   @0,R17
POP   R17
POP   R16
.endif
.ENDM

.macro    UOUT
.if   @0 < 0x40
OUT   @0,@1
.else
STS   @0,@1
.endif
.endm
; Использование макросов установки и сброса битов ---------------------

;SITB byte,bit,temp
;CLRB byte,bit,temp
;INVB byte,bit,temp,temp2

;SITBM byte,bit
;CLRBM byte,bit
;INVBM byte,bit

;----------------------------------------------------------------------

.MACRO outi
PUSH   R16
LDI R16,@1
OUT @0,R16
POP       R16
.ENDMACRO

.MACRO LDIL
PUSH   R17   ; Сохраним значение одного из старших регистров в стек.
LDI   R17,@1   ; Загрузим в него наше непосредственное значение
MOV   @0,R17   ; перебросим значение в регистр младшей группы.
POP    R17   ; восстановим из стека значение старшего регистра.
.ENDM
;- Конец макросов -----------------------------------------------------

;- Прерывания ---------------------------------------------------------
.CSEG
.ORG $000        ; (RESIT)
RJMP   Riset
.ORG $002
rjmp INIT0       ; (INT0) External Ymtirrupt Request 0
.ORG $004
rjmp INIT1       ; (INT1) External Ymtirrupt Request 1
.ORG $006
RETI            ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $008
RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG $00A
RETI            ; (TIMER1 CAPT) Timer/Counter1 Capture Ivimt
.ORG $00C
RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG $00E
RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG $010
RJMP TYM1_OVF    ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG $012
RJMP Timer0      ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG $014
RETI             ; (SPI,STC) Serial Transfer Complete
.ORG $016
RETI             ; (USORT,RXC) USORT, Rx Complete
.ORG $018
RETI             ; (USORT,UDRE) USORT Data Register Empty
.ORG $01A
RETI             ; (USORT,TXC) USORT, Tx Complete
.ORG $01C
Reti            ; (ADC) ADC Conversion CompleteISC0 1 53COM1A 6 47ISC0 1 53
.ORG $01E
RETI             ; (EE_RDY) EEPROM Ready
.ORG $020
RETI             ; (ANA_COMP) Analog Comparator
.ORG $022
RETI             ; (TWI) 2-wire Serial Interfosi
.ORG $024
RETI             ; (INT2) External Ymtirrupt Request 2
.ORG $026
RETI             ; (TIMER0 COMP) Timer/Counter0 Compare Match
.ORG $028
RETI             ; (SPM_RDY) Store Prokram Memory Ready

.ORG   INT_VECTORS_SIZE         ; Конец таблицы прерываний

;---- I -----------------------------------------------------------------
INIT1:

PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,0            ; Сравниваем флаг с 0
BRNE   Exit1          ; Переход если не равно (значит уже идёт измерние)

LDI flag,1             ; Если был флаг 0, то "взводим" флаг на измерение
;   OUTI GICR, 0x00         ; Запрет внешних прерываний

Exit1:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16

RETI
;---- II --------------------------------------------------------------
TIMER0:

PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,1            ; Сравниваем флаг с 1
BREQ  trig            ; Переход если равно (значит готов)
RJMP  Exit0
Trig:
LDI flag,2                ; флаг
SITB PORTB, 4, R16          ; Импульс 10 мс (80 тактов) 30 раз в сек ( 8МГц/1024/256)
LDI   R17,20               ; Счетный регистр

Loop1:

DEC   R17               ; Уменьшаем счетчик
BRNE   Loop1

CLRBM PORTB, 4
LDI flag,3                ; флаг
OUTI GICR, 0xc0            ; Прерывание по фронту для echo
Exit0:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16

RETI
;---- III - IV ----------------------------------------------------------
INIT0:
PUSH   R16            ; Сохранили R16
IN   R16,SREG         ; Достали SREG в R16
PUSH   R16            ; Утопили его в стеке
PUSH   R17            ; Туда же утопили R17

CPI   flag,4            ; Сравниваем флаг с 4
BREQ   Falling         ; Переход если равно (словили падение напряжения - конец измеряемого уровня)

CPI   flag,3            ; Сравниваем флаг с 3
BREQ   Rising          ; Переход если равно (начался импульс)
Rjmp    Exit          ; Если флаг не 3 или 4, значит не готовы
Rising:                  ; Фронт измеряемого импульса

OUTI TCCR1B, 0x02      ; Запуск таймера, предделитель 8 (1МГц)
OUTI TIMSK, 0x04      ; Прерывание по переполнению
LDI flag,4             ; Поднимаем флаг
OUTI MCUCR, 0x0a      ; Прерывание по спаду на INT0
RJMP Exit               ; Завершаем прерывание

Falling:               ; Конец измеряемого импульса

IN  count0, TCNT1L      ; Забираем время
IN  count1, TCNT1H

clr flag            ; Опускаем флаг
OUTI MCUCR, 0x0b      ; Прерывание фронту
OUTI TCCR1B, 0x02      ; Останавливаем таймер

LDI R16, 0x00         ; Оищаем таймер
OUT   OCR1AH,R16
OUT   OCR1AL,R16
setbm PORTD, 6            ; Измерение завршено, зажигаем светик

Exit:

POP   R17
POP   R16
OUT   SREG,   R16
POP   R16
RETI               ; Спокойно выходим. Регистры вернул как было.
;----------------------------------------------------------------------
TYM1_OVF : ; Переполнение таймера
INC count2 ; Увеличиваем старший разряд счётчика
Reti
;----------------------------------------------------------------------

; Инициализация

.def temp = R16
.def temp2 = R17
.def flag = R18
.def count0 = R20
.def count1 = R21
.def count2 = R22

Riset:
LDI R16,Low(ROMEND)      ; Инициализация стека
OUT SPL,R16

LDI R16,High(ROMEND)
OUT SPH,R16

OUTI DDRA,0x00         ; Порт A на вход
OUTI DDRB,0xFF         ; Порт В на выход
OUTI DDRC,0xFF         ; Порт C на выход
OUTI DDRD, 0b11110011   ; Порт D на выход но INT0 и INT1 на вход
OUTI PORTD,0b00001000

OUTI TCCR0, 0x04      ; Прерывания для таймера
OUTI TIMSK, 0x01

OUTI GICR, 0x80         ; Прерывание по низкому уровню на INT1
OUTI MCUCR, 0x0b

LDI R16, 0x00         ; Оищаем таймер
OUT   OCR1AH,R16
OUT   OCR1AL,R16

sei                     ;разрешить прерывания

; Тело программы ------------------------------------------------------
go:

CPI   count2,0      ; Сравниваем
BRNE no            ; Если не равно то далеко

CPI   count1,0x04     ; Сравниваем
BRCC no            ; Если больше то далеко

CPI   count0,0x88     ; Сравниваем
BRCC no            ; Если больше то далеко

yes:               ; Иначе зачение меньше 488 (20см)
setbm PORTD, 4      ; Препятствие близко, зажигаем светик
RJMP go

no:   CLRBM PORTD, 4      ; Препятствие далеко
rjmp go
Может сам дальномер бракованный? Можно ли его как то проверить?
У меня есть старый аналоговый осцил, как с помощью него отладить схему? ( Trig и Echo с дальномера не омогу увидеть, видимо слишком редкие иголки)
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
21.03.2012, 06:53 6
Проверить можно только одним способом - подключить его к заведомо рабочей схеме.
Когда купил дальномер, то в инете нашел кучу ссылок по тому как его подключать и готовые программы для работы с ним. Они все на С, а я хочу на асме. Но там есть готовые hex файлы. Я пока еще не разбирался с дальномером. Но нет гарантии, что те проекты тоже рабочие, но все же...

Сейчас пересмотрел программу. Я не нашел в ней формулы преобразования длинны сигнала в расстояние (из даташита)
0
riftix
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 5
21.03.2012, 17:50 7
Цитата Сообщение от BykTiho
Сейчас пересмотрел программу. Я не нашел в ней формулы преобразования длинны сигнала в расстояние (из даташита)
Да, для того чтобы получить расстояние в см, нужно поделить результат на 58. Я это не делал и сравнивал с числом 1160 = 20 см.
Я вот думаю, может проще по быстрому выучить си?

UPD: Нашёл пример на ассемблере - http://www.ezdenki.com/ultrasonic.php. Сейчас пытаюсь его вкурить)
0
riftix
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 5
23.03.2012, 18:52 8
В общем я забил на ассемблер, тупо повторил реализацию отсюда http://avrproject.ru/publ/kak_podklj..._sr04/2-1-0-51.
Я просто офигел от простоты написания кода - если на ассемблере функция захвата времени импульса занимает примерно 50 команд, то в баскоме это всего одна команда - putsiin! Да и бейсик как то приятнее и роднее, чем жестокий и беспощадный асм.
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
06.07.2012, 16:28 9
Наверняка проблема до сих пор не решена? Возможно потому, что этому модулю нужно добавить кондер на 4,7 мкф между выводом Эхо и Землей. Это связано с тем, что на дуинах, для которых предназначена этот модуль, этот кондер стоит, и все работает просто отлично ;)
Добавьте кондер - и все заработает ;)
0
Dimys_K
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 191
08.07.2012, 08:12 10
Не нужно там никаких кондеров. Все и так прекрасно работает. Я такой локатор тоже покупал. Прицепил своей макетке, быстренько накидал программку на СИ и все работает. У вас наверно не работает все таки программа. В таком случае косяки в железе лучше всего искать с помощью осциллографа. Сначало убедитесь, что на ножке Trig есть запускающие импульсы и запускается ли вообще передатчик. Если все нормально, тогда проверяйте приемную часть (импульс на ножке Echo). У меня был случай, когда приемный датчик отказывал и схема уже с заведомо исправной программной не работала. Так что немного терпения и усердия и все найдется. )))
0
kyo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 4
26.07.2012, 17:55 11
Доброго пятничного вечера, господа!
Вы простите, я тут вклинюсь со своим ланчпадом, хоть он тут и ни при чем.
Суть такова. Приехало в понедельник ко мне всякое из соседней восточной страны. Среди этого всякого и вышеупомянутый HC-SR04. Вопрос, собственно, по нему.
Программку написал, пришел домой, включил - не работает. Ну стандартная история. Стал смотреть регистры и вижу - на ножке, куда подключаю триггер стоит 1. Ну я взял вольтметр, отключил всё от всего, подключил голый hc-sr04 к 5 В, померил - 5 В на ножке триггера.
Соответственно, вопрос - нормально ли это и как с этим быть?
Простите еще раз. Я новенький совсем, институтов не кончал (хотя, надеюсь, скоро), контроллер впервые попробовал три недели назад, как и С, и асм.
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
26.07.2012, 18:45 12
Цитата Сообщение от kyo
Программку написал, пришел домой, включил - не работает. Ну стандартная история. Стал смотреть регистры и вижу - на ножке, куда подключаю триггер стоит 1. Ну я взял вольтметр, отключил всё от всего, подключил голый hc-sr04 к 5 В, померил - 5 В на ножке триггера.
Соответственно, вопрос - нормально ли это и как с этим быть?.
Стандартный ответ - ищите ошибки... При отсутствии таковых, как правило, все работает.
0
kyo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 4
26.07.2012, 19:15 13
Ну это я, как правило, делаю перед тем, как что-либо постить на форумах.
Тут с моей стороны какие могут быть ошибки? Я подключил питание датчика. Он должен тихонько лежать, молчать, ждать сигнал 5 В в течение 10 мкс на ножку триггера. А он же нифига не так делает. Он выдает 5 В с этой ножки. Судя по всем даташитам на это устройство (коих много и они отличаются, например, максимальной длинной), так быть не должно. Брак?
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.07.2012, 20:12 14
может ножка просто подтянута высокоомным резистором к плюсу, правда неясно зачем. попробуйте поставить резистор между триг и землёй килоом на 10. Уменьшится напряжение?
0
kyo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 4
28.07.2012, 20:16 15
Спасибо! Проверил - подтянуто. Резистор между триггером и землей понижение дает, но толку нет - сигнал на триггер я не могу подать.
Отпаял к черту этот подтягивающий резистор, поставил конденсатор между эхом и землей (правда, 1 мкФ, под рукой только он был) - все заработало. И даже от ланчпадовских 3,5 В.
0
Krokozibt
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 59
16.11.2012, 18:17 16
Встретил в продаже такой же модуль только с температуной компенсацией. Что она дает? Может не переплачивать и взять дешевый без нее?
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
16.11.2012, 20:32 17
скорость звука меняется от температуры http://bettly.ru/tabulky/rychlost-zvuku-vzduch.htm
То есть как бэ повышается точность на жаре и холоде.
Но имхо нафиг не надо
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
16.11.2012, 20:34 18
Цитата Сообщение от Krokozibt
Встретил в продаже такой же модуль только с температуной компенсацией. Что она дает? Может не переплачивать и взять дешевый без нее?
Скорость звука в воздухе смльно зависит от его температуры. Точные данные не помню, но вполне реально иметь порядка 320-350 м/c. Если такая погрешность вам по фигу - можете использовать одно значение, выбрав его по наиболее вероятной температуре в реальных условиях. К примеру, у меня в комнате летом может доходить до 36-38 градусов, а зимой - упасть и до 13-14, если вовремя печку не протопить.

Скорость звука еще зависит и от атмосферного давления (например, в Алма-ате оно обычно 680-690 мм). Но в меньшей степени, чем от температуры, да и относительные изменения его для конкретной точки местности - невелики.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
16.11.2012, 20:41 19
Скорость звука не зависит от температуры среды, она зависит от ее плотности. Если от температуры меняется плотность, меняется и скорость звука. Это хорошо разжевано в инструкциях плотномеров Omton Paar.
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
16.11.2012, 20:50 20
Цитата Сообщение от omokost
Скорость звука не зависит от температуры среды, она зависит от ее плотности.
А какая хрен разница при конкретном использовании УЗ дальномера, например, на роботе?
Вы предлагаете вместо температуры, для уточнения результата, мерять плотность воздуха?
Вряд ли это будет проще и практичней...
0
16.11.2012, 20:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 20:50

Ультразвуковой дальномер без МК
Друзья, озадачился следующим вопросом: можно ли каким-либо образом обойтись только...

дальномер HC-SR04+stm32F100C8T6 Gated mode врет
Здравствуйте. При попытке расчитать длину импульса силами периферии столкнулся со следующей...

Ультразвуковой сенсор HC-SR04 и Arduino
И еще один вопрос. Ультразвуковой датчик расстояния HC-SR04 я как то могу подключить к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru