PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFM12 mit Beispielcode von Pollin, Anschlussprobleme Atmega32



TrimixTimo
22.02.2014, 16:52
Hallo zusammen,
Ich möchte erst einmal das Funkmodul RFM12 von Pollin mit dem mitgelieferten C-Code ansteuern. Verwendet wird ein Atmega32 mit 16Mhz Quarz.
Dazu steht in den Dateien RFM12_tx bzw _rx folgendes für die Anschlussbelegung:


Pinbelegung
-----------------------
ATMEGA8 RFM12
-----------------------
SCK SCK
MISO SDO
MOSI SDI
SS nSEL
INT0 nIRQ
PD6 LED1
PD5 LED2
PD4 Module-Power

PD7 FSK
PD3 DCLK,FFIT
PB0 NINT, VDI

Grundsätzlich verstehe ich die Pinbelegung, aber an einer Stelle bin ich mir unsicher:


PD4 Module-Power

Soll das wirklich bedeuten, dass ich VDD vom Modul mit dem I/O Pin verbinden soll, sodass das Modul vom Atmega32 mit Strom versorgt wird?
Ich hab das ganze zur Sicherheit mit einem Transistor BC548 gemacht und folglich VDD vom RFM12 mit 5V verbunden und GND vom Modul über den Transistor mit GND.
Ist das richtig?

Dann steht in der Datei noch :


DDRB=0x00;//PB INPUT;
DDRD=0x00;//PD INPUT;

Das kann aber nicht richtig sein, weil ja mindestens D4 also Module Power, D5 und D6 für die LEDs Ausgänge sein müssen, oder?

Grüße TT

fredred
24.02.2014, 16:00
Hallo TT,

habe schon einige Erfahrungen mit der Hardware RFM12 ca. 10 Funkbrücken für Datenerfassung aufgebaut sehr wichtig ist, was Du für ein Modul hast. Ob 5 oder 3,3 Volt Betriebsspannung. Ein 3,3 Volt Modul geht zwar nicht gleich in Rauch auf, aber funktioniert nicht mit 5Volt.

VDD schalten macht kein Sinn. Soll RFM in Ruhezustand geschalten werden kann dies Programmiert werden. Da alle meine Projekte mit 5 Volt Betriebspannung betrieben werden, schalte ich einfach 2 Dioden in Reihe vor VDD (da RFM12 B). Noch keine Probleme damit gehabt.
GND mit einem Transistor anschalten ist ein Unding. Das A und O ist immer ein „sauberer“ Bezugspunkt.
Im Anhang die Beschaltung.
PS. alle Programme in BASCOM erstellt, wenn Interesse kann ich diese zu Verfügung stellen. (sehr vielseitig in Auswahl Frequenz/ Band/AFC/Verstärkung usw.)

Mit freundlichen Grüßen
fredred

- - - Aktualisiert - - -

Hallo,

habe noch was sehr wichtiges für Hardware vergessen!!!
RFM12 Pin Data muss unbedingt mit einem 10 k Widerstand auf VDD gelegt werten.
Anschluss ist sehr hochohmig nur wenige Millimeter Leitung könnten, ein Parisehren Pegel auslösen.

Gruß
fredred

nikolaus10
24.02.2014, 16:01
Ja, das interesse ist da.
Bitte veroeffentlichen .

KR

fredred
25.02.2014, 14:17
Hallo,

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


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


Aufbau Sender und Empfänger ist baugleich.
Habe versucht in den Code alles wichtige in meinen Worten zu beschreiben, also nicht lachen.
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


'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%.

'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

fredred
25.02.2014, 16:17
Immer wieder Fehlermeldung die Empfänger Bas zu senden
Der Text, den du eingegeben hast, besteht aus 41310 Zeichen und ist damit zu lang. Bitte kürze den Text auf die maximale Länge von 34000 Zeichen.
Versuche es mal die Bas als Anhang
Mit freundlichen Grüßen
fredred