mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM02 Konfiguration


Autor: Philipp K. (Firma: keine) (nobody16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab mich seit Tagen mit diesem Modul beschäftigt und hab es einfach 
nicht zum laufen gebracht,

vllt kann mir einer mal helfen.

Anschlussplan:

ATmega 8                   RFM02
SCK                        SCK
MOSI                       SDI
MISO                       n.a.
SS(PortB.2)                nSel
Power(PortB.1)             VCC

das Bascom-Programm:

$regfile = "m8def.dat"
$crystal = 3686411
$baud = 9600

Ddrb = &B11111111
Spcr = &B01010001

Declare Function Spisend(byval Spibyte As Word) As Byte

Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim Data1 As Byte
Dim Data2 As Byte
I = 0




Do


Portb = &B00000110

Waitms 10
Print "Starte Configuration"

K = Spisend(&H8f00)       10 Mhz , 8.5 Pf
K = Spisend(&Hc09         Ex = 1,es=1,ea =0, eb=0, et=0,dc=0, a1=1, a0=0
K = Spisend(&Ha640)       434 MHZ Frequenz
K = Spisend(&Hc809)       34,48 kbps
K = Spisend(&Hb2)         -6DB
K = Spisend(&Hc220)       dwc=1, ebs=1
K = Spisend(&Hc6)         Data Transmit Command


Print "Sende Preamble"

K = Spisend(&Haa)
K = Spisend(&Haa)
K = Spisend(&Haa)
K = Spisend(&H2d)
K = Spisend(&Hd4)

Print "Sende Daten"

K = Spisend(10)
Waitms 1
K = Spisend(11)

K = Spisend(&Hc001)

Print "Erfolgreich Gesendet"

Portb = &B00000000

Loop

Function Spisend(byval Spibyte As Word) As Byte
Spdr = Spibyte
End Function

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Spisend sendet ein Byte, kein Wort, akzeptiert aber ein Wort, 
dessen MSB folglich über Bord geht.

Ausserdem dürfte korrektes Senden per SPI auch in Bascom anders 
aussehen. Immerhin solltest du wohl abwarten bis es raus ist bevor das 
nächste Byte drin landet.

Autor: Philipp K. (Firma: keine) (nobody16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sry das ich mich jetzt erst wieder melde,

habe die byte's durch word's ersetzt, und bei der SPI Funktion habe ich 
noch

Do:Loop Until SPSR.SPIF=1 eingefügt.

zudem hab ich die SPI-Funktion mittels 2 AVR auf Funktion überprüft, 
dass es nun an der SPI-Funktion liegt kann ich aussließen,

glaube eher das es an den einzustellenden Hexzahlen liegt oder an der 
Reihenfolge.

Autor: Philipp K. (Firma: keine) (nobody16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sry das ich mich erst jetzt wieder melde, habe aber den sender soweit 
ich das überprüfen kann zum laufen gebracht, bin jetzt am empfänger 
dran.

wie du unten sehen wirst habe ich die word's wieder durch bytes ersetzt 
und eben dann 2 bytes gesendet, da das spi interface (SPDR) nur 1 byte 
speicherkapazität hat.

da ich im forum nicht über dem rfm02 finde stell ich mal den code rein

Atmega8             RFM02
SCK                 SCK
MOSI                SDI
Portb.1             FSK
Portb.2             nsel
INT 0               nirq



$regfile = "m8def.dat"
$crystal = 3686411
$baud = 115200

Ddrd = &B10000000
Ddrb = &B11101111

Portd = &B00000100

Mcucr = &B00000010

Spcr = &B01010000
Sreg.7 = 1

Declare Function Spisend(byval Spibyte As Byte) As Byte
Declare Function Fsksend(byval Data1 As Byte) As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte



Do
Portb.2 = 1
waitms 100
Portb.2 = 0
'Initialisierung'

Print "Intitialisierung"

K = Spisend(&B11001100)
K = Spisend(&B00000000)

K = Spisend(&B10001011)
K = Spisend(&B01100010)

K = Spisend(&B10100110)
K = Spisend(&B01000000)

K = Spisend(&B11001000)
K = Spisend(&B01000111)

K = Spisend(&B11000010)
K = Spisend(&B00100000)

K = Spisend(&B11000000)
K = Spisend(&B00000001)

'Starte Übertragung'

K = Spisend(&B11000000)
K = Spisend(&B00111001)

'Über FSK daten Senden'

Print "Daten Übertragen"

K = Fsksend(&B10101010)
K = Fsksend(&B10101010)
K = Fsksend(&B10101010)

K = Fsksend(&B00101101)

K = Fsksend(&B11010100)

K = Fsksend(25)

K = Fsksend(&B10101010)

'Alles Schließen'

K = Spisend(&B11000000)
K = Spisend(&B00000001)

Portb.2 = 1

Print "Senden beendet"

Loop

Function Spisend(byval Spibyte As Byte) As Byte
Spdr = Spibyte
Do : Loop Until Spsr.spif = 1
Spisend = Spdr
End Function

Function Fsksend(byval Data1 As Byte) As Byte
J = 7
For I = 0 To 7
Do : Loop Until Gifr.6 = 1
If Data1.j = 1 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
J = J - 1
Gifr.6 = 1
Next I
Portb.1 = 0
End Function

Spisend = Spdr könnte man zugar weglassen da man vom slave nichts 
empfängt

Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Philipp,

ich habe hier seit gut 3 Monaten einen RFM02 im Dauerbetrieb. Den Code 
hänge ich mal an.

Ist sicher nicht der Gipfel der Eleganz und noch weit weg von fertig, 
aber er funktioniert. Vielleicht nutzt es...
'****************************************************************************
'Sendeprogramm für RFM02
'Autor:      Ralph Fischer
'Grundlage:  Fundstücke im Netz, Brain 0.9b
'Hardware:   Testaufbau auf Lochraster
'Controller: Mega8/16
'Stand:      26.12.2009
'Version:    0.43 Power save added (Controller)
'                 Checksum added
'            0.42 Power save added (RFM02)
'                 External controller clock from RFM02
'            0.41 10 byte protocol added
'                 Humidity measurement added
'            0.40 FSK auf PinB.0

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


'*************************
'System
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 108
$framesize = 120

$crystal = 1000000
$baud = 19200
Baud = 19200
'*************************

'*************************
'Konfigurationen
Config Portb.2 = Output                                     'NSEL
Config Pind.2 = Input                                       'NIRQ von RFM02
Config Portb.0 = Output                                     'FSK
Config Portd.7 = Output                                     'LED
Config Portb.3 = Output                                     'MOSI -> SDI
Config Portc.0 = Output                                     'Trigger

Config Int0 = Rising
On Int0 Set_nirq

Enable Interrupts
Disable Int0

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0


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


'*************************
'Deklarationen

'for RFM02
Trigger Alias Portd.7
Nsel Alias Portb.2
Fsk Alias Portb.0

Dim Wert As Word
Dim Data_tx As Word
Dim Temp As Word
Dim Zaehler As Word
Dim Count As Word
Dim Nirq_check As Bit
Dim Tx_telegram(5) As Word
Dim I As Byte

Declare Sub Rfm02_init
Declare Sub Send_frame
Declare Sub Tx_data(data_tx As Word)
Declare Sub Tx_temp
Declare Sub Prepare_to_sleep
Declare Sub Wakeup

'for SHT71 readout
Sck Alias Portc.5
Dataout Alias Portc.4
Datain Alias Pinc.4

Dim Ctr As Byte
Dim Dataword As Word
Dim Command As Byte

Declare Sub Getit()

Ddrc = &B11111111                                           'all port c are output
Config Pinc.5 = Output                                      'sck
Config Pinc.4 = Output                                      'datain
Config Portd.7 = Output                                     'Trigger'









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

'*************************
'Initialisierungen
Spiinit
Set Nsel
Reset Nirq_check


'****
'RFM02 initialisieren
Waitus 10
Call Rfm02_init

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


'*************************
'Hauptschleife
'*************************

Waitms 100
Do

'Read SHT71 temperature

'SHT71 reset I2C
Set Dataout
For Ctr = 1 To 12
   Set Sck
   Waitus 2
   Reset Sck
   Waitus 2
Next Ctr

Command = &B00000011
Call Getit                                                  'Get temperature. put result in dataword
Tx_telegram(5) = Dataword

'Read SHT71 humidity
Command = &B00000101
Call Getit                                                  'Get humidity put result in dataword
Tx_telegram(4) = Dataword

'Adress
Tx_telegram(2) = &B0001100000000001                         'adress #3, Type 1

'Checksum
Tx_telegram(1) = Crc16(tx_telegram(2) , 8)


Call Send_frame

Loop

End



'*************************
'Subroutinen
'*************************

'****
Sub Rfm02_init

Reset Nsel
Temp = &H9081                                               'Configuration Management
Call Tx_temp
Temp = &HC0C2                                               '&HC0F8  'Power Management
Call Tx_temp
Temp = &HA7D0                                               'Frequency Setting Command
Call Tx_temp
Temp = &HC88F                                               'Data Rate Command
Call Tx_temp
Temp = &HB0                                                 'Power Setting Command
Spiout Temp , 1

Temp = &HE77F                                               'Wake-Up Timer Command
Call Tx_temp

Spiout Temp , 1
Temp = &HC220                                               'Low Battery Detector and Bit Synchronization Command
Call Tx_temp
Temp = &H0001                                               'Close SPI communication

Call Tx_temp
Set Nsel
End Sub
'****



'****
Sub Send_frame(byval Tx_telegram As Word)


Temp = &HC6                                                 'Data Transmit Command
Spiout Temp , 1

Enable Int0
Data_tx = &H00AA
Call Tx_data(data_tx)
Data_tx = &HAAAA
Call Tx_data(data_tx)
Data_tx = &H2DD4
Call Tx_data(data_tx)
For I = 5 To 1 Step -1
   Data_tx = Tx_telegram(i)
   Call Tx_data(data_tx)
Next I
Data_tx = &HAA                                              'Frame-Ende
Call Tx_data(data_tx)
Disable Int0


Temp = &HC0C0                                               'clear et bit
Call Tx_temp

Temp = &HC0C2                                               'set et bit
Call Tx_temp

Call Prepare_to_sleep

Temp = &HC4FF                                               'RFM02: go home and sleep
Call Tx_temp

Powerdown

Call Wakeup

End Sub
'****

'****
Sub Tx_temp                                                 '2 Byte an SPI senden
   Rotate Temp , Left , 8
   Spiout Temp , 2
End Sub
'****

'****
Sub Tx_data(byval Data_tx As Word)                          '2 Byte ueber HF senden
For Count = 15 To 0 Step -1
   While Nirq_check = 0                                     'Interrupt abwarten
   Wend
    Fsk = Data_tx.count
    Nirq_check = 0
Next Count
End Sub
'****

'****
Set_nirq:
Nirq_check = 1
Return
'****

'****
Sub Getit()
Local Datavalue As Word
Local Databyte As Byte

'start transmission
Set Sck
Reset Dataout
Reset Sck
Waitus 5
Set Sck
Set Dataout
Reset Sck

'send command
Shiftout Dataout , Sck , Command , 1

Ddrc = &B11101111
Config Pinc.4 = Input
Set Sck                                                     'click one more off
Reset Sck
Waitus 10                                                   'doesn't work without it!
Bitwait Pinc.4 , Reset                                      'wait for SHT71 to get data ready
Set Trigger
Shiftin Datain , Sck , Databyte , 1                         'get the MSB
Datavalue = Databyte

Ddrc = &B11111111
Config Pinc.4 = Output

Reset Dataout                                               'Ack
Set Sck
Reset Sck
Set Dataout                                                 'absolutely neccessary!

Ddrc = &B11101111
Config Pinc.4 = Input

Shiftin Datain , Sck , Databyte , 1                         'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte                           'don#t tick the clock or ack since we don't need the crc value, leave it hanging!
Dataword = Datavalue

Ddrc = &B11111111
Config Pinc.4 = Output

Reset Dataout                                               'Ack
Set Sck
Reset Sck

Ddrc = &B11101111                                           'datain is now input
Config Pinc.4 = Input

Shiftin Datain , Sck , Databyte , 1                         'CRC, not used

Ddrc = &B11111111
Config Pinc.4 = Output

Set Dataout
Set Sck
Reset Sck
End Sub
'****

'****
Sub Prepare_to_sleep
Config Int0 = Low Level
Enable Int0
End Sub
'****

'****
Sub Wakeup
Disable Int0
Config Int0 = Rising
End Sub
'****

Viel Erfolg!

Ralph

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.