Finde den thread auch toll und weil noch ein Programm zur Zeitnahme mit dem ICP fehlt, hab ich mich mal versucht. Ist zwar nicht ganz schlank geworden, enthält aber noch eine alternative Bursterzeugung.

Gruß
Searcher


Code:
'###################################################
'File: US-Meßprogramm_ICP.bas
'IDE: BASCOM-AVR DEMO Version 2.0.5.0
'Meßprogramm zum Messen von US-Laufzeit mit RN Wiki US-Interface
'Messung wird erst gestartet, wenn der Burst komplett gesendet wurde
'Messung wird gestoppt mit Eintreffen des 0 nach 1 Wechsel auf PA7 (ICP)
'
'ATtiny24
'PB2 : Mit Taster den Burst und Messen starten
'PA7 : (ICP) - Meßpulsempfang vom Interface
'PA3 : SW UART #2 , 40kHz Burst Ausgang zum Interface
'PB0 : SW UART #1 , für Ausgabe der Meßwerte an 4 fach 7-Segmentanzeige
'#######################################################

$regfile = "attiny24.dat"
$framesize = 32
$swstack = 32
$hwstack = 36
$crystal = 8000000                      'interner Oszillator

'##### Definitionen und Initialisierung für 7segment ausgabe ######
Dim Num_to_disp As Word
Dim Y As Byte
Dim Helperbyte As Byte
Dim Index As Byte
Dim Disp_string As String * 6
Dim Digit_char As String * 1
Declare Sub Display_value(num_to_disp As Word)
Open "comb.0:115200,8,n,1" For Output As #1       'comb.0 -> TX ist Pin PB0
Helperbyte = Lookup(17 , Segmentpattern)       'segment g
For Y = 1 To 5 : Put #1 , Helperbyte : Next       '7 segment initialisieren
'#### Ende Definitionen und Initialisierung für 7 Segmentausgabe #######


Dim Flag_ausgabe_fertig As Byte
Dim Flag_messung_fertig As Byte
Dim Inputcapture_wert As Word
Porta = Porta Or &B11110111             'alle Pullips auf porta einschalten, Ausnahme PA3
Portb = Portb Or &B11111110             'alle Pullups auf portb einschalten, Ausnahme PB0

Config Timer1 = Timer , Capture Edge = Rising , Prescale = 8       'Timer mit 1Mhz und ICP gestartet (8Mhz Systemclk)
On Capture1 Isr_zeitnahme               'Bei Input Capture Event zur ISR für Zeitnahme
Open "coma.3:80000,8,n,1" For Output As #2       'coma.3 -> 40kHz Burst auf PA3 mit SW-UART
Enable Interrupts

Do                                      'Beginn Hauptprogramm
  Do                                    'Warten auf Tastendruck (PB2 nach GND Wechsel)
    Debounce Pinb.2 , 0 , Start_mit_burst
  Loop

Start_mit_burst:
  Print #2 , "UUUU" ;                   'Burst Erzeugung (Jedes U erzeugt 5 Pulse)
  Flag_ausgabe_fertig = 0
  Flag_messung_fertig = 0
  Timer1 = 0                            'Timerzähler (TCNT1) mit 0 initialisieren, Meßzeit beginnt
  Set Tifr1.icf1                        'Eventuell anstehendes Input Capture Flag löschen
  Enable Capture1                       'Input Capture Interrupt scharf machen

  Do                                    'Schleife zum Warten auf Meßende/Ausgabeende
    If Flag_messung_fertig = 1 Then
      Call Display_value(inputcapture_wert)
      Flag_ausgabe_fertig = 1
    End If
  Loop Until Flag_ausgabe_fertig = 1    'Ende Warterei wenn Anzeige des Meßwertes erfolgt ist
Loop                                    'Loop Hauptprogramm

Isr_zeitnahme:                          'Ansprung bei Input Capture Event an PA7
  Inputcapture_wert = Capture1          'Inputcapture Register sichern
  Flag_messung_fertig = 1               'Indication für Anzeige kann erfolgen
  Disable Capture1                      'Input Capture Interrupts unterbinden
Return


'############ Folgende Zeilen bis zum Ende nur zur Datenausgabe über 7 Segmentanzeige #############
Sub Display_value(num_to_disp As Word)  'gibt Dezimalzahlen bis 9999 aus
   Disp_string = Str(num_to_disp)
   For Y = Len(disp_string) To 3
      Helperbyte = Lookup(16 , Segmentpattern)
      Put #1 , Helperbyte
   Next
   For Y = 1 To Len(disp_string)
      Digit_char = Mid(disp_string , Y , 1 )
      Index = Val(digit_char)
      Helperbyte = Lookup(index , Segmentpattern)
      Put #1 , Helperbyte
   Next
End Sub

Segmentpattern:                         'darzustellende Zeichen (hex 0..F...)
'Segmente abcdefg:                      ' ":" = Doppelpunkt in der Mitte
   Data &B00000011                      'Ziffer "0", 0 = segment ein, 1 = aus
   Data &B10011111                      'Ziffer "1"
   Data &B00100101                      'Ziffer "2"
   Data &B00001101
   Data &B10011001
   Data &B01001001
   Data &B01000001
   Data &B00011111
   Data &B00000001
   Data &B00001001
   Data &B00010001
   Data &B11000001
   Data &B01100011
   Data &B10000101
   Data &B01100001                      'Ziffer "E"
   Data &B01110001                      'Ziffer "F"
   Data &B11111111                      'dunkel
   Data &B11111101                      'nur Segment g eingeschaltet (-)

'########### ENDE  US-Meßprogramm_ICP.bas  ##############################################