Hallo,

da Interesse besteht werde ich mal versuchen, mein Projekt hier zu veröffentlichen.

  1. Der Anhang doc ist fehlerhaft somit ignorieren. Estelle neuen Anhang wenn nicht wieder als zu groß abgewiesen wird.

Alternahtief in drei Antworten
Code für Sender
Code für Empfänger
Hardware

  1. Aufbau Sender und Empfänger ist baugleich.
  2. Habe versucht in den Code alles wichtige in meinen Worten zu beschreiben, also nicht lachen.
  3. Wichtig für mich war das der Empfänger ein eigenständiges Modul ist und mit Kabelverbindung auch seine Daten an einen größeren Mega ohne viel Aufwand sauber übergibt. Problem gelöst mit COM(TTL). Somit werden nur 2 Pins des „Großen“ belegt. Ich nenne den „Großen“ Zentrale und kann auf Wunsch auch diesen Code veröffentliche.

Nebeneffekt dieser Lösung ist, die Kaskadierung mehrere Controller(einer erfast Daten und berechnet Werte der andere macht alles „Schick“ ( LCD-Anzeige, Daten in ext. Eeprom schreiben oder diese zurückgeben, I²C-Bus für xxx Ports abfragen usw.)

MfG
fredred

Code:
'Alles in ein kleines Gehäüse eingebaut Spannungsversorgung kleines PV-Modul
'für Akkuladung 4X AA und auch ein Anschluß für USB-Netzteil.
'                  Gesamtkosten ca. 24,00 Euro.
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'         RFM12b Sender (TX)  869.0 MHz  mit Mega8
'       Soft- Hardware Fred Redlich (c) 2013 Ver. Test25
'       Hartware ist auch als Tranceiverbetrieb geeignet
'-------------------------------------------------------------------------------
'         aktuelle Einstellungen des Senders
' 6x analog-Eingänge 3x digital-Ports und 2x digital-Temperatursensoren
' werden gesendet.
' In der Hauptschleife können noch Auswertungen und oder Schaltvorgänge
' eingebunden werden. Controller-Auslastung zur Zeit 65%.
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