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).