' BASCOM-Programm
' Ralph SWOB5 Strichbreite einstellen   Version Strichbreite10
' Autor Dieter Barth und Ralph Berres
' Erweiterung Abfrage Pll und Sweep 50-1300MHz
' Version 11 Herausnahme der Displayroutinen aus den Interuptroutinen

$regfile = "m8adef.dat"
$crystal = 14745600

$hwstack = 64
$swstack = 64
$framesize = 60
$baud = 115200
'$baud = 230400

Config Portb.0 = Output
Portb.0 = 0

Dim Char_buffer1(16) As String * 1
Dim Char_buffer2(16) As String * 1
Dim Contrast_wert As Byte
Dim Datensatz1 As String * 16
Dim Datensatz2 As String * 16
Dim Daten1 As String * 16
Dim Daten2 As String * 16
Dim Daten3 As String * 16
Dim Daten4 As String * 16

Dim Serialstring As String * 20
Dim Serialstring_m1 As String * 20
Dim Serialstring_m2 As String * 20
Dim Stringi As Byte
Dim Serialchar As Word

Dim Position As Byte
Dim Oled_col As Byte
Dim Oled_row As Word
Dim Oled_row_temp As Word
' Portb.0 = 1
Dim Data1_length As Byte
Dim Data2_length As Byte
Const Blank0 = ""                       'Keine Leerstelle
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 Marke2aus = "  Marke2 aus   "
Const Sweepaus = "  Sweep aus  "
Const Strichbreite = "Strichbreite "
Const Rohde&Schwarz = " Rohde&Schwarz "
Const Swob5 = " swob5 Vers 11  "

Config Portd.5 = Input                  'Dauerlauf
Portd.5 = 1
Dauerlauf Alias Pind.5

Config Portd.6 = Output                 'Triggerausgang zum Zähler
Portd.2 = 0                             'Interupt Marke1
Portd.3 = 0                             'Interupt Marke2

Config Portd.7 = Input                  'Marke2 aus
Portd.7 = 1
Marke2_aus Alias Pind.7

Config Portb.0 = Output                 'Umschaltung Sweep Hold 1=1ms

Config Portc.2 = Input                  'erweiterung Vers.10  1=0-1300MHz
Portc.2 = 0                             'erweiterung Vers.10  0=0-50MHz
Bereich Alias Pinc.2                    'erweiterung Vers.10

Config Portc.3 = Input                  'erweiterung Vers.10  0=0-2MHz
Portc.3 = 0                             'erweiterung Vers.10
Pll Alias Pinc.3                        'erweiterung Vers.10

Declare Sub Oled_zeile1
Declare Sub Oled_zeile2
'Declare Sub Messtransform

'Declare Sub Messtransform(byref Ip As Word , Byref Op As Word)

Config Scl = Portc.5
Config Sda = Portc.4

Contrast_wert = &H20                    'Contrast von 00 bis FF

 I2cinit

 Const Oled_write_address = &H78        'Adresse des I2C Displays

Dim Schleife As Dword
Schleife = 1

 Config Adc = Single , Prescaler = 128 , Reference = Internal
 Start Adc
'----------------------- ADC0 -----------------------------------------
Dim Ipmin As Word
Dim Ip As Word
Dim Ip1 As Word
Dim Ipminus As Word
Dim Ipplus As Word
Dim Ipalt As Word
Dim Test As Word
Dim Op As Word
Dim Op1 As Word
Dim Ergebnis1 As Word

Const Ilim = 1023
Const Olim = 100
Dim Ilim1 As Word
Dim X As Word
Dim Om As Byte
'------------------------- ADC1-----------------------------------------
Dim Aipmin As Word
Dim Aip As Word
Dim Aip1 As Word
Dim Aipminus As Word
Dim Aipplus As Word
Dim Aipalt As Word
Dim Atest As Word
Dim Aop As Word
Dim Ste As Word
Dim Aop1 As Word

Const Messzeit = "x"                    'Messzeit  in msek
Const Stellen = "E"                     'Anzahl der Stellen 5-12
Const Punkt = "."
Const Befehl = "%"
Goto Interupt
'Goto Start
'----------------------- Interrupts erlauben ---------------------------------
Interupt:

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

On Int1 Marke2                          'Bei Interrupt springe zu Marke2
Enable Int1                             'Enable Interrupt 1
Config Int1 = Rising                    'Interrupt bei ansteigender Flanke

Goto Start

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

'----------------------------------- Start ----------------------------------
 Start:

 Waitms 100

 Gosub Init

 Gosub Contrast

 Goto Logo
 '---------------------------------------------------------------------------

'---------------------------Logo anzeigen ------------------------------------
Logo:
'Portb.0 = 1

Oled_col = 1                            'Zeile = 1
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz1 = Blank16                    'Zeile Löschen
Call Oled_zeile1

Oled_col = 1                            'Zeile = 1
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz1 = Rohde&Schwarz
Call Oled_zeile1

Oled_col = 2                            'Zeile = 2
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz2 = Blank16                    'Zeile Löschen
Call Oled_zeile2

Oled_col = 2                            'Zeile = 2
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz2 = Swob5
Call Oled_zeile2
Wait 3                                  'legt Anzeigezeoit des Logos fest

Oled_col = 1                            'Zeile = 1
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz1 = Blank16                    'Zeile Löschen
Call Oled_zeile1

Oled_col = 2                            'Zeile = 2
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz2 = Blank16                    'Zeile Löschen
Call Oled_zeile2

Goto Beginn
'----------------------------------------------------------------------------
Beginn:

Enable Interrupts
Do

Goto Ma2aus
'Goto Dauer
'-----------------------Abfrage ob PD7 =0 Marke2 abgeschaltet -------------
Ma2aus:

If Marke2_aus = 0 And Dauerlauf = 1 Then
Disable Int1

Oled_col = 2                            'Zeile = 2
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz2 = Marke2aus                  'Zeile2 Marke2 aus
Call Oled_zeile2
Else
Enable Int1

End If

'----------------------------------------------------------------------------
   Goto Dauer
'*************** Dauerlauf abfragen ****************************************
 Dauer:
If Dauerlauf = 0 Then                   '0 = Dauerlauf        if Ebene 1

'*************** Dauerlauf an **********************************************
   If Schleife =< 1 Then                'If Ebene 2

  ' Schleife = 100
  Schleife = 9000                       'legt Messungen/Sek fest
  'Schleife = 32000
   Portd.6 = 0

   Pulseout Portd , 6 , 200             'Triggerimpuls 150µs nur alle 100ms
  Else
   Decr Schleife
   End If                               'endif ebene 2

'*************** Characters über UART empfangen ****************************

      If Ischarwaiting() = 1 Then       'neues Zeichen steht im Buffer
                                        'if Ebene 3
     Input Serialstring

      While Stringi <= 12               'auf ende des string warten

      Incr Stringi                      'zaehler hochsetzen

      Wend

               ' Frequenz des Dauerlaufes in Zeile 1 anzeigen
      Oled_col = 1                      'Zeile = 1
      Oled_row = 1                      'Position = 1
      Gosub Oled_position
      Datensatz1 = Blank16              'Zeile Löschen
      Call Oled_zeile1

      Oled_col = 2                      'Zeile = 2
      Oled_row = 1                      'Position = 1
      Gosub Oled_position
      Datensatz2 = Blank16              'Zeile Löschen
      Call Oled_zeile2

      Oled_col = 1                      'Zeile = 1
      Oled_row = 1                      'Position = 1
      Gosub Oled_position
      Datensatz1 = Blank2 + Serialstring + Blank2
      Call Oled_zeile1

                ' Sweep aus in Zeile 2 anzeigen

       Oled_col = 2                     'Zeile = 2
      Oled_row = 1                      'Position = 1
      Gosub Oled_position

      Datensatz2 = Sweepaus
      Call Oled_zeile2

     ' Goto Dauer
     ' Goto Adcwert1
    End If                              'end if ebene 3

'*************** Dauerlauf Ende ****************************************

'*************** Erfassung der ADC-Werte des Strichbreitenpotis **********
Else                                    'else ebene 1 Dauerluf oder

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

Adcwert1:

   Ip = Getadc(0)                       'ADC0 Wert einlesen, Port C0

  Goto Unterschied
'************* prüft auf mindestens 50 Digit Unterschied *********************

Unterschied:

If Ip < 25 Then                         'if ebene 4
Ip = 25
End If                                  'end if Ebene 4
If Ip > 70 Then                         'if ebene 5
Ipminus = Ip - 50
Ipplus = Ip + 50
Else                                    'else eben 5
Ipminus = Ip - 25
Ipplus = Ip + 25
End If                                  'end if ebene 5
                                                'sendet Befehl erst wenn
If Ipplus < Ipalt Or Ipminus > Ipalt Then       'Differenz des ADwandlerwertes
                                                'größer als 50 wird

Ipalt = Ip

 Waitms 100

'****************************************************************************

 Gosub Messtransform

Goto Strichbreitenbefehl                'Anzeige der Strichbreite unterdrückt
'************** ADC0 Werte anzeigen ****************************************
Adc0wert:                               'Anzeige der Strichbreite

Oled_col = 2                            'Zeile = 2
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz2 = Blank16                    'Zeile Löschen
Call Oled_zeile2

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

Oled_col = 1                            'Zeile = 1
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz1 = Blank16                    'Zeile Löschen
Call Oled_zeile1

Oled_col = 1                            'Zeile = 1
Oled_row = 1                            'Position = 1
Gosub Oled_position
Datensatz1 = Strichbreite + Str(op1) + Blank1       '+ char(Op1)
'Datensatz1 = Str(ipalt) + Blank1 + Str(ip) + Blank1 + Str(op1)
Call Oled_zeile1

  Goto Strichbreitenbefehl
'----------------------------------------------------------
Strichbreitenbefehl:

Print Punkt ; Str(op1) ; Befehl;        'Strichbreite an Zähler
Waitms 2
End If

'------------- Ablaufgeschwindigkeit -------------------------------

    '----------------------ADC-Wert Ablaufzeit------------------------------
Adc1wert2:
 Aip = Getadc(1)

 '************* prüft auf mindestens 50 Digit Unterschied *********************
  Aip = Aip + 50
  Aipminus = Aip - 50
  Aipplus = Aip + 50
                                        'sendet Befehl erst wenn
  If Aipplus < Aipalt Or Aipminus > Aipalt Then
                                        ' Differenz des ADwandlerwertes
  Aipalt = Aip                          ' größer als 30 wird
  Aip = Aip - 50
  End If

Plla:                                   '0-2MHz durch PLL im Bereich1

 If Pll = 0 Then                        'Erweiterung Vers 10
  If Aip < 200 Then
     Aop = 10
     Ste = 8
     Portb.0 = 0
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
     Else
     Portb.0 = 1
      Aop = 1
     Ste = 7
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
   End If
   Goto Endschleife                     'Erweiterung vers 10
  End If                                'Erweiterung Vers 10

 '--------------------Ab hier durchgängig Erweiterung Version 10--------------

  Bereich1:                             '0-50MHz
    If Bereich = 0 Then
     If Bereich = 0 And Aip > 360 Then
     Aop = 10
     Ste = 6
     Portb.0 = 0
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
     Else

     Aop = 1
     Ste = 6
     Portb.0 = 1
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
     End If
     Goto Endschleife
   End If

   Bereich2:                            '7-1300MHz

    If Bereich = 1 And Marke2_aus = 0 Then
    Aop = 1
    Portb.0 = 1
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Else

     If Aip > 1000 Then
     Aop = 10
     Ste = 5
     Portb.0 = 0
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
     Else

     Aop = 1
     Ste = 5
     Portb.0 = 1
     Print Punkt ; Str(aop) ; Messzeit; 'Messzeit an Zähler
     Print Punkt ; Str(ste) ; Stellen;  'anzahl stellen an Zähler
     End If
     Goto Endschleife
    End If
   '--------------------Ende-Erweiterung Version 10-----------------------

  '----------------------Ende ADC-WErt Ablaufzeit ------------------------
 Endschleife:
 Gosub Marke1_display                   'Version 11
 If Marke2_aus = 1 Then                 'Version 11
  Gosub Marke2_display                  'Version 11
  End If                                'Version 11
 End If

Loop

'============================ Werte-Transformation =========================

 Messtransform:

 '
 ' Diese Routine wandelt die Messwerte aus dem Bereich  0 bis 1023
 ' proportional in die Werte aus dem Bereich 0 bis 50 invertiert um,
 ' also Transformation 0  --> 1023, in 100 --> 0

 Ilim1 = Ilim - Ip

 Op1 = Ilim1 / 10

 If Op1 > 100 Then
 Op1 = 100
  End If

   Return

 '******************* Interrupt von Marke1 ***********************************
 Marke1:
    Portd.6 = 0
   Pulseout Portd , 6 , 200             'Triggerimpuls 150µs
   'Waitms 1
  '*************** Characters über UART empfangen ****************************

     Input Serialstring_m1

       Return                           'Version 11

      Marke1_display:                   'in Zeile 1 anzeigen  'Version 11

    '  Oled_col = 1                      'Zeile = 1
    '  Oled_row = 1                      'Position = 1
    '  Gosub Oled_position
    '  Datensatz1 = Blank16              'Zeile Löschen
    '  Call Oled_zeile1

      Oled_col = 1                      'Zeile = 1
      Oled_row = 1                      'Position = 1
      Gosub Oled_position
      Datensatz1 = Blank2 + Serialstring_m1 + Blank2
      Call Oled_zeile1

        Return

 '******************* Interrupt von Marke2 ***********************************
 Marke2:
    Portd.6 = 0
   Pulseout Portd , 6 , 200             'Triggerimpuls 150µs
   'Waitms 1
 '*************** Characters über UART empfangen ****************************

      Input Serialstring_m2

       Return                           'Version 11

     Marke2_display:                    'in Zeile 2 anzeigen   'Version 11

    '  Oled_col = 2                      'Zeile = 2
    '  Oled_row = 1                      'Position = 1
    '  Gosub Oled_position
    '  Datensatz2 = Blank16              'Zeile Löschen
    '  Call Oled_zeile2

      Oled_col = 2                      'Zeile = 2
      Oled_row = 1                      'Position = 1
      Gosub Oled_position
      Datensatz2 = Blank2 + Serialstring_m2 + Blank2
      Call Oled_zeile2

        Return

 '****** DATENSATZ1 AUFS DISPLAY IN ZEILE1 SCHREIBEN *************************
Sub Oled_zeile1:

Local X_local As Byte

   Data1_length = Len(datensatz1)

For X_local = 1 To Data1_length
      Char_buffer1(x_local) = Mid(datensatz1 , X_local , 1)
Next

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H40                           '&H40 = Daten folgen

 For X_local = 1 To Data1_length
      I2cwbyte Char_buffer1(x_local)
 Next
I2cstop

'Waitms 1

End Sub

 '******DATENSATZ2 AUFS DISPLAY IN ZEILE2 SCHREIBEN *************************
Sub Oled_zeile2:

Local X_local As Byte

   Data2_length = Len(datensatz2)

For X_local = 1 To Data2_length
      Char_buffer2(x_local) = Mid(datensatz2 , X_local , 1)
Next

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H40                           '&H40 = Daten folgen

 For X_local = 1 To Data2_length
      I2cwbyte Asc(char_buffer2(x_local))
 Next
I2cstop

'Waitms 1

End Sub

'----------------------------- Sub Init ------------------------------------

Init:

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H2A                           'Function Set, set RE=1
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H08                           'Extended Function Set,5-dot,
I2cstop                                 'disable cursor-invert, 2 line mode

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H72                           '2-Byte Command
I2cwbyte &H03                           'Function selection B
I2cstop                                 'set ROM [ROM A 0x03, ROM B 0x07,
                                         'ROM C 0x0B]

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H28                           'Function Set, set RE=0
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H01                           'Clear Display and set DDRAM loc 00
I2cstop

Waitms 150

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80                           '&H80 = Command folgt
I2cwbyte &H0C                           'turn Display ON, Cursor OFF, Blink OFF
I2cstop

'Waitms 500

 Return

'----------------------------- Sub Contrast ----------------------------------
Contrast:

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte &H2A
I2cstop:

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte &H79
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte &H81
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte Contrast_wert                  'Contrast von 00 bis FF
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte &H78
I2cstop

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte &H28
I2cstop

Return
'----------------------------- Sub Position -----------------------------------
 Oled_position:

 Oled_row_temp = Oled_row
 If Oled_col = 1 Then
   Oled_col = &H80
  Else
     If Oled_col = 2 Then
       Oled_col = &HC0
     End If
 End If

  Oled_row_temp = Oled_row - 1
 Position = Oled_col + Oled_row_temp

I2cstart
I2cwbyte Oled_write_address
I2cwbyte &H80
I2cwbyte Position                       'Position = col + row
I2cstop                                 'col Zeile1= 8x; Zeile2= Cx
                                         'Row Spalte1 bis Spalte16 = x0 bis xF

'Waitms 5

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

End