'*******************************************************************************
'************************* 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