Sie sind hier: Home » Testgerät Funk » Programm

Link zu: Programm Testgerät Funk

'*******************************************************************************
'*************************  Funkdatenanzeige  **********************************
'*******************************************************************************


'name                     : TGF_Funkdatenanzeige_V0.4.bas
'copyright                : (c) 21.05.2020 jep
'purpose                  : Anzeigen was gesendet wird,  max. 20 Bytes
'micro                    : Atmel 1284P-PU
'
'Changelog:           V0.1: Initialversion
'                     V0.2: mit Zeiteinstellung ergänzt
'                     V0.3: mit Zeitstempel ergänzt
'                     V0.4: aufgeräumt
'offene Probleme          :
'-------------------------------------------------------------------------------


$regfile = "m1284Pdef.dat"                                  ' ATMEL Mega128PU
$crystal = 20000000                                         ' externer 20 MHz-Clock ohne Divisor
$hwstack = 150                                              ' default use 32 for the hardware stack
$swstack = 150                                              ' default use 10 for the SW stack
$framesize = 250                                            ' default use 40 for the frame space
$baud = 115200

Declare Sub Rfm12_init
Declare Function Spitransfer(byval Dataout As Word) As Word
Declare Sub S_E_Adresse(ByVal X as Byte)
Declare Sub Anzeigen()
Declare Sub Anzeige_fix()
Declare Sub Anzeige_unten()
Declare Sub Anzeige_Menue()

'*******************************************************************************
Config PortB.0 = Output                                     'LCD Reset
Config PortB.1 = Output                                     'LCD D/C
Config PortB.4 = Output                                     'LCD CS
Lcd_reset Alias PortB.0
Lcd_dc Alias PortB.1
Lcd_cs Alias PortB.4
Lcd_reset = 1
Lcd_cs = 1

Config Portb.5 = Output                                     'MOSI ----> SDI (RFM12B)
Config portb.6 = Input                                      'MISO <---- SDO (RFM12B)
Config Portb.7 = Output                                     'SCK  ----> SCK (RFM12B)
Config portb.3 = Output                                     'Slave select

Mosi Alias Portb.5
Miso Alias Pinb.6
Sck Alias Portb.7
Ss Alias PortB.3
Ss = 1                                                      'RFM12B ausschalten

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

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spsr.0 = 1                                                  ' Double speed on ATMega128
Spiinit

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

Const Lcd_mode = 3                                          'LCD Mode 1=Portrait 2=Portrait 180° 3=landscape 4=landscape 180°

'======================== Tastenkonfiguration ==================================

Config PortB.0 = Input                                      'Taste UP
PortA.0 = 1                                                 'Pullup
UP Alias PinA.0
Config PortA.1 = Input                                      'Taste Down
PortA.1 = 1                                                 'Pullup
Down Alias PinA.1
Config PortA.2 = Input                                      'Taste LEFT
PortA.2 = 1                                                 'Pullup
Links Alias PinA.2
Config PortA.3 = Input                                      'Taste RIGHT
Porta.3 = 1                                                 'Pullup
Rechts Alias Pina.3
Config PortA.4 = Input                                      'Taste OK / Enter
PortA.4 = 1                                                 'Pullup
OK Alias PinA.4

Config DEBOUNCE = 20                                        '20 ms entprellen

Config portA.7 = Input                                      'DIP-SW1
PortA.7 = 1                                                 'Pullup ein
DIPSW_1 alias Pina.7
Config portC.7 = Input                                      'DIP-SW2
PortC.7 = 1                                                 'Pullup ein
Debuggen alias Pinc.7                                       'ON = 0 = Debuggen

Config Portc.3 = Output                                     'Signalgeber
Portc.3 = 0
Buzzer alias Portc.3

Dim Summerzustand as Byte
Summerzustand = 1                                           'Buzzer aktiv

'*******************************************************************************
$include "..\TFTDriver\ILI9486_declarations_spi_Text.inc"
'*******************************************************************************

Dim Text as String * 70
Dim Subtext as String * 40
Dim Anzeige as Byte
'Anzeige = "H"

'---------Variables-------------------------------------------------------------

Dim Weekday As Byte : Weekday = &h06                        'DOW (MONTAG=1 BIS SONNTAG=7)

Dim bcd_day as Byte
Dim bcd_month as Byte
Dim bcd_year as Byte
Dim bcd_hour as Byte
Dim bcd_min as Byte
Dim bcd_sec as Byte

Dim Datum as string * 10
Dim Zeit as string * 10

Dim neue_Sekunde as Byte


'_______________________________________________________________________________

'========= Hier werden die zu empfangenen Bytes (15, max 50) abgelegt ==========

'   1    2    3    4    5    6    7    8    9
'+----+----+----+----+----+----+----+----+----+
'|               Eingangsbytes                |
'+----+----+----+----+----+----+----+----+----+
'|LENe|DABe|SABe|CDBe|Data|  Daten  |CRC2|CRC1|
'+----+----+----+----+----+----+----+----+----+
'

Const Maxanzahldatenbytes = 21                              'Datenmenge max. 20 Bytes +1 Reserve
Dim Irq_anzahlempfangsbytes As Byte                         'Zähler für die empfangenen Bytes
Dim Irq_empfangsbytes(Maxanzahldatenbytes + 6 + 10) As Byte 'Empfangspuffer während Empfang + 10 Bytes Reserve
Dim Irq_anzahlbytemax as Byte
Dim Irq_Akt_byte As Byte
Dim Empfangsbytes_vorhanden As Bit

Dim Crc_16e as Word                                         'CRC16 bei Empfang
Dim CRC_16ger as Word                                       'gerechneter CRC
Dim CRC as string * 5
Dim _CRC as Byte
Dim PN as Byte                                              'Paketnummer


'
'die Quittung besteht aus 4 Bytes
'   1    2    3    4
'+----+----+----+----+
'|  Sendebytes( )    |
'+----+----+----+----+
'|LENs|DABs|SABs|CDBs|
'+----+----+----+----+
'

'================== Interrupt für den Empfang aktivieren =======================

Config PinD.2 = Input                                       'Int0
PortD.2 = 1                                                 'Pullup
Nirq Alias PinD.2
Config Int0 = Falling
On Int0 RFM_Funkirq
Enable Int0
Disable Interrupts                                          'alle Interrupts noch stoppen


'======== Timerinterupt für Zeitbegrenzung Interruptempfang einstellen ===========

Config Timer0 = Timer , Prescale = 1024
Const Timer0_preload = 255 -(8 * 20000000 / 1024 * 4800)    'für 2 Bytes: gilt für 20 MHz und 4800 Baud
On Timer0 Timer0_irq                                        'beim Interrupt Empfang stoppen
Enable Timer0                                               'Timer0 Interrupt freigeben
Stop Timer0

'Const Power_down = &H8203
Dim Wakeup_timer As Word
Wakeup_timer = &HE5A8                                       'r = 5, m = 168 --> ca. 5 sec


'Prinzip:
'
'                                                                           max. Empfangslänge
'                                                                    |<----------------------------->|
'                                                                    |                               |
'                                                                    | Uhrzeit     Empfangslänge     |
'                                                                    |<--------->|<------------->|   |
'                                                                    |           |               |   |
'                                                                    +---+---+---+---+---+---+---+   |
'    empfangener Datensatz                                           | 1 | 2 | 3 | 1 |   |CRC|   |   |
'                                                                    +---+---+---+---+---+---+---+   |
'                                                                    |                           |   |
'                                                                    |                           |   |
'    Datenpuffer = max. empfangener Datensatz x Anzahl Datensätze    |                           v   |
'    |<-------- Datensatz 1 -------->|<-------- Datensatz 2 -------->v<-------- Datensatz 3 -------->|<---- Datensatz 4 -
'    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
'    | 1 | 2 | 3 | 1 | 2 |   |CRC|   | 1 | 2 |   |   |   |   |   |   |  1| 2 |   |   |   |   |   |   | 1 | 2 |   |   |   |
'    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
'      ^           ^   ^       ^     |                           |
'      p           n  n+1     n+x    |                           |
'                                    v  Uhrzeit  |  Empfang      v
'                                    +---+---+---+---+---+---+---+ --+
'   Anzeigepuffer                    | 1 | 2 | 3 | 1 | 2 |...|CRC|   |
'                                    +---+---+---+---+---+---+---+  -+
'                                      ^
'                                      i
'
'die Uhrzeit wird dargestellt: Std, Min und Sec in BCD  = 3 Byte

Const max_Empfangslaenge = Maxanzahldatenbytes + 6 + 3      'Datenbytes + Overhead + Uhrzeit
Const max_Empfangssaetze = 32                               'Anzahl Empfangssätze
Const i_max = max_Empfangslaenge * max_Empfangssaetze       'sind 32 Sätze zu 29 Bytes

Dim Datenpuffer(i_max)as Byte
Dim Anzeigepuffer(max_Empfangslaenge) as Byte

Dim LENe as Byte at Anzeigepuffer(4) Overlay                'Längenbyte
Dim DABe as Byte at Anzeigepuffer(5) Overlay                'Zieladresse
Dim SABe as Byte at Anzeigepuffer(6) Overlay                'Quelladresse
Dim CDBe as Byte at Anzeigepuffer(7) Overlay                'Kommandobyte

Dim Anzahlbyte_e as Byte
Dim ACKText as string * 5
Dim Empfang_aktiv as Byte
Dim E_aktiv as string * 3
Dim Empfangssatz_Nr as Word
Dim Empfangssatz_Nr_nachfuehren as Byte
Dim Puffersatz_Nr as Word
Dim Adresse as string * 11

'================================= TWI ========================================

$lib "i2c_twi.lbx"                                          'TWI wird verwendet
Config Scl = Portc.0                                        'SCL pinname angeben
Config Sda = Portc.1                                        'SDA Pinname angeben
I2cinit                                                     'und initialisieren

Config clock = user
Config Twi = 400000                                         'gewünschte Clockfrequenz für $lib "i2c_twi.lbx"
$lib "ds1307clock.lib"                                      'DS1307 Library
Const DS1307w = &HD0                                        'Adresse DS1307, Schreibadresse
Const Ds1307r = &HD1
'Const MCP7940 = &HDE                                        'Adresse MCP7940, Schreibadresse
Const RTCC_Adresse = DS1307w


'Interrupt für RTC aktivieren

On Int1 RTC_1sec                                            'auf fallende Flanke getriggert
EICRA.2 = 0                                                 'auf fallende Flanke
EICRA.3 = 1                                                 'auf fallende Flanke
Enable INT1                                                 'Freigabe von INT1
Disable Interrupts

'_______________________________________________________________________________

Dim c as Word
Dim D as Word
Dim i as Word                                               'Index für Datenpuffer -> Anzeigepuffer
Dim k as Word                                               'Index für Zeitstempel
Dim m as Word                                               'Startadresse eines Slots
Dim n as Word                                               'Index für IRQ_Empfangsbytes -> Datenpuffer
Dim p as Word
Dim q as Word
Dim r as Word
Dim s as Word
Dim u as Byte
Dim v as Byte
Dim w as Byte
Dim X as Byte
Dim Y As Byte
Dim Z as Byte

Dim yT as Word                                              'Zeilenadresse unterer Bereich

 

'                                     *
'                                ***********
'                        ****************************
'                ********************************************
'        *************************************************************
'    **********************************************************************
'*********************************  START  *************************************

Programmstart:
w = Maxanzahldatenbytes - 1
Print "==========================="
Print "FTG Funkdatenanzeige V0.4"
Print
Print "max. Anzahl Datenbytes: " ; w
Print "max. Anzahl Datensätze: " ; max_Empfangssaetze
Print "==========================="
Print
Print

LCD_Init
LCD_Clear Black
LCD_Text "Funkdatenanzeige" , 30 , 10 , 1 , White , Black , 2
LCD_Line 1 , 50 , 480 , 50 , 2 , White                      'make line
LCD_Text "File: TGF_Funkdatenanzeige_V0.4.bas" , 30 , 80 , 1 , White , Black , 1
LCD_Text "Funk: 4800 Baud / TTL: 115200 Baud" , 30 , 120 , 1 , White , Black , 1
LCD_Text "fuer max.    Nutzdaten" , 30 , 160 , 1 , White , Black , 1
Text = str(maxAnzahlDatenbytes)
LCD_Text Text , 138 , 160 , 1 , White , Black , 1
LCD_Text "max. Anzahl Datensaetze: " , 30 , 200 , 1 , White , Black , 1
Text = str(max_Empfangssaetze)
LCD_Text Text , 320 , 200 , 1 , White , Black , 1

for i = 1 to i_max
   Datenpuffer(i) = &H00                                    'Puffer löschen
next i
wait 3

I2cstart
     I2cwbyte Rtcc_adresse
     I2cwbyte 7                                             'ZEIT AB SRAM-REGISTER 0
     I2cwbyte &B00010000                                    'REG 7 KONTROLREGISTER DS1307
I2cstop

gosub RFM12_init

IRQ_akt_Byte = 0
Empfangsbytes_vorhanden = 0
i = 1                                                       'Startposition der Anzeige
m = 1                                                       'Startposition für empf. Telegramme
p = 1                                                       'Startposition für Zeitnachtrag
yT = 144                                                    'Startposition unterer Bereich im Display

LCD_Text "RFM 12B ist initialisiert" , 30 , 260 , 1 , Green , Black , 1

wait 1
enable Interrupts

'Auf neue Anfangssequenz warten
r = Spitransfer(&H82c8)                                     'Empfänger aktivieren
r = Spitransfer(&Hca83)                                     'FIFO einstellen/aktivieren
Empfang_aktiv = 1
E_aktiv = "ON "
LCD_Clear Black
call Anzeige_fix
gosub Anzeigen                                              'damit dann etwas steht


'**************************  Hauptprogramm *************************************

Do
   If neue_Sekunde = 1 then
      neue_Sekunde = 0                                      'Merker zurückstellen
      gosub GetDateTime                                     'Zeit aus dem RTC holen
      If Debuggen = 0 then
'         Print Bcd(bcd_day) ; "." ; Bcd(bcd_month) ; ".20" ; Bcd(bcd_year) ;
'         Print "    " ; Bcd(bcd_hour) ; ":" ; Bcd(bcd_min) ; ":" ; Bcd(bcd_sec) ; "  " ; neue_Sekunde
      End if
      Text = Hex(bcd_hour) + ":" + Hex(bcd_min) + ":" + Hex(bcd_sec)
      Lcd_text Text , 216 , 4 , 1 , White , Black , 1
   end if

   Debounce Up , 0 , 1x_nDaten , Sub
   Debounce Down , 0 , 1x_vDaten , Sub
   Debounce Links , 0 , 10x_nDaten , Sub
   Debounce Rechts , 0 , 10x_vDaten , Sub
   Debounce Ok , 0 , Anzeige_Menue , Sub

   if Debuggen = 0 then
      if Empfangsbytes_vorhanden = 1 Then                   'vom Funk sind Daten vorhanden
         c = p                                              'damit p wieder frei wird
         Print
         Print "neue Funkdaten" ; "  " ; Time$
         s = m - c                                          'm = nächste Slotadresse
         Print "Pufferadresse = " ; c ; "   nächste Pufferadresse = " ; m ; "   Slotgroesse = " ; s
         q = c + Datenpuffer(c + 3)                         'Telegrammende im Puffer ...
         q = q + 3                                          ' + Zeit (1+3) berücksichtigen
         For k = c to q
            Print Hex(Datenpuffer(k)) ; " ";
         next k
         Print
         Empfangsbytes_vorhanden = 0
      end if
   end if

   if Empfangssatz_Nr_nachfuehren = 1 then
      if Summerzustand = 1 then Buzzer = 1
      c = p                                                 'damit p sofort wieder frei wird
      Datenpuffer(c) = Makebcd(_hour) : Datenpuffer(c + 1) = Makebcd(_min) : Datenpuffer(c + 2) = Makebcd(_sec)
      If DIPSW_1 = 0 then                                   'Datenausgabe mit DIP-Switch.1 schaltbar ...
         For k = c to c + 2                                 '... ON = 0 = Datenausgabe
            Print Hex(Datenpuffer(k)) ; ":";                'Zeit
         next k
         q = c + Datenpuffer(c + 3)
         q = q + 3                                          '+ Zeit berücksichtigen
         For k = c + 3 to q
            Print " " ; Hex(Datenpuffer(k)) ;               'Daten
         next k
         Print
      End if
      Empfangssatz_Nr = c / max_Empfangslaenge
      Text = str(Empfangssatz_Nr)
      LCD_Text Text , 168 , 4 , 1 , White , Black , 1
      Empfangssatz_Nr_nachfuehren = 0
      Buzzer = 0
      call Anzeige_unten
   End if
Loop

'*********************************** RTC-Interrupt *****************************

RTC_1sec:
   neue_Sekunde = 1                                         '1-sec-Takt
Return

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

'--------------------------------- Anzeige -------------------------------------
'Startposition des Empfangsdatensatzes ist Position 4 im Anzeigepuffer (1..3 = Zeit)

Sub Anzeigen:
   Anzahlbyte_e = Anzeigepuffer(4) + 1                      'total Anzahl + LEN (LEN auf Pos.4)
   if Anzahlbyte_e = 1 then goto Anzeige_Ende1              'Puffer hat 00, ist also leer
   If Debuggen = 0 then
      Print
      Print "Anzahl: " ; Anzahlbyte_e
      Print "Anzeigepuffer2: " ;
      For w = 4 to Anzahlbyte_e + 4
         Print Hex(Anzeigepuffer(w)) ; "-" ;
      next w
      Print "<"                                             'Ende Daten
   End if

   CRC_16e = makeint(Anzeigepuffer(Anzahlbyte_e + 2) , Anzeigepuffer(Anzahlbyte_e + 3))
   Y = Anzeigepuffer(4) - 1                                 'Datenlänge über alles ohne CRC16
   CRC_16ger = Crc16(Anzeigepuffer(4) , Y )                 'CRC16 gerechnet

   If Anzeigepuffer(Anzeigepuffer(4) + 3) <> Low(crc_16ger) Then
      CRC = "No"
      _CRC = 0
      Goto Anzeigen1
   End if
   If Anzeigepuffer(Anzeigepuffer(4) + 4) <> High(crc_16ger) Then
      CRC = "No"
      _CRC = 0
      Goto Anzeigen1
   End if

   CRC = "OK"
   _CRC = 1

Anzeigen1:
   If Debuggen = 0 then
      Print "CRChigh: " ; Hex(Anzeigepuffer(Anzeigepuffer(4) + 4)) ; "  " ; Hex(High(crc_16ger))
      Print "CRClow:  " ; Hex(Anzeigepuffer(Anzeigepuffer(4) + 3)) ; "  " ; Hex(Low(crc_16ger))
   End if

   LCD_Box 1 , 38 , 480 , 128 , 1 , Black , Black           'Oberer Displayteil löschen
   Text = hex(Anzeigepuffer(1)) + ":" + hex(Anzeigepuffer(2)) + ":" + hex(Anzeigepuffer(3))
   LCD_Text Text , 48 , 38 , 1 , White , Black , 1          'Zeit anzeigen
   Text = ""
   If Anzeigepuffer(4) <= 11 then                           'es werden nur die ersten 6 Datenbytes angezeigt
      Y = Y + 3
      For w = 4 to Y                                        'Länge über alles ohne CRC
         Text = Text + Hex(Anzeigepuffer(w));
      next w
    else
      For w = 4 to 14
         Text = Text + Hex(Anzeigepuffer(w));
      next w
      Text = Text + ".."
   End if
   LCD_Text Text , 168 , 38 , 1 , White , Black , 1
   LCD_Text "akt. Empf.Nr: " , 1 , 4 , 1 , White , Black , 1
   Text = str(Empfangssatz_Nr)                              'Puffersatz-Nr.
   LCD_Text Text , 168 , 4 , 1 , White , Black , 1
   LCD_Text "Empfang: " , 336 , 4 , 1 , White , Black , 1
   If E_aktiv = "ON " then                                  'ON
      LCD_Text E_aktiv , 444 , 4 , 1 , Black , Green , 1
    else                                                    'also OFF
      LCD_Text E_aktiv , 444 , 4 , 1 , White , Red , 1
   End if
   LCD_Line 1 , 28 , 480 , 28 , 4 , White                   'make line
   Text = "Laenge: " + Hex(LENe)                            'Länge
   LCD_Text Text , 1 , 74 , 1 , White , Light_Red , 1
'   PN = Anzeigepuffer(7) and &H0F
   PN = CDBe and &H0F
   Text = "PNr=" + str(PN)                                  'Paket-Nr.
   LCD_Text Text , 276 , 74 , 1 , Black , Yellow , 1
   Text = str(Puffersatz_Nr)                                'Puffersatz-Nr.
   LCD_Text Text , 1 , 38 , 1 , White , Gray3 , 1
   Call S_E_Adresse(SABe)
   Text = "VON: " + Hex(SABe) + " " + Adresse               'Von
   LCD_Text Text , 1 , 56 , 1 , White , Light_Blue , 1
   Call S_E_Adresse(DABe)                                   'An
   Text = "AN: " + Hex(DABe) + " " + Adresse
   LCD_Text Text , 228 , 56 , 1 , Black , Green , 1

   if CDBe.7 = 0 and CDBe.6 = 0 then ACKText = "nack"       'keine Quittungsanforderung
   if CDBe.7 = 0 and CDBe.6 = 1 then ACKText = " ack"       'mit Quittungsanforderung
   if CDBe.7 = 1 and CDBe.6 = 0 then ACKText = "NACK"       'negative Quittung (wenn überhaupt)
   if CDBe.7 = 1 and CDBe.6 = 1 then ACKText = " ACK"       'positive Quittung
   PN = CDBe and &H0F                                       'Paketnummer ausmaskieren
   Text = "CDB:" + ACKText
   LCD_Text Text , 168 , 74 , 1 , Black , Yellow , 1

   LCD_Box 1 , 92 , 480 , 128 , 1 , Black , Black           'Datenbereich löschen
   LCD_Text "Daten: " , 1 , 92 , 1 , White , Light_Gray , 1 'Titel schreiben
   if Anzeigepuffer(4) = 0 then goto Anzeige_Ende
   Text = ""                                                'Text löschen
   for w = 8 to Anzeigepuffer(4) + 2                        'Daten, ohne CRC (ab 3+4 => 8. Stelle!)
      Text = Text + Hex(Anzeigepuffer(w)) + "-"
   next w
   w = len(Text)
   If w < 30 then
      LCD_Text Text , 84 , 92 , 1 , White , Light_Gray , 1  'erste Zeile
      Text = ""                                             'Text löschen
   End if
   If w >= 30 or w <= 63 then                               'bis 20 Daten angezeigt (3 Zeichen pro Byte)
      Subtext = left(Text , 30)
      LCD_Text Subtext , 84 , 92 , 1 , White , Light_Gray , 1       'erste Zeile
      Subtext = Mid(Text , 31 , 32)                         'ab Pos. 31  32 Zeichen
      LCD_Text Subtext , 84 , 110 , 1 , White , Light_Gray , 1       'zweite Zeile
   End if
   if LENe > 3 then
      Text = Hex(CRC_16e)
      If _CRC = 1 then
         LCD_Text Text , 432 , 38 , 1 , Black , Light_green , 1       ' CRC i.O.
       else
         LCD_Text Text , 432 , 38 , 1 , White , red , 1     'CRC Fehler
      End if
      Text = "ger.=" + Hex(CRC_16ger)
      If _CRC = 1 then
         LCD_Text Text , 372 , 74 , 1 , Black , Light_green , 1       'gerechneter CRC i.O.
       else
         LCD_Text Text , 372 , 74 , 1 , White , red , 1     'gerechneter CRC Fehler
      End if
   End if
 Anzeige_Ende:
   LCD_Line 1 , 134 , 480 , 134 , 4 , White                 'make line
 Anzeige_Ende1:
End Sub

Sub Anzeige_fix:
   LCD_Text "akt. Empf.Nr: " , 1 , 4 , 1 , White , Black , 1
   LCD_Text "Empfang: " , 336 , 4 , 1 , White , Black , 1
   LCD_Line 1 , 28 , 480 , 28 , 4 , White                   'make line
   LCD_Text "Laenge: " , 1 , 74 , 1 , White , Light_Red , 1
   LCD_Text "PNr=" , 276 , 74 , 1 , Black , Yellow , 1
   LCD_Text "VON: " , 1 , 56 , 1 , White , Light_Blue , 1
   LCD_Text "AN: " , 228 , 56 , 1 , Black , Green , 1
   LCD_Text "CDB:" , 168 , 74 , 1 , Black , Yellow , 1
   LCD_Line 1 , 134 , 480 , 134 , 4 , White                 'make line
End Sub


Sub S_E_Adresse:
   Select Case X
      Case &h01 : Adresse = "ElternZi "
      Case &h02 : Adresse = "Zi oben  "
      Case &h03 : Adresse = "Aussen S "
      Case &h04 : Adresse = "WiGarten "
      Case &h05 : Adresse = "WohnZi   "
      Case &h06 : Adresse = "Reserve  "
      Case &h10 : Adresse = "HellGeber"
      Case &h55 : Adresse = "Datenlog "
      Case &h5A : Adresse = "Zentrale "
      Case &hC8 : Adresse = "Allruf   "
      Case else : Adresse = "---------"
   End Select
End Sub

'_______________________________________________________________________________

Sub Anzeige_unten
   c = p                                                    'aktuelle Puffer-Startadresse
   LCD_Text Text , 1 , yT , 1 , White , Black , 1           'Empfangssatz-Nr.
   Text = Hex(Datenpuffer(c)) + ":" + Hex(Datenpuffer(c + 1)) + ":" + Hex(Datenpuffer(c + 2)) + " " + Hex(Datenpuffer(c + 3))
   LCD_Text Text , 36 , yT , 1 , White , Black , 1          'Zeit

   LCD_Text Hex(Datenpuffer(c + 4)) , 168 , yT , 1 , Black , Green , 1       'An
   LCD_Text Hex(Datenpuffer(c + 5)) , 192 , yT , 1 , White , Blue , 1       'Von
   LCD_Text Hex(Datenpuffer(c + 6)) , 216 , yT , 1 , Black , Yellow , 1       'CDB

   Anzahlbyte_e = Datenpuffer(c + 3) + 1                    'total Anzahl (+ LEN, + CRC)
   q = c + Anzahlbyte_e                                     '+ absolute Position im Array
   q = q + 2                                                '+3 Bytes der Zeit und -1 weil der
                                                            'Zeiger so auf der nächsten FREIEN Speicher steht
   LCD_Text Hex(Datenpuffer(q - 1)) , 432 , yT , 1 , White , Olive , 1       'CRClow
   LCD_Text Hex(Datenpuffer(q )) , 456 , yT , 1 , White , Olive , 1       'CRChigh

   Text = ""                                                'Text löschen
   If Anzahlbyte_e <= 13 then
      q = c + Anzahlbyte_e                                  'abs. Adr. + Telegrammlänge ...
      '... -2 (ohne CRC) +3 Bytes wegen Zeit und 1 weniger weil der Zeiger auf der nächsten FREIEN Speicher steht
      For k = c + 7 to q                                    'max. 8 bytes darstellen
          Text = Text + Hex(Datenpuffer(k));                '
      next k
      LCD_Text Text , 240 , yT , 1 , White , Black , 1
    else
      For k = c + 7 to c + 13                               'nur 7 Bytes darstellen
         Text = Text + Hex(Datenpuffer(k))
      next k
      Text = Text + ".."                                    'als 8. Byte -->  ..
      LCD_Text Text , 240 , yT , 1 , White , Black , 1
   End if

   yT = yT + 16                                             'nächste Zeile
   if yT >= 320 then yT = 144
   k = yT + 16
   LCD_Box 1 , yT , 480 , k , 1 , Black , Black             'nächste Zeilen löschen
End Sub

'_______________________________________________________________________________

10x_nDaten:
   If Debuggen = 0 then
      Print
      Print "10x UP"
   End if
   c = 10 * max_Empfangslaenge                              '10 Empfangssequenzen überspringen
   i = i + c
   goto nDaten

1x_nDaten:                                                  'nächster Datensatz
   If Debuggen = 0 then
      Print
      Print "UP"
   End if
   i = i + max_Empfangslaenge                               'nächste Empfangssequenz
nDaten:
   if i >= i_max then i = 1                                 'max. x_max Empfangssequenzen
   Puffersatz_Nr = i \ max_Empfangslaenge
   If Debuggen = 0 then
      Print "akt. Speicherplatz: " ; i
      Print "Puffersatz-Nr.:     " ; Puffersatz_Nr
   End if
   R = Memcopy(Datenpuffer(i) , Anzeigepuffer(1) , max_Empfangslaenge)       'in Anzeigepuffer umkopieren
   If Debuggen = 0 then
      Print "Anzeigepuffer1: " ;
      For k = 1 to max_Empfangslaenge
         Print Hex(Anzeigepuffer(k)) ; "-";
      next k
   End if
   gosub Anzeigen                                           'und anzeigen
Return

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

10x_vDaten:
   If Debuggen = 0 then
      Print
      Print "10x DOWN"
   End if
   c = 10 * max_Empfangslaenge                              '10 Empfangssequenzen überspringen
   i = i - c
   goto vDaten

1x_vDaten:                                                  'vorhergehender Datensatz
   If Debuggen = 0 then
      Print
      Print "DOWN"
   End if
   i = i - max_Empfangslaenge                               'vorhergehende Empfangssequenz
vDaten:
   If i => 32000 then                                       'negativ -->
      i = i_max - max_Empfangslaenge                        'wird maximum -Länge
      i = i + 1                                             'und 1 dazuzählen da 1-basiert
   End if
   Puffersatz_Nr = i \ max_Empfangslaenge
   If Debuggen = 0 then
      Print "akt. Speicherplatz: " ; i
      Print "Puffersatz-Nr.:     " ; Puffersatz_Nr
   End if
   R = Memcopy(Datenpuffer(i) , Anzeigepuffer(1) , max_Empfangslaenge)       'in Anzeigepuffer umkopieren
   If Debuggen = 0 then
      Print "Anzeigepuffer1: " ;
      For k = 1 to 29
         Print Hex(Anzeigepuffer(k)) ; "-";
      next k
   End if
   gosub Anzeigen                                           'und anzeigen
Return

'-------------------------------------------------------------------------------
Sub Anzeige_Menue:

   For v = 1 to 100
      waitms 10
      If OK = 1 then goto OK_Release
   next v

 OK_Release:
   if v < 25 then goto Menue_Start                          'ist kleiner 150 ms --> Menue
   If Empfang_aktiv = 1 then                                'ist > 150 ms --> Empf. ein/aus
      disable Int0
      Empfang_aktiv = 0                                     'Merker
      E_aktiv = "OFF"
      LCD_Text E_aktiv , 444 , 4 , 1 , White , Red , 1
      goto Menue_Ende1
   End if
   If Empfang_aktiv = 0 then
      enable Int0
      gosub RFM12_init                                      'neu starten
      Empfang_aktiv = 1
      E_aktiv = "ON "
      LCD_Text E_aktiv , 444 , 4 , 1 , Black , Green , 1
      goto Menue_Ende1
   End if

 Menue_Start:
   If Debuggen = 0 then
      Print "OK"
   End if
   LCD_CLear Black
   LCD_Text "Menue" , 30 , 20 , 1 , White , Black , 2
   LCD_Text "UP:     Empfang Ein/Aus" , 30 , 70 , 1 , White , Black , 1
   LCD_Text "DOWN:   Puffer loeschen" , 30 , 110 , 1 , White , Black , 1
   LCD_Text "Links:  Buzzer Ein/Aus" , 30 , 150 , 1 , White , Black , 1
   LCD_Text "Rechts: Zeit stellen" , 30 , 190 , 1 , White , Black , 1
   LCD_Text "OK:     Zurueck" , 30 , 250 , 1 , White , Black , 1
   If Empfang_aktiv = 1 then LCD_Text "ist ein" , 348 , 70 , 1 , Green , Black , 1
   If Empfang_aktiv = 0 then LCD_Text "ist aus" , 348 , 70 , 1 , Red , Black , 1
   If Summerzustand = 1 then LCD_Text "ist ein" , 348 , 150 , 1 , Yellow , Black , 1
   If Summerzustand = 0 then LCD_Text "ist aus" , 348 , 150 , 1 , Yellow , Black , 1

 Menue_Start1:
   Debounce Up , 0 , On_Off , Sub
   Debounce Down , 0 , Loeschen , Sub
   Debounce Links , 0 , Summer , Sub
   Debounce Rechts , 0 , Zeit_stellen , Sub
   Debounce Ok , 0 , Menue_Ende
   goto Menue_Start1
 Menue_Ende:
   LCD_Clear Black
   Gosub Anzeigen
 Menue_Ende1:
End Sub
'_______________________________________________________________________________

On_Off:
   If Empfang_aktiv = 1 then
      disable Int0
      Empfang_aktiv = 0                                     'Merker
      E_aktiv = "OFF"
      LCD_Text "ist aus" , 348 , 70 , 1 , Red , Black , 1
    Else
      gosub RFM12_init                                      'neu starten
      enable Int0
      Empfang_aktiv = 1
      E_aktiv = "ON "
      LCD_Text "ist ein" , 348 , 70 , 1 , Green , Black , 1
   End if
Return

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

Loeschen:
   for i = 0 to i_max
      Datenpuffer(i) = " "                                  'Puffer löschen
   next i
   gosub CLRAnzeigepuffer                                   'Anzeigepuffer löschen
   i = 0
   n = 0
   Puffersatz_Nr = 0
   LCD_Text "geloescht" , 348 , 110 , 1 , Red , Black , 1
   wait 2
   LCD_Text "         " , 348 , 110 , 1 , Black , Black , 1
Return

CLRAnzeigepuffer:
   for w = 1 to max_Empfangslaenge
      Anzeigepuffer(w) = 0                                  'Puffer mit 0 füllen
   next w
Return

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

Summer:
   If Summerzustand = 1 then
      Summerzustand = 0
      LCD_Text "ist aus" , 348 , 150 , 1 , Yellow , Black , 1
    else
      Summerzustand = 1
      LCD_Text "ist ein" , 348 , 150 , 1 , Yellow , Black , 1
   End if
Return

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

Zeit_stellen:
   LCD_Clear Black
   LCD_Text "DS1307 richten" , 10 , 40 , 1 , White , Black , 1
   LCD_Text "mit Auf und Ab resp. Links und Rechts" , 10 , 80 , 1 , White , Black , 1
   LCD_Text "Zeit und Datum einstellen" , 10 , 120 , 1 , White , Black , 1
   LCD_Text "Mit OK abschliessen" , 10 , 160 , 1 , White , Black , 1
   Wait 2

'___________________________________

   gosub GetDateTime                                        'Zeit aus dem RTC holen

 Zeit_stellen_Tag:
   LCD_Clear Black
   LCD_Text "Tag einstellen" , 10 , 50 , 1 , White , Black , 1
   LCD_Text Datum , 10 , 100 , 1 , White , Black , 1        'Date$

 Zeit_stellen_Tag1:
   LCD_Text Hex(bcd_day) , 10 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Tagplus
   Debounce Down , 0 , Tagminus
   Debounce Links , 0 , Zeit_stellen_Sec
   Debounce Rechts , 0 , Zeit_stellen_Monat
   Debounce Ok , 0 , Zeit_speichern_Ende
   Goto Zeit_stellen_Tag1

 Tagplus:
   _day = _day + 1
   if _day > 31 then _day = 1
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Tag1
 Tagminus:
   _day = _day - 1
   if _day = 0 then _day = 31
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Tag1
'____________

 Zeit_stellen_Monat:
   LCD_Clear Black
   LCD_Text "Monat einstellen" , 10 , 10 , 1 , White , Black , 1
   LCD_Text Datum , 10 , 100 , 1 , White , Black , 1        'Date$

 Zeit_stellen_Monat1:
   LCD_Text Hex(bcd_month) , 46 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Monatplus
   Debounce Down , 0 , Monatminus
   Debounce Links , 0 , Zeit_stellen_Tag
   Debounce Rechts , 0 , Zeit_stellen_Jahr
   Debounce Ok , 0 , Zeit_speichern_Ende
   goto Zeit_stellen_Monat1
 Monatplus:
   _month = _month + 1
   if _month > 12 then _month = 1
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Monat1
 Monatminus:
   _month = _month - 1
   if _month = 0 then _month = 1
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Monat1
'_______________

 Zeit_stellen_Jahr:
   LCD_Clear Black
   LCD_Text "Jahr einstellen " , 10 , 10 , 1 , White , Black , 1
   LCD_Text Datum , 10 , 100 , 1 , White , Black , 1        'Date$

 Zeit_stellen_Jahr1:
   LCD_Text Hex(bcd_year) , 82 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Jahrplus
   Debounce Down , 0 , Jahrminus
   Debounce Links , 0 , Zeit_stellen_Monat
   Debounce Rechts , 0 , Zeit_stellen_Std
   Debounce Ok , 0 , Zeit_speichern_Ende
   goto Zeit_stellen_Jahr1:
 Jahrplus:
   _Year = _Year + 1
   if _Year > 99 then _Year = 0
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Jahr1
 Jahrminus:
   _Year = _Year - 1
   if _Year = 255 then _Year = 99
   gosub setDatum
   gosub GetDateTime
   goto Zeit_stellen_Jahr1
'__________________

 Zeit_stellen_Std:
   LCD_Clear Black
   LCD_Text "Std einstellen" , 10 , 10 , 1 , White , Black , 1
   LCD_Text Zeit , 120 , 100 , 1 , White , Black , 1        'Time$

 Zeit_stellen_Std1:
   LCD_Text Hex(bcd_hour) , 120 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Stdplus
   Debounce Down , 0 , Stdminus
   Debounce Links , 0 , Zeit_stellen_Jahr
   Debounce Rechts , 0 , Zeit_stellen_Min
   Debounce Ok , 0 , Zeit_speichern_Ende
   goto Zeit_stellen_Std1
 Stdplus:
   _hour = _hour + 1
   if _hour = 24 then _hour = 0
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Std1
 Stdminus:
   _hour = _hour - 1
   if _hour = 255 then _hour = 23
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Std1
'__________________

 Zeit_stellen_Min:
   LCD_Clear Black
   LCD_Text "Min einstellen" , 10 , 10 , 1 , White , Black , 1
   LCD_Text Zeit , 120 , 100 , 1 , White , Black , 1        'Time$

 Zeit_stellen_Min1:
   LCD_Text Hex(bcd_min) , 156 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Minplus
   Waitms 10
   Debounce Down , 0 , Minminus
   Waitms 10
   Debounce Links , 0 , Zeit_stellen_Std
   Waitms 10
   Debounce Rechts , 0 , Zeit_stellen_Sec
   Waitms 10
   Debounce Ok , 0 , Zeit_speichern_Ende
   goto Zeit_stellen_Min1
 Minplus:
   _min = _min + 1
   if _min > 59 then _min = 0
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Min1
 Minminus:
   _min = _min - 1
   if _min > 59 then _min = 0
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Min1
'_________________

 Zeit_stellen_Sec:
   LCD_Clear Black
   LCD_Text "Sec einstellen" , 10 , 10 , 1 , White , Black , 1
   LCD_Text Zeit , 120 , 100 , 1 , White , Black , 1        'Time$

 Zeit_stellen_Sec1:
   LCD_Text Hex(bcd_sec) , 192 , 100 , 1 , White , Black , 1
   Debounce Up , 0 , Secplus
   Debounce Down , 0 , Secminus
   Debounce Links , 0 , Zeit_stellen_Min
   Debounce Rechts , 0 , Zeit_stellen_Tag
   Debounce Ok , 0 , Zeit_speichern_Ende
   goto Zeit_stellen_Sec1
 Secplus:
   _sec = _sec + 1
   if _sec > 59 then _sec = 0
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Sec1
 Secminus:
   _sec = _sec - 1
   if _sec > 59 then _sec = 0
   gosub setZeit
   gosub GetDateTime
   goto Zeit_stellen_Sec1
'_________________________

 Zeit_speichern_Ende:

   LCD_Clear Black
   LCD_Text "Zeit gestellt" , 10 , 40 , 1 , White , Black , 1
   LCD_Text "Neuprogrammierung " , 10 , 80 , 1 , White , Black , 1
   LCD_Text "mit OK" , 70 , 120 , 1 , White , Black , 1

 Zeitausgabe:
   LCD_Text Datum , 10 , 160 , 1 , White , Black , 1
   LCD_Text Zeit , 10 , 200 , 1 , White , Black , 1         'Datum    Zeit
   waitms 10
   Debounce Ok , 0 , Zeiteinstellen_Ende
   goto Zeitausgabe

 Zeiteinstellen_Ende:
   LCD_Clear Black
Return                                                      'und zurück

'________________________________

GetDateTime:

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte bcd_sec , Ack
  I2crbyte bcd_min , Ack                                    ' MINUTES
  I2crbyte bcd_hour , Ack                                   ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte bcd_day , Ack                                    ' Day of Month
  I2crbyte bcd_month , Ack                                  ' Month of Year
  I2crbyte bcd_year , Nack                                  ' Year
  I2cstop

' EINGELESENE WERTE MASKIEREN
  bcd_sec = bcd_sec And &B01111111                          'BIT-7 AUSMASKIEREN
  weekday = weekday And &B00000111                          'BIT-3 BIS BIT-7 AUSMASKIEREN
  bcd_month = bcd_month And &B00011111                      'BIT-5 BIS BIT-7 AUSMASKIEREN

  _sec = Makedec(bcd_sec) : _min = Makedec(bcd_min) : _hour = Makedec(bcd_hour)
  _day = Makedec(bcd_day) : _month = Makedec(bcd_month) : _year = Makedec(bcd_year)
  Datum = hex(bcd_day) + "." + hex(bcd_month) + "." + hex(bcd_year)
  Zeit = hex(bcd_hour) + ":" + hex(bcd_min) + ":" + hex(bcd_sec)
Return

SetDatum:
  bcd_day = Makebcd(_day) : bcd_month = Makebcd(_month) : bcd_year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte bcd_day                                          ' Send Data to DAY
  I2cwbyte bcd_month                                        ' MONTH
  I2cwbyte bcd_year                                         ' YEAR
  I2cstop
Return

SetZeit:
  bcd_sec = Makebcd(_sec) : bcd_min = Makebcd(_min) : bcd_hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte bcd_sec                                          ' Send Data to SECONDS
  I2cwbyte bcd_min                                          ' MINUTES
  I2cwbyte bcd_hour                                         ' HOURS
  I2cstop
Return


'*****************  Empfangs-Interrupt des Funkmoduls RFM12  ********************

Rfm_funkirq:
   Disable Int0                                             'während Interruptbehandlung ausschalten
   Timer0 = Timer0_preload
   Start Timer0                                             'Start Zeitüberwachung (Bitweise)
   Incr Irq_akt_byte                                        'aktueller Bytezähler erhöhen (Startwert ist 0)
   Irq_empfangsbytes(irq_akt_byte) = Spitransfer(&Hb000)    'Empfangsbyte holen und abspeichern
   If Irq_akt_byte = 1 Then
      Irq_anzahlbytemax = Irq_empfangsbytes(1) + 1          'im ersten Byte steht die Anzahl folgender Datenbytes
   End If
   If Irq_akt_byte = Irq_anzahlbytemax Then                 'max. Anzahl Bytes erreicht
       Stop Timer0
       If irq_empfangsbytes(1) <= max_Empfangslaenge then   'auf max. Länge prüfen
          p = m                                             'Startadresse für folgendes Telegramm
          n = m + 3                                         'Startadresse für Telegramm (3 Pos. höher)
          R = Memcopy(irq_empfangsbytes(1) , Datenpuffer(n) , Irq_anzahlbytemax)       'umkopieren
          m = m + max_Empfangslaenge                        'nächste Slotstartadresse
          if m >= i_max then m = 1                          'wenn Puffer voll wieder von vorne
          Empfangsbytes_vorhanden = 1                       'Merker setzen
          Empfangssatz_Nr_nachfuehren = 1
       End if
       Irq_akt_byte = 0                                     'Bytezähler löschen
       R = Spitransfer(&Hca81)                              'FIFO FILL zurücksetzen
       R = Spitransfer(&Hca83)                              'FIFO FILL aktivieren
       Eifr.intf0 = 1                                       'Eventuell anstehenden Interrupt löschen
   End If
   Enable Int0
Return

Timer0_irq:
   Stop Timer0                                              'Interrupt-Ueberwachung abgelaufen --> Stop
   Irq_akt_byte = 0                                         'Bytezähler löschen
   Empfangsbytes_vorhanden = 0                              'Eventuellen Merker löschen
   R = Spitransfer(&Hca81)                                  'FIFO FILL zurücksetzen
   R = Spitransfer(&Hca83)                                  'FIFO FILL aktivieren
   Eifr.intf0 = 1                                           'Eventuell anstehenden Interrupt löschen
   if Debuggen = 0 then
      Print "Timeout"
   end if
Return


'_______________________________________________________________________________

Function Spitransfer(byval Dataout As Word) As Word

   Local Nspi As Integer
   Local Dspi As Integer
   Local Dmiso As Word

   SPCR.6 = 0                                               'Hardware-SPI ausschalten
   Ss = 0
   Dmiso = 0
   For Nspi = 1 To 16
       Dspi = Dataout And &H8000
       If Dspi = 0 Then
           Mosi = 0
       Else
           Mosi = 1
       End If
       Dataout = Dataout * 2
       Dmiso = Dmiso * 2
       Dmiso = Dmiso + Miso
       Sck = 1
       Waitus 1
       Sck = 0
   Next Nspi
   Ss = 1
   SPIINIT                                                  'Hardware-SPI einschalten
   SPCR.6 = 1                                               'Hardware-SPI einschalten
   Spitransfer = Dmiso
End Function


'_______________________________________________________________________________

'RFM-Initialisierung

Sub Rfm12_init
   Local Wert As Word

   X = 0
   Restore Datainit3                                        'Initialisierungsfolge
   Do
      Read Wert
      D = Spitransfer(wert)
      Incr X
   Loop Until Wert = 0
   Waitms 200
   R = Spitransfer(&H0000)
End Sub

'_______________________________________________________________________________

$include "..\TFTDriver\ILI9486_routines_spi_Text.inc"

End

'********************************************************************
                                                       ' Programmende

$include "..\Font\font12x16.font"                           'Font 1
$include "..\Font\crn20x24.font"                            '2


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

'Funkmodul Initialisierungsdaten mit 9600 Baud
Datainit3:
Data &H80E8%                                                ' Enable: 868 Mhz;XTAL cap=12pf; TX-Register; RX-Fifo
Data &H82D9%                                                ' Enable: Receiver; Crystal Osc; Base Band Block; Synthesizer, Disable Low-bat Detector; Transmitter; Wake-Up-Timer; Clock output Pin
Data &HA67C%                                                ' &Ha67c=frequenz 434,15 Mhz oder z.B. &HA538 für 433,34 Mhz
Data &HC647%                                                ' &Hc647=Datenrate '4.8kbps; C623=9600kbps; C611 =19200
Data &H95C0%                                                ' Vdi , Fast , 67 kHz , 0db , -79dbm           !!!!!!!!!!
Data &HC2AD%                                                ' Fiter=Digital; Recover Mode=Auto; Quality Threshold=4; Recovery Speed=Slow
Data &HCA81%                                                ' FIFO INT Level=8; Sync on=2;Fifo Fill Start=Sync; Reset Sensitivity=High; Disable:FIFO Fill Enabled
Data &HC483%                                                ' Enable: AFC Mode; AFC; Frequency Offset Register Disable: High Accuracy; Strobe
Data &H9820%                                                ' Frequenz Shift=POS; Power Out=0 dB; Deviation=45 khz
Data &HE000%                                                ' WakeUp-Timer=0s
Data &HC800%                                                ' Duty Cycle = Infinity % OFF
Data &HC000%                                                ' Low batterie=2,2V; Clock Pin=1 Mhz
Data &HCED4%                                                ' Synchron Pattern
Data &HCC76%                                                ' PLL Settings
Data &H0000%                                                ' Status lesen, irqs zurückstellen
Data 0%                                                     ' Ende initialisierung


 
besucherzaehler-kostenlos.de