Code:
'Da der RFM12 eine 16 Bit Struktur hat benötigt er immer 2 Byte.
'Deshalb "Sub Rfm12_senden" somit kann Hex 82 und 39 gleich &H8239%
'den RFM12 als Sender einstellen. &H8299% wäre Empfänger usw.
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$regfile = "m8def.dat" 'ATMega8
$hwstack = 64
$swstack = 40
$framesize = 40
$crystal = 8000000 'Interner Takt (8MHz)
$baud = 19200
'----------------------Variablen setzen-----------------------------------------
'Subs bekannt machen
Declare Sub Rfm12_init
Declare Sub Rfm12_senden(byval Anzahl As Integer)
Declare Function Spitransfer(byval Dout As Word) As Word
'für Test die am Port B.0 angeschlossenen Temperatursensoren
Declare Sub Ds1820_alleseriennummern()
'Analog für Sendebyte
Dim A1 As Word
Dim A2 As Word
Dim A3 As Word
Dim A4 As Word
Dim A5 As Word
Dim A6 As Word
'Analog als Zwischenspeicher
Dim Tempw1 As Word
Dim Tempw2 As Word
Dim Tempw3 As Word
Dim Tempw4 As Word
Dim Tempw5 As Word
Dim Tempw6 As Word
'Digital Portbins als Byte
Dim Digital As Byte
'habe Analog Daten getrennt wenn nicht alle oder einige dann Stringlänge anpassen
'und im Ausgabestring Kanal2 wegnehmen oder anpassen.
Dim Kanal1 As String * 19 'Anzahl Sendebyte mit Trenzeichen Dig und Temp
Dim Kanal2 As String * 31 'Anzahl Sendebyte mit Trenzeichen Analog
'Temperatursensor Anschluß an Portpin B.0
Dim 1wtemp_adresse_1(8) As Byte ' Adresse des Temperatursensors 1
Dim 1wtemp_adresse_2(8) As Byte ' Adresse des Temperatursensors 2
Dim Temp_bytes(8) As Byte
Dim Tempdif As Integer
Dim Tempdif1 As Integer 'Variable zur Temp. Berechnung DeziGrad
Dim Temp1 As Single
Dim Temp2 As Single
'Format für Single zwei Nachkommastellen
Config Single = Scientific , Digits = 2
'Temperatursensoren DS 18S20 an PortB.0 (Bascom Unterprogramm einbinden)
Config 1wire = Portb.0 'Temperatursensor 1und2
Portb.0 = 1 'Port auf H schalten
'Portpin für LED aktivieren
Config Portb.1 = Output 'Rote LED Sendesignal
'----------- Sender mit Controller verbinden -----------
Ss Alias Portb.2
Mosi Alias Portb.3
Miso Alias Pinb.4
Sck Alias Portb.5
Config Ss = Output
Config Mosi = Output
Config Sck = Output
'Hier werden die zu sendenten Daten abgelegt
'Overlay ist ähnlich wie Array spart aber RAM-Speicher.
'Variablen liegen übereinander also auf den gleichen RAM-Zellen.
Dim Ausgabedaten(101) As Byte
'String als Byte ausgeben.
Dim Ausgabestring As String * 100 At Ausgabedaten Overlay
Dim B As Byte 'für Checksumme
'------ Initialisiere Funkmodul -------
'wird nach Inbertriebname oder Reset einmal ausgeführt da die Einstellungen
'im RAM des Moduls sind. Somit flüchtig nach Reset (Reset Controller und RFM sind verbunden)
Ss = 1
Sck = 0
Rfm12_init 'Sender Einstellungen durchführen
'#### ab hier kommen die Port Einstellungen ####
'Digitale(Byte) Bit Auswertung
'3x Digital am Controller Bit einen Namen geben.
D0 Alias Digital.0
D1 Alias Digital.1
D2 Alias Digital.2
'Port B.0 ist für Digital Temperatursensoren belegt !!!!!
'Abfrage dieser Ports in der Do Loop Schleife
' Port Einstellungen PortD5 wird der Variable D0 zugeordnet(als Eingang)
Config Portd.5 = Input
Portd.5 = 1 'Internen PullUp-Widerstand aktivieren.
' Port Einstellungen PortD6 wird der Variable D1 zugeordnet(als Eingang)
Config Portd.6 = Input
Portd.6 = 1 'Internen PullUp-Widerstand aktivieren.
' Port Einstellungen PortD7 wird der Variable D2 zugeordnet(als Eingang)
Config Portd.7 = Input
Portd.7 = 1 'Internen PullUp-Widerstand aktivieren.
'Beispiel PortD.5 als Ausgang PullUp-Widerstand natürlich nicht nötig
'Config PortD.5 = Output
'D5 = Portd.5
'----------------------------LED aktivieren-----------------------------------
Config Portb.1 = Output 'Rote LED
'---Analogeinstellung-----
'Achtung: Betriebsspannung des Modul ist 3,8 Volt
'Somit darf die Eingangsspannung für Ports nicht größer sein !!!!!!!!
'Analogports einschalten, wenn nicht aktiv 2 Zeilen ausblenden mit Zeichen '
'somit können diese Ports auch als digitale genutzt werden. Hinweis! alle oder keinen.
'da ADC multiplext wird.
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Referenzspannung auf 3,8 Volt
Start Adc
'-------------------------------------------------------------------------------
'------Temperatursensor erkennen-------
'testet die am Portpin B.0 angeschlossenen Temperatursensoren
Call Ds1820_alleseriennummern()
1wtemp_adresse_1(1) = 1wsearchfirst() 'ist der erste gefundene Sensor
1wtemp_adresse_2(1) = 1wsearchnext() 'suche nächsten
'1wtemp_adresse_3(1) = 1wsearchnext() 'wenn noch mehr erweitern
'### alle Einstellungen und Prüfungen beendet ###
'--- ab hier beginnt die Hauptschleife-----------
Do
'6x Analog Ports A1 bis A6 sind die Variablen für Weiterverarbeitung mit 10 Bit
'unbenutzte Analog-Eingänge immer auf GND oder Vcc legen da multiplext wird.
'Hinweis: Offene Eingänge können Fehlmessungen übertragen.
'Pins C5 und C4 können als Hardware I²C genutzt werden, wenn so eingestellt.
Tempw6 = Getadc(5) 'ist Portpin C5
A6 = Tempw6
Tempw5 = Getadc(4)
A5 = Tempw5
Tempw4 = Getadc(3)
A4 = Tempw4
Tempw3 = Getadc(2)
A3 = Tempw3
Tempw2 = Getadc(1)
A2 = Tempw2
Tempw1 = Getadc(0) 'ist Portpin C0
A1 = Tempw1
'Digital Pins lesen sind intern auf H gelegt
D0 = Pind.5
D1 = Pind.6
D2 = Pind.7
'Temperatursensoren Daten einlesen
Gosub Temperaturmessung
'---- Messungen beendet nun warten ----
'warte 1 Sekunde je nach Laufzeit des Empfängers anpassen.
'wenn am Empfänger keine Messungen dann kleinste Zeit Waitms 100
Wait 1
Set Portb.1 'Rote LED einschalten
'### ab hier Daten in RFM12b Sendepuffer schreiben und senden ###
'habe Digital- und Analogvariablen aufgeteilt. Nur wegen der Übersicht.
Kanal1 = Str(digital) + "|" + Str(temp1) + "|" + Str(temp2) + "|" 'sind 14 Byte +1
Kanal2 = Str(a1) + "|" + Str(a2) + "|" + Str(a3) + "|" + Str(a4) + "|" + Str(a5) + "|" + Str(a6) + "|" 'sind 30 Byte +1
Ausgabestring = Kanal1 + Kanal2
Call Rfm12_senden(50) 'Stringlänge anpassen
Reset Portb.1 'Rote LED ausschalten
Print " Daten gesendet"
Loop
'nur zur Sicherheit. Sollte ein Überlauf oder ein Progfehler auftreten
'wird Programm sicher beendet.
End
'(
'COM Test Ports. Meine Empfehlung nach Test ausblenden.
'jede Printanweisung benötigt viel Speicher, aber zur Zeit noch OK da 35% frei
'auch die Laufzeiten in dieser Schleife mit "Print" sind zu beachten.
'also wenn alles OK erstes [''( ] löschen. Zum testen wieder einfügen.
Print "6x Analog Eingang"
Print "A1 " ; A1
Print "A2 " ; A2
Print "A3 " ; A3
Print "A4 " ; A4
Print "A5 " ; A5
Print "A6 " ; A6
Print
Print "3x digital auf H = 1 (auf GND legen D(x) L = 0"
Print "D0 " ; D0
Print "D1 " ; D1
Print "D2 " ; D2
Print
Print "2x Temperatursensoren aktiv"
Print "Temp1 " ; Temp1 'Temperatursensor1
Print "Temp2 " ; Temp2 'Temperatursensor2
Print
')
'-------------------------------------------------------------------------------
Temperaturmessung:
' bei allen Sensoren den Messvorgang starten
1wreset
1wwrite &HCC ' SKIP ROM, alle Sensoren ansprechen
1wwrite &H44 ' CONVERT T, Temperatur messen
'Zeit zum Messen geben
Waitms 10
'===== erster Temp.-Sensor =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_1(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
Temp_bytes(1) = 1wread(8)
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.5
Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(8)
Tempdif = Tempdif + Tempdif1
Temp1 = Tempdif / 100
'Zeit zum Messen geben
Waitms 1
'===== zweiter Temp.-Sensor =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_2(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
Temp_bytes(1) = 1wread(8)
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen.
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.5
Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(8)
Tempdif = Tempdif + Tempdif1
Temp2 = Tempdif / 100
'Zeit zum Messen geben
Waitms 1
Return
'-------------------------------------------------------------------------------
'############# nach Neustart Temperatursensor Test ###############
'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen
'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und
'und [1wtemp_adresse_2(1)] ist der zweite usw.
'Gibt die Seriennummer aller Sensoren des Bus über COM(TTL) aus.
'wenn Hardware-Fehler wird dieser angezeigt.
Sub Ds1820_alleseriennummern()
Local Crc As Byte
Local I As Integer
Local Anzahl As Integer
Dim Adresse(8) As Byte
Adresse(1) = 1wsearchfirst() 'prüft den ersten Teilnehmer am Bus
If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor
'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis
'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8
'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn.
Print "sind Hex-Adresse der Ds18S20"
'ab hier prüfen
Do
Crc = Crc8(adresse(1) , 7)
If Crc <> Adresse(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
For I = 1 To 8
Print Hex(adresse(i)) ;
Print " ";
Next
Print
Adresse(1) = 1wsearchnext() 'nächste suchen
Loop Until Err = 1
End If
'Print
Anzahl = 1wirecount() 'Anzahl der Sensoren
Print "Anzahl der Sensoren am Bus: " ; Anzahl
Print
Print "Test abgeschlossen"
Print "Hauptprogramm wird gestartet"
Print
Wait 3
End Sub
' ************ Hilfsfunktionen zur Kommunikation mit Funkmodul **************
' (nähere Infos im Datenblatt des Funkmoduls und in den Dokumentationen)
'#### Hier ist alles was Sendenmodul benötigt ####
'Hinweis: Habe die Software Variante gewählt somit verständlicher
'aber da alle Ports schon für Werte belegt, kann man auch auf Hardware SPI
'umstellen. Wird nicht schneller aber spart ROM. In diesem Projek nicht nötig.
Sub Rfm12_senden(byval Anzahl As Integer)
Local N As Byte
Local D As Word
D = Spitransfer(&H8238) 'einschalten
Gosub Rfm12_warte 'dreimal AA schicken
D = Spitransfer(&Hb8aa) 'Hex AA (Binär ist das 10101010)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&Hb82d) 'synchron Byte schicken
Gosub Rfm12_warte
D = Spitransfer(&Hb8d4)
For N = 1 To Anzahl 'jetzt Daten schreiben
Gosub Rfm12_warte
D = &HB800 + Ausgabedaten(n)
D = Spitransfer(d)
Next N
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa) 'zum Abschluß noch mal zweimal AA
Gosub Rfm12_warte
D = Spitransfer(&Hb8aa)
Gosub Rfm12_warte
D = Spitransfer(&H8208) 'ausschalten
End Sub
'--- ist Softwarelösung um die 2 Byte für den RFM zusammen zufügen und schreiben
Function Spitransfer(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dmiso As Word
Ss = 0
Dmiso = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Mosi = 0
Else
Mosi = 1
End If
Dout = Dout * 2
Dmiso = Dmiso * 2
Dmiso = Dmiso + Miso
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Ss = 1
Spitransfer = Dmiso
End Function
Rfm12_warte:
Ss = 0
Do
Loop Until Miso = 1
Return
'Grundeinstellungen für Funkmodul setzen
Sub Rfm12_init
Local Wert As Word
Local X As Word
Local D As Word
X = 0
Restore Datainit3 'Initialisierungsfolge holen
Do
Read Wert 'Byts lesen
D = Spitransfer(wert) 'Byts schreiben
Incr X 'wenn 0 Schleife beenden
Loop Until Wert = 0
Waitms 200
End Sub
'Funkmodul Initialisierungsdaten
Datainit3:
Data &H80E7% 'Configurations Settings Command
Data &H8239% 'Power Management Command
Data &HA708% 'Frequency Setting Command (HA708 = 869.0MHz) (HA668 = 868.1MHz)
Data &HC647% 'Data Rate Command
Data &H94A0% 'Receiver Control Command
Data &HC2AD% 'Data Filter Command
Data &HCA81% 'FIFO und Reset Mode Command
Data &HCA83% 'FIFO und Enable Mode Command
Data &HCED4% 'Synchron Pattern Command
Data &HC400% 'Automatic Frequecy Control Command
Data &H9850% 'TX Control Command
Data &HCC17% 'PLL Settings Command
Data &HE000% 'Wake-Up Timer Command
Data &HC800% 'Low Duty-Cycle Command
Data &HC000% 'Low Battery Detect & µC CLK Command ' Status lesen irqs zurückstellen
Data 0% 'ende initialisierung
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Programm Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Der ISM Bereich für RFM12b geht von 868,00 bis 870,00 MHz
'RFM12 Sender (TX) 869.0 MHz habe Band sehr hoch gelegt.Somit bin ich mich
'ziemlich sicher das keiner dazwischen FUNKT.
'Beachte bitte die Vorschriften! Infos unter:
'http://iaf-bs.de/projects/ism-433-868.de.html
Lesezeichen