napisz kod w bascom avr dla procesora atmega 8 na zewnetrznym kwarcu 16mhz do obslugi czujnika odlegloosci HC-SR04 i korekcja wskazan dla roznych temperatur powietrza . temperatura aktualna powietrza bedzie w zmiennej "TM_P"
TM_P
(°C). '==============================================================
' HC-SR04 + korekcja temperaturowa
' MCU : ATmega8 | F_CPU : 16 MHz (kwarc zewnętrzny)
'==============================================================
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 9600 ' UART – podgląd wyników (opcjonalnie)
'------------- Konfiguracja pinów --------------------------------
Config Portd.0 = Output ' TRIG -> PD0
Config Portd.1 = Input ' ECHO -> PD1
Trig Alias Portd.0
Echo Alias Pind.1 ' odczyt stanu pinu
'------------- Konfiguracja Timer1 --------------------------------
' Tryb normal, preskaler = 8 => 1 tik = 0,5 µs
Config Timer1 = Timer, Prescale = 8
'------------- Zmienne robocze -----------------------------------
Dim Echo_ticks As Word ' tiks Timer1 (0,5 µs)
Dim Echo_timeus As Single ' czas echa [µs]
Dim Distance_cm As Single ' wynik końcowy [cm]
Dim V_sound As Single ' prędkość dźwięku [m/s]
Dim TM_P As Single ' aktualna temperatura [°C]
Dim Timeout_cnt As Word
Const Tick_us = 0.5 ' 1 tik = 0,5 µs
Const Echo_timeout_us = 30000 ' 30 ms (ok. 5 m w jedną stronę)
'------------- Inicjalizacja -------------------------------------
Print "HC-SR04 + kompensacja T"; CrLf
Print "Start pomiaru…" ; CrLf
TM_P = 20 ' wartość domyślna, nadpisywana z czujnika
'==============================================================
' G Ł Ó W N A P Ę T L A
'==============================================================
Do
Gosub Measure_HCSR04
If Distance_cm > 0 Then
Print "Temp=" ; Fusing(TM_P , "#.#") ; "C | Odleglosc=" ; _
Fusing(Distance_cm , "##0.0") ; "cm"
Else
Print "Brak echa / poza zakresem"
End If
Waitms 100 ' >=60 ms wg dokumentacji
Loop
End
'==============================================================
' P R O C E D U R A P O M I A R U
'==============================================================
Measure_HCSR04:
'---- impuls TRIG ≥10 µs -------------------------------------------------
Reset Trig
Waitus 2
Set Trig
Waitus 12 ' impuls 12 µs
Reset Trig
'---- oczekiwanie na zbocze narastające ECHO -----------------------------
Timeout_cnt = 0
While Echo = 0
Incr Timeout_cnt
If Timeout_cnt > 60000 Then ' ~30 ms
Distance_cm = -1
Return
End If
Wend
'---- pomiar czasu trwania poziomu wysokiego ------------------------------
Tcnt1 = 0 ' zeruj licznik
Set Tifr.Tov1 ' zeruj flagę przepełnienia
Start Timer1 ' preskaler 8 już ustawiony
While Echo = 1
If Tifr.Tov1 = 1 Then ' timeout – brak echa w zakresie HC-SR04
Stop Timer1
Distance_cm = -1
Set Tifr.Tov1
Return
End If
Wend
Stop Timer1
Echo_ticks = Tcnt1
'---- przeliczenia --------------------------------------------------------
Echo_timeus = Echo_ticks * Tick_us ' µs
V_sound = 331.3 + 0.606 * TM_P ' m/s (aktualna prędkość dźwięku)
Distance_cm = Echo_timeus * 1e-6 * V_sound * 100 / 2 ' cm
'---- weryfikacja specyfikacji czujnika -----------------------------------
If Distance_cm < 2 Or Distance_cm > 400 Then Distance_cm = -1
Return
Zasada HC-SR04
• Impuls TRIG ≥ 10 µs inicjuje 8 fal 40 kHz.
• Pin ECHO przechodzi na stan wysoki na czas powrotu sygnału (tam + z powrotem).
Pomiar czasu
• Timer1 (16 bit) z podziałem /8 → 2 MHz → 0,5 µs/ tik.
• Zakres bez przepełnienia ≈ 32,8 ms (≈ 5,6 m), wystarczające dla HC-SR04 (max 4 m).
Korekcja temperaturowa
• Prędkość dźwięku: v [m/s] ≈ 331,3 + 0,606·T[°C].
• Odległość: d [cm] = t[µs]·v·10⁻⁶·100 / 2.
Obsługa błędów / timeoutów
• Dwa progi: brak zbocza początkowego oraz przepełnienie Timer1.
• Wartość –1 cm sygnalizuje błąd (można zmodyfikować pod własny interfejs).
Integracja czujnika temperatury
• TM_P
musi być cyklicznie aktualizowana np. z DS18B20, NTC + ADC lub BME280.
• Rozdzielczość temperatury ±0,5 °C daje błąd odległości ok. ±0,1 %.
Kalibracja
• Dodatkowo uwzględnij wilgotność i ciśnienie (wpływają < 0,5 % w typowych warunkach).
• W aplikacjach precyzyjnych wykonaj kalibrację w docelowej obudowie.
PulseIn
, jednak pomiar sprzętowym timerem (jak w kodzie) jest szybszy i eliminuje zakłócenia przerwań. Waitus
w BASCOM wykorzystuje dokładne pętle ASM, co gwarantuje stabilny impuls TRIG. Zaprezentowany program w BASCOM-AVR łączy tradycyjny czujnik HC-SR04 z korekcją temperaturową bazującą na zmiennej TM_P
. Wykorzystanie Timer1 (0,5 µs/tik) gwarantuje precyzyjny pomiar, a pełna obsługa timeoutów i weryfikacja zakresu czynią kod odpornym w praktycznych aplikacjach. Rozwiązanie jest kompatybilne z każdą płytką ATmega8 @ 16 MHz i stanowi solidny punkt wyjścia do dalszej rozbudowy (LCD, Modbus, LoRa WAN).