'------------------------------------------------------------------------------
'  Frequenzzähler, mit externem Interrupt, Atmega64, 4x LS7060
'------------------------------------------------------------------------------
'letzte Änderung  23.6.17

$regfile = "m64def.DAT"       'Atmega64
$crystal = 10000000           '10MHz externer Oszillator

'$prog &HFF , &HC0 , &H99 , &HFF         'JTAG on, ext. Clock
'Bei dem ersten Programmieren eines fabrikneuen Atmegas aktivieren

$hwstack = 100
$swstack = 128
$framesize = 288

Waitms 10
'--------------------- Konfiguration für LCD EA DOGM162 --------------------
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Porta.3 , Db6 = Porte.1 , _
Db7 = Porte.7 , E = Porte.6 , Rs = Porta.7

Waitms 10
Config Lcd = 16 * 2 , Chipset = Dogm162v5 , Contrast = &H74       'Kontrast
                                             'lowest  Contrast = &H70
                                             'highest Contrast = &H7F
Waitms 10

Cursor Off
Cls

Waitms 10

'--------------------- Definition der Variablen -----------------------------
Dim E_dummy As Eram Byte      'Dummy zur Belegung des ersten Bytes

Dim E_calwert As Eram Long    'Speichert den Calwert im EEprom
'E_calwert = 0
Dim Calwert As Long           'Der errechnete Kalibrierwert
 'Calwert = 33327
  Calwert = E_calwert

Dim Zahl As Long              'ausgelesene Bits werden aufaddiert
Dim Zahl1 As String * 18      'nimmt Zahl als String auf
Dim Zahl2 As Long             'Endergebnis
Dim Zahl3 As Long             'zur Berechnung des Calwertes
Dim Osc1 As Long              'Ergebnis der Oszillatormessung1
Dim Osc2 As Long              'Ergebnis der Oszillatormessung2
Dim Osc3 As Long              'Ergebnis der Oszillatormessung3
Dim Osc4 As Long              'Ergebnis der Oszillatormessung4
Dim Zeile1 As String * 16     'Display Zeile 1
Dim Zeile2 As String * 16     'Display Zeile 2
Dim Count_ended As Byte       'Count beendet = 1
Dim Gatetime1 As Byte         'Gatezeit1 festlegen
Dim Multiplikator As Dword    'Multiplikator auf Hertz für die Additionen
Dim Zf5 As Long               'feste ZF von 33,3MHz
Dim Gespeichert As Byte

Dim Test1 As Long

Dim Test2 As Long
Dim Test3 As Long
Dim Test4 As Long

Dim 2_56ms As Byte
Dim 25_6ms As Byte
Dim 256ms As Byte
Dim 2_56s As Byte

2_56ms = 0
25_6ms = 1
256ms = 2
2_56s = 3

Dim Span As Byte              'die Signale SP1-SP5 werden eingelesen
Dim Span_alt As Byte
Dim Span_neu As Byte
Dim Localosc As Byte          'Auswahl der Bereiche durch SP6 + SP7

Dim Ue As Byte
Ue = &B10000001               'Das Zeichen ü in binär

Dim Haken As String * 1
Haken = Chr(2)                'Haken ist "User defined (2)"
Dim Zahlhigh As String * 5    'Anzeige vor dem Komma
Dim Zahllow As String * 9     'Anzeige nach dem Komma
Dim Ungueltig1 As String * 16 'Anzeige des Wortes "Frequenz"
Dim Ungueltig2 As String * 16 'Anzeige des Wortes "ungültig"
Dim Oven As String * 4
Dim Position As String * 4
Dim Source As String * 4

Const Blank1 = " "            '1 Leerstelle
Const Blank2 = "  "           '2 Leerstellen
Const Blank3 = "   "          '3 Leerstellen
Const Blank4 = "    "         '4 Leerstellen
Const Blank5 = "     "        '5 Leerstellen
Const Blank6 = "      "       '6 Leerstellen
Const Blank7 = "       "      '7 Leerstellen
Const Blank8 = "        "     '8 Leerstellen
Const Blank16 = "                "       '16 Leerstellen

Const Komma = ","

Const Khz = "kHz"
Const Mhz = "MHz"
Const Ghz = "GHz"

Ungueltig1 = Blank4 + "Frequenz" + Blank4
Ungueltig2 = Blank4 + "ung" + Chr(ue) + "ltig" + Blank4

Config Pina.0 = Input         'D4, Counter Bit 4
Config Pina.1 = Input         'D5, Counter Bit 5
Config Pina.2 = Input         'D3, Counter Bit 3
Config Pina.4 = Input         'Cent
Config Pina.5 = Input         'Ext
Config Pina.6 = Input         'Cold

Porta.0 = 1
Porta.1 = 1                   'Pullup-Widerstände einschalten
Porta.2 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1

Config Portb.0 = Output       'ADC19=ADC_Clock
Config Portb.1 = Output       'PortB.1 = SCK vom ISP und Abbruch
Config Pinb.2 = Input         'Counter Bit 2
Config Pinb.3 = Input         'Counter Bit 6
Config Pinb.4 = Input         'ADC18=ADC Dout
Config Portb.6 = Output       'ADC16=ADC Din
Config Portb.7 = Output       'ADC15=ADC /CS

Config Pinc.0 = Input         'SP6
Config Pinc.1 = Input         'SP5
Config Pinc.2 = Input         'SP4
Config Pinc.3 = Input         'SP3
Config Pinc.4 = Input         'SP2
Config Pinc.5 = Input         'SP1
Config Portc.6 = Output       'OSC_OFF
Config Pinc.7 = Input         'SP7

Portc.0 = 1
Portc.1 = 1                   'Pullup-Widerstände einschalten
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.7 = 1

Config Portd.0 = Input        'Trigger, PD2 SWP
Config Portd.1 = Output       'Counter_reset
Config Portd.2 = Output       'Counter_store
Config Portd.3 = Output       'Scanimpuls, ST0
Config Portd.4 = Output       'Enable1, ST1
Config Portd.5 = Output       'CountStart
Config Portd.6 = Output       'Time_A
Config Portd.7 = Output       'Time_B

Config Pine.0 = Input         'PortE.0 = MOSI vom ISP und PR4
                                          'PortE.1 = MISO vom ISP und DB6
Config Pine.2 = Input         'Counter Bit 1
Config Pine.3 = Input         'Counter Bit 7
Config Pine.4 = Input         'Counter Bit 0
Config Pine.5 = Input         'Count_ended, Interrupt5

Config Portf.0 = Output       'PD9, Sweephold
Config Pinf.1 = Input         'PR3, Switch vorwärts
Config Pinf.2 = Input         'PR2, Switch speichern
Config Pinf.3 = Input         'PR1, kalibrieren

Config Pinf.5 = Output        'frei
Config Pinf.7 = Input         'PR4, Switch rückwärts

Portf.0 = 1
Portf.1 = 1                   'Pullup-Widerstände einschalten
Portf.2 = 1
Portf.3 = 1
Portf.7 = 1
Porta.6 = 1

                                         '   die 8 Bits des Zählers
Bit1 Alias Pine.4             'Bit0
Bit2 Alias Pine.2             'Bit1
Bit3 Alias Pinb.2             'Bit2
Bit4 Alias Pina.2             'Bit3
Bit5 Alias Pina.0             'Bit4
Bit6 Alias Pina.1             'Bit5
Bit7 Alias Pinb.3             'Bit6
Bit8 Alias Pine.3             'Bit7

Cent Alias Pina.4             'Center of Poti
Ext Alias Pina.5              'External Oscillator
Cold Alias Pina.6             'Oscillator not hot

Ads_clock Alias Portb.0       'ADS_Clock
Ads_din Alias Pinb.4          'ADc_Din, am ADS=Dout
Ads_dout Alias Portb.6        'ADc_Dout, am ADS=Din
Ads_chipselect Alias Portb.7  'ADc_Chip-Select

Sp6 Alias Pinc.0              'SP6
Sp5 Alias Pinc.1              'SP5
Sp4 Alias Pinc.2              'SP4
Sp3 Alias Pinc.3              'SP3
Sp2 Alias Pinc.4              'SP2
Sp1 Alias Pinc.5              'SP1
Osc_off Alias Portc.6         'shutoff Oscillator 1,52GHz if not used
Sp7 Alias Pinc.7              'SP7

Scan1 Alias Portd.3           'Impuls zum Weiterschalten der Auslesung
Enable1 Alias Portd.4         'Enable Signal zum Counter
Countstart Alias Portd.5      'Countstart zur Hardware
Time_a Alias Portd.6          'Time_A
Time_b Alias Portd.7          'Time_B

Pd9 Alias Portf.0             'PD9=Sweephold
Pr3 Alias Pinf.1              'PR3=Vorwärts
Pr2 Alias Pinf.2              'PR2=Speichern
Pr1 Alias Pinf.3              'PR1=Calibration
Abbruch Alias Portb.1         'Count wird abgebrochen
Pr4 Alias Pine.0              'PR4= rückwärts

Abbruch = 0
Enable1 = 1                   'Enable counter
Count_ended = 0               'Messung läuft

'----------------------------------------------------------------------------

Zahl2 = 990000                'fiktiver Startwert
Scan1 = 1
Waitus 20

'----------------------- Interrupts erlauben ---------------------------------
Enable Interrupts

On Int0 Introutine0           'Bei Interrupt springe zu Introutine0
Enable Int0                   'Enable Interrupt 0
Config Int0 = Rising          'Interrupt bei ansteigender Flanke

On Int5 Introutine5           'Bei Interrupt springe zu Introutine5
Enable Int5                   'Enable Interrupt 5
Config Int5 = Rising          'Interrupt bei ansteigender Flanke

'===============================================================================

'------------------------ LOGO anzeigen -------------------------------------

Locate 1 , 1
Lcd "  Taketa Riken  "
Locate 2 , 1
Lcd "     TR4113     "
Wait 1
Cls

'----------------------------------------------------------------------------
                   'Startwerte in Spanvariablen einlesen
Span = 0
   Span.0 = Sp5               'SP1 einlesen
   Span.1 = Sp4               'SP2 einlesen
   Span.2 = Sp3               'SP3 einlesen
   Span.3 = Sp2               'SP4 einlesen
   Span.4 = Sp1               'SP5 einlesen

      Span_neu = Span
      Span_alt = Span

'*****************************************************************************
'                              Hauptprogramm
'                              =============
'*****************************************************************************

Do
Anfang:

   Localosc = 0               'Abfrage der Frequenzbereiche
   Localosc.0 = Sp7           'Bereich1 = 1,5-3,5GHz
   Localosc.1 = Sp6           'Bereich2 = 2,5-4,5GHz
                                        'Bereich3 = 0-2GHz

   If Localosc = 3 Then       'Nur im Bereich3 ist der Oszillator 1,52GHz ein
     Osc_off = 1
     Else
     Osc_off = 0
     End If

   Span = 0                   'Span einlesen
   Span.0 = Sp5               'SP1 einlesen
   Span.1 = Sp4               'SP2 einlesen
   Span.2 = Sp3               'SP3 einlesen
   Span.3 = Sp2               'SP4 einlesen
   Span.4 = Sp1               'SP5 einlesen

      Span_neu = Span

   If Span_neu <> Span_alt Then
      Abbruch = 0
      Pulseout Portb , 1 , 100       'Impuls zum Abbrechen der Messung
      Waitus 40
      Portd.1 = 1
      Pulseout Portd , 1 , 100       'Reset-Impuls zum Zähler 40µs
        End If

      Span_alt = Span_neu

   Select Case Span           'Torzeiten und Multiplikator einstellen
      Case 7 To 15 :
         Gatetime1 = 2_56ms
         Multiplikator = 1000
         Zf5 = 33

      Case 30 To 31 :
         Gatetime1 = 2_56ms
         Multiplikator = 1000
         Zf5 = 33

      Case 27 To 29 :
         Gatetime1 = 25_6ms
         Multiplikator = 100
         Zf5 = 330

      Case 24 To 26 :
         Gatetime1 = 256ms
         Multiplikator = 10
         Zf5 = 3300

      Case 20 To 23 :
         Gatetime1 = 2_56s
         Multiplikator = 1
         Zf5 = 33000

      Case Else :             'Ungültige Span's anzeigen

          Zeile1 = "      Span      "
          Zeile2 = Ungueltig2
          Locate 1 , 1
          Lcd Zeile1
          Locate 2 , 1
          Lcd Zeile2

          Goto Anfang
   End Select

   If Count_ended = 1 Then    'Durchlauf nur 1x pro Triggerung
   Count_ended = 0

     Select Case Localosc     'Bereiche zur Berechnung auswählen
      Case 1 :
      Gosub Addition1
      Case 2 :
      Gosub Addition2
      Case 3 :
      Gosub Addition3
    End Select

    End If

   Gosub Bereichswahl         'Subroutine zur Bereichswahl

Loop

'*******************************************************************************
'                           ENDE Hauptprogramm
'                           =================
'*******************************************************************************

              'Externe Interruptroutine für INT0
'===============================================================================
              'Kommt vom Analyser
Introutine0:

   Pd9 = 1                    'Sweep anhalten

   Time_a = Gatetime1.1       'Torzeit setzen
   Time_b = Gatetime1.0

   Portd.5 = 0
   Pulseout Portd , 5 , 100   'Triggerimpuls 40µs zum Start der HW

Return

'===============================================================================
'              'Externe Interruptroutine für INT5
'===============================================================================
               'Kommt wenn Messung beendet

Introutine5:

   Portd.2 = 1
   Pulseout Portd , 2 , 100   'Store-impuls 40µs wird gesendet

   Waitus 40
   Portd.1 = 1
   Pulseout Portd , 1 , 100   'Reset-impuls 40µs wird gesendet

   Waitus 40
  Gosub Ausleseroutine        'Zähler auslesen

  Count_ended = 1

   Pd9 = 0                    'Sweep wieder starten
Return

'===============================================================================

'-------------------------- Bereich auswählen ----------------------------------
'
Bereichswahl:

   If Zahl2 > 9999999 Then
      Gosub 1ghz
   End If

   If Zahl2 > 999999 And Zahl2 < 10000000 Then
      Gosub 100mhz
   End If

   If Zahl2 > 99999 And Zahl2 < 1000000 Then
      Gosub 10mhz
   End If

   If Zahl2 > 9999 And Zahl2 < 100000 Then
      Gosub 1mhz
   End If

   If Zahl2 > 999 And Zahl2 < 10000 Then
      Gosub 100khz
   End If

   If Zahl2 > 99 And Zahl2 < 1000 Then
      Gosub 10khz
   End If

   If Zahl2 > 9 And Zahl2 < 100 Then
      Gosub 1khz
   End If

   If Zahl2 > 0 And Zahl2 < 10 Then
      Gosub 100hz
   End If

    If Zahl2 < 0 Then
    Zeile1 = Blank4 + "0,0" + Blank1 + Khz + Blank5

    Gosub Anzeigen
    End If

Return
'-------------------------------------------------------------------------------

'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'
'----------------------------------------------------------------------------

'größer als
1ghz:

   Zahl1 = Str(zahl2)         'in String umwandeln
   Zahlhigh = Left(zahl1 , 1) 'Stellen vor dem Komma auswählen

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 2 , 4)       '4 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Ghz + Blank3
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 2 , 5)       '5 Stellen nach dem Komma auswählen
     Zeile1 = Blank2 + Zahlhigh + Komma + Zahllow + Blank1 + Ghz + Blank3
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 2 , 6)       '6 Stellen nach dem Komma auswählen
     Zeile1 = Blank2 + Zahlhigh + Komma + Zahllow + Blank1 + Ghz + Blank2
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 2 , 7)       '7 Stellen nach dem Komma auswählen
     Zeile1 = Blank1 + Zahlhigh + Komma + Zahllow + Blank1 + Ghz + Blank2

    End Select
       Gosub Anzeigen         'Ergebnis anzeigen

Return
 '----------------------------------------------------------------------------
 'größer als
100mhz:

   Zahl1 = Str(zahl2)         'in String umwandeln
   Zahlhigh = Left(zahl1 , 3) 'Stellen vor dem Komma auswählen

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 4 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank4
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 4 , 2)       '2 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank3
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 4 , 3)       '3 Stellen nach dem Komma auswählen
     Zeile1 = Blank2 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank3
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 4 , 4)       '4 Stellen nach dem Komma auswählen
     Zeile1 = Blank2 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank2

    End Select
      Gosub Anzeigen          'Ergebnis anzeigen

Return
 '----------------------------------------------------------------------------

 'größer als
10mhz:

   Zahl1 = Str(zahl2)         'in String umwandeln
   Zahlhigh = Left(zahl1 , 2) 'Stellen vor dem Komma auswählen

     Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 3 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank4
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 3 , 2)       '2 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank4
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 3 , 3)       '3 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank3
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 3 , 4)       '4 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank2

    End Select
   Gosub Anzeigen             'Ergebnis anzeigen

Return

 '----------------------------------------------------------------------------
 'größer als
1mhz:

   Zahl1 = Str(zahl2)         'in String umwandeln
   Zahlhigh = Left(zahl1 , 1) 'Stellen vor dem Komma auswählen

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 2 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank5
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 2 , 2)       '2 Stellen nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank4
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 2 , 3)       '3 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank4
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 2 , 4)       '4 Stellen nach dem Komma auswählen
     Zeile1 = Blank3 + Zahlhigh + Komma + Zahllow + Blank1 + Mhz + Blank3

    End Select
   Gosub Anzeigen             'Ergebnis anzeigen

Return

 '----------------------------------------------------------------------------
 'größer als
100khz:

   Zahl1 = Str(zahl2)
   Zahlhigh = Left(zahl1 , 3)

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 4 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 4 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 4 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 4 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5

    End Select
       Gosub Anzeigen         'Ergebnis anzeigen

Return

 '----------------------------------------------------------------------------
 'größer als
10khz:

   Zahl1 = Str(zahl2)
   Zahlhigh = Left(zahl1 , 2)

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 3 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 3 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 3 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 3 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5

    End Select
       Gosub Anzeigen         'Ergebnis anzeigen

Return

 '----------------------------------------------------------------------------
 'größer als
1khz:

   Zahl1 = Str(zahl2)
   Zahlhigh = Left(zahl1 , 1)

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Mid(zahl1 , 2 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 1 :
     Zahllow = Mid(zahl1 , 2 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 2 :
     Zahllow = Mid(zahl1 , 2 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 3 :
     Zahllow = Mid(zahl1 , 2 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5

    End Select
       Gosub Anzeigen         'Ergebnis anzeigen

Return

'----------------------------------------------------------------------------
 'größer als
100hz:

   'Zahl2 = Zahl2 * 100                  'um auf 1Hz zu kommen
   Zahl1 = Str(zahl2)
   Zahlhigh = "0"

   Select Case Gatetime1
     Case Is = 0 :
     Zahllow = Left(zahl1 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 1 :
     Zahllow = Left(zahl1 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 2 :
     Zahllow = Left(zahl1 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5
     Case Is = 3 :
     Zahllow = Left(zahl1 , 1)       '1 Stelle nach dem Komma auswählen
     Zeile1 = Blank4 + Zahlhigh + Komma + Zahllow + Blank1 + Khz + Blank5

    End Select
       Gosub Anzeigen         'Ergebnis anzeigen

Return

'*********************** Routine zur Erfassung der Zählung ******************

Ausleseroutine:

   Enable1 = 0
   Gosub Auslesen             'Auslesen Zähler1
   Osc1 = Zahl

   Gosub Auslesen             'Auslesen Zähler2
   Osc2 = Zahl

   Gosub Auslesen             'Auslesen Zähler3
   Osc3 = Zahl

   Gosub Auslesen             'Auslesen Zähler4
   Osc4 = Zahl

   Waitms 1

   Enable1 = 1

Return

'------------------- Subroutine zur Anzeige --------------------------------
Anzeigen:

   If Pr1 = 0 Then
      Gosub Calwert_setzen

     Else

   If Cold = 1 Then
   Oven = "cold"
   Else
   Oven = "warm"
   End If

   If Cent = 1 Then
   Position = "cent"
   Else
   Position = "left"
   End If

   If Ext = 1 Then
   Source = "ext."
   Else
   Source = "int."
   End If

   Locate 1 , 1
      Lcd Zeile1
       Locate 2 , 1
      Lcd Blank1 ; Oven ; Blank1 ; Position ; Blank1 ; Source ; Blank1

   End If
Return

'*****************************************************************************
'-------- Subroutine zur Addition in den drei Bereichen ---------------------

'Bereich1        1500-3500MHz
Addition1:

   Shift Osc2 , Right , 1     'shifts teilen durch den Teilerfaktor
   Shift Osc3 , Right , 2     'der Vorteiler
   Shift Osc4 , Right , 7

   Zahl2 = Osc1
   Zahl2 = Zahl2 - Osc3
   Zahl2 = Zahl2 - Osc4
   Zahl2 = Zahl2 + Zf5
   Zahl2 = Zahl2 * Multiplikator

   If Pr1 = 0 Then
   Zahl3 = Zahl2
     Else
   Zahl2 = Zahl2 - Calwert
   End If

Return

'Bereich2     1500-3500MHz
Addition2:

   Shift Osc2 , Right , 1
   Shift Osc3 , Right , 2
   Shift Osc4 , Right , 7

   Zahl2 = Osc1

   Zahl2 = Zahl2 + Osc3

   Zahl2 = Zahl2 + Osc4

   Zahl2 = Zahl2 - Zf5

   Zahl2 = Zahl2 * Multiplikator

   If Pr1 = 0 Then
   Zahl3 = Zahl2
     Else
     'Test1 = Calwert
   Zahl2 = Zahl2 - Calwert
   End If

Return

'Bereich3    0-2000MHz
Addition3:

   Shift Osc2 , Right , 1
   Shift Osc3 , Right , 2
   Shift Osc4 , Right , 7

   'Test1 = Osc1
   'Test2 = Osc2
   'Test3 = Osc3
   'Test4 = Osc4

   Zahl2 = Osc1

   Zahl2 = Zahl2 - Osc2       'Osc1 - Osc2

   Zahl2 = Zahl2 - Osc3       '- Osc3

   Zahl2 = Zahl2 - Osc4       '- Osc4

   Zahl2 = Zahl2 + Zf5        '+ZF5

   If Zahl2 <> 1 Then

   Zahl2 = Zahl2 * Multiplikator

   End If

   If Pr1 = 0 Then
   Zahl3 = Zahl2
     Else
   Zahl2 = Zahl2 - Calwert
   End If
   Test1 = Zahl2

Return

'-------- Subroutine zum Auslesen des Zählers in die Variable Zahl ---------
 Auslesen:
       Zahl = 0
      'Stage1
Scan1 = 1
Waitus 5

    Zahl.0 = Bit1
    Zahl.1 = Bit2
    Zahl.2 = Bit3
    Zahl.3 = Bit4
    Zahl.4 = Bit5
    Zahl.5 = Bit6
    Zahl.6 = Bit7
    Zahl.7 = Bit8

 Scan1 = 0
 Waitus 5

 'Ende Stage1

 '----------------------------------------------------------------------------

  'Stage2
Scan1 = 1
Waitus 5

    Zahl.8 = Bit1
    Zahl.9 = Bit2
    Zahl.10 = Bit3
    Zahl.11 = Bit4
    Zahl.12 = Bit5
    Zahl.13 = Bit6
    Zahl.14 = Bit7
    Zahl.15 = Bit8

 Scan1 = 0
 Waitus 5

'Ende Stage2
'----------------------------------------------------------------------------
  'Stage3
Scan1 = 1
Waitus 5

    Zahl.16 = Bit1
    Zahl.17 = Bit2
    Zahl.18 = Bit3
    Zahl.19 = Bit4
    Zahl.20 = Bit5
    Zahl.21 = Bit6
    Zahl.22 = Bit7
    Zahl.23 = Bit8

 Scan1 = 0
 Waitus 5

 'Ende Stage3
'----------------------------------------------------------------------------
  'Stage4
Scan1 = 1
Waitus 5

    Zahl.24 = Bit1
    Zahl.25 = Bit2
    Zahl.26 = Bit3
    Zahl.27 = Bit4
    Zahl.28 = Bit5
    Zahl.29 = Bit6
    Zahl.30 = Bit7
    Zahl.31 = Bit8

 'Ende Stage4    Anfang Stage5
 Scan1 = 0
 Waitus 5

   Return

'*****************************************************************************
'                Ermitteln des Korrekturwertes
'*****************************************************************************

  Calwert_setzen:

     If Gespeichert = 0 Then

   Locate 1 , 1
   Lcd "Calwert= " ; Zahl3 ; Blank4
   'Lcd Test1 ; Blank1 ; Test2

   Locate 2 , 1
   Lcd "Taste= speichern"
   'Lcd Test3 ; Blank1 ; Test4
    'Lcd Calwert
   Waitms 500
   Else
   Locate 1 , 1
   Lcd "    Calwert     "
   Locate 2 , 1
   Lcd "  gespeichert   "
   End If

   Debounce Pinf.2 , 0 , Keypressed , Sub       'Bei Tastendruck zu Keypressed

   Return

   Keypressed:

    If Gespeichert = 1 Then
      Gespeichert = 0
      Else                    'Unterroutine zum Speichern des Calwertes
      Calwert = Zahl3
      E_calwert = Calwert     'in EEprom
      Gespeichert = 1
    End If
   Return

End