'------------------------------------------------------------------------------ ' RFM01 Empfang mit MEGA8 'Belegung der Ports: ' 'Port B: ' ' Pin Funktion ' ----------------------- ' 0 | LED ' 1 | Not connected ' 2 | RFM01 NRES ' 3 | MOSI (RFM01 SDI) ' 4 | MISO (RFM01 SDO) ' 5 | SCK (RFM01 SCK) ' ' 'Port C: ' ' Pin Funktion ' ----------------------- ' 0 | Not connected ' 1 | Not connected ' 2 | Not connected ' 3 | Not connected ' 4 | Not connected ' 5 | RFM01 NFFS ' ' 'Port D: ' ' Pin Funktion ' ----------------------- ' 0 | RXD ' 1 | TXD ' 2 | ACKNOWLEDGE TASTER ' 3 | RFM01 SDO ' 4 | Not connected ' 5 | Not connected ' 6 | Not connected ' 7 | Not connected ' '------------------------------------------------------------------------------ 'General controller settings '------------------------------------------------------------------------------ $regfile = "m8def.dat" $crystal = 7372800 $baud = 115200 $hwstack = 64 $swstack = 64 $framesize = 64 'WICHTIG: Die stack/frame Variablen dürfen nicht zu klein sein!!! ' Anzahl der zu empfangenden Bytes Const Fifo_length = 6 ' Function declarations '------------------------------------------------------------------------------- Declare Sub Init_funkmodul Declare Sub Spi_send(byval Cmd2spi As Word) 'config serial buffer and terminators '------------------------------------------------------------------------------ Config Serialin = Buffered , Size = 100 Config Input = Crlf , Echo = Crlf 'I/O '------------------------------------------------------------------------------ Config Portb.0 = Output Led Alias Portb.0 Config Portd.3 = Input 'int1 für FIFO Interrupt 'WICHTIG: Die SDO Leitung wird zusätzlich auf PortD.3 gelegt! Config Portc.5 = Input Nffs Alias Portc.5 Config Portb.5 = Output Sck Alias Portb.5 Config Portb.4 = Input Sdo Alias Pinb.4 Config Portb.3 = Output Sdi Alias Portb.3 Config Portb.2 = Output Cs Alias Portb.2 'Other configs '------------------------------------------------------------------------------- Config Int1 = Rising On Int1 Rx_irq ' Variable definitions '------------------------------------------------------------------------------ Dim Spio(2) As Byte Dim Temp As Byte Dim Fifo(fifo_length) As Byte Dim Abyte As Byte Dim Run As Byte Dim Run2 As Byte Dim Lesen_flag As Bit Dim Runfifo As Byte Dim Status As Byte Dim Signal As String * 8 ' Initialization '------------------------------------------------------------------------------- Print "Init Receiver" Call Init_funkmodul ' RFM01 initialisieren Set Nffs Call Spi_send(&Hc041) Call Spi_send(&Hce89) Call Spi_send(&Hce8b) Reset Sdi Reset Cs ' Interrupts aktivieren Gifr = 128 'Aufgelaufene Interrupts auf Int1 löschen Enable Int1 Enable Interrupts '------------------------------------------------------------------------------ ' MAIN LOOP '------------------------------------------------------------------------------ Do ' Funkdaten empfangen? If Lesen_flag = 1 Then Signal = "" For Run = 1 To Fifo_length Signal = Signal + Chr(fifo(run)) Fifo(run) = 0 Next Print Signal If Signal = "ALARM!" Then Print "Wir haben Alarm!" End If Reset Lesen_flag End If Loop '------------------------------------------------------------------------------ ' END OF MAIN LOOP '------------------------------------------------------------------------------ End 'Empfangsroutine RFM01 '------------------------------------------------------------------------------ Rx_irq: For Run2 = 1 To Fifo_length 'Status auslesen beginnen (SDI ist low) Reset Cs 'Warten auf FIFO Interrupt, 8 bits empfagen While Sdo = 0 Wend 'skip status bits For Run = 7 To 0 Step -1 Set Sck nop nop Reset Sck nop nop Next 'skip status bits For Run = 7 To 0 Step -1 Set Sck nop nop Reset Sck nop nop Next 'read first byte from FIFO For Run = 7 To 0 Step -1 Set Sck Fifo(run2).run = Sdo nop nop Reset Sck nop nop Next 'Auslesen des FIFOs beenden Set Cs nop nop Next 'reset FIFO Set Sdi Call Spi_send(&Hce89) Call Spi_send(&Hce8b) Reset Cs Reset Sdi Set Lesen_flag Gifr = 128 'In der Zwischenzeit aufgelaufene Interrupts auf Int1 abwürgen Return ' Read first status byte ' (z.B. um mittels Bit 0/1 auf vorhandenes Funksignal zu testen) '------------------------------------------------------------------------------ Rfm01_status: Reset Sdi Reset Cs For Run = 7 To 0 Step -1 Set Sck nop nop Status.run = Sdo Reset Sck nop nop Next Set Cs Return 'SPI Kommunikation '------------------------------------------------------------------------------ Sub Spi_send(byval Cmd2spi As Word) Reset Cs For Run = 15 To 0 Step -1 Sdi = Cmd2spi.run Set Sck Waitus 10 Reset Sck Waitus 10 Next Set Cs End Sub ' Rfm01 Initialisieren '------------------------------------------------------------------------------ Sub Init_funkmodul Waitms 100 Call Spi_send(&H896b) Call Spi_send(&Ha619) Call Spi_send(&Hc042) Call Spi_send(&Hcc00) Call Spi_send(&Hc6f7) Call Spi_send(&Hc42c) Call Spi_send(&Hc89f) Call Spi_send(&Hce86) Call Spi_send(&He000) Call Spi_send(&Hc040) '433.920 MHz 'FIFO fill bei VDI AND Sync Word (WICHTIG!!!) 'Datenrate irgendwo bei 2 kbit/s 'Duty Cycle und Wake-up aus 'Automatische Frequenzkorrektur ein (Interessant: Das 2. Statusbyte zeigt mit 'einigen Bits an, um wieviel Hz die Frequenz nachgeregelt wird) 'Beschreibung der Register wurde Datenblatt des RF02 ICs entnommen (nicht 'Datenblatt des RFM01 Moduls / Programming guide) End Sub