Hallo Zusammen,

ich hab mir jetzt für meinen Roboter auch 2 RFM12 Module von Pollin gekauft. Um auch mal von meinem Pc aus mit diesem kommunizieren zu können.

Dazu habe ich mir zunächst eine Schaltung gebaut die wie folgt aussieht:
PC --[RS232]--> MAX232 --[TTL-RS232]--> AVR (Mega --[SPI]--> RFM12

So weit so gut.
Dann hab ich auf den Controller folgendes Test-Programm aufgespielt:
(Erstmal den PC-Teil weg gelassen)
Code:
$regfile = "m8def.dat"
$crystal = 8000000

'DDR = &B76543210   ; 0=Eingang  ; 1=Ausgang
Ddrb = &B00101100
Ddrc = &B00000100
Ddrd = &B01000000
Portb = &B00000000
Portc = &B00000000
Portd = &B00000000

Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0

Declare Sub Rfm_init
Declare Sub Rfm_send

Dim Text As String * 20
Dim Spi_data As Integer                                     '2 Bytes
Dim Zeichen As String * 1
Dim Text_send As String * 50
Dim A As Byte
Dim B As Byte
Dim Temp As String * 1

Led Alias Portd.6

Enable Interrupts

Spiinit

wait 1

Rfm_init
Ddrc.0 = 1
Portc.0 = 1
Ddrd.2 = 0

Do
   Text_send = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
   Rfm_send
   Wait 1
Loop


Sub Rfm_init
  Set Led
  Reset Portc.2                                             'Modulpower aus
  Waitms 400
  Set Portc.2                                               'Modulpower an
  Waitms 200
  Spi_data = &H80D7
  Spiout Spi_data , 2
  Spi_data = &H8239
  Spiout Spi_data , 2
  Spi_data = &HA640
  Spiout Spi_data , 2
  Spi_data = &HC647
  Spiout Spi_data , 2
  Spi_data = &H94A0
  Spiout Spi_data , 2
  Spi_data = &HC2AC
  Spiout Spi_data , 2
  Spi_data = &HCA81
  Spiout Spi_data , 2
  Spi_data = &HC483
  Spiout Spi_data , 2
  Spi_data = &H9850
  Spiout Spi_data , 2
  Spi_data = &HE000
  Spiout Spi_data , 2
  Spi_data = &HC800
  Spiout Spi_data , 2
  Spi_data = &HC400
  Spiout Spi_data , 2
  Reset Led
End Sub

Sub Rfm_send
  Set Led
  Spi_data = &H0000
  Spiout Spi_data , 2
  Spi_data = &H8239
  Spiout Spi_data , 2


  Spi_data = &HAA
  Do
  Loop Until Pind.2 = 1
  Spiout Spi_data , 1
  Spi_data = &HAA
    Do
  Loop Until Pind.2 = 1
  Spiout Spi_data , 1
  Spi_data = &HAA
    Do
  Loop Until Pind.2 = 1
  Spiout Spi_data , 1
  Spi_data = &H2D
    Do
  Loop Until Pind.2 = 1
  Spiout Spi_data , 1
  Spi_data = &HD4
    Do
  Loop Until Pind.2 = 1
  Spiout Spi_data , 1
  For B = 1 To 100
  For A = 1 To Len(text_send)
    Temp = Mid(text_send , A , 1)
    Spi_data = Asc(temp)
      Do
  Loop Until Pind.2 = 1
    Spiout Spi_data , 1
  Next A
  Next B
  Reset Led
End Sub

End
Anschluss vom RFM zum AVR ist wie folgt:

RFM12 -> M8
SCK -> SCK
SDO -> MISO
SDI -> MOSI
nSEL -> SS
nIRQ -> INT0
VDD -> PC2
FSK -> PC0
DCLK, FFIT -> PC1
NINT, VDI -> PB1

Das programm sollte nun also alle 1 Sekunden Daten abschicken. Während des sendens müsste die LED leuchten.
Nun hab ich mal zusammen mit einem Kollegen ein Funkgerät daneben gehalten. Man konnte tatsächlich hören das was gesendet wird
ABER: Was mich irritiert hatte: Während die LED leuchtete war nur rauschen zu hören. Und so lange wie die LED aus war, war dann ein Piepton zu hören. Wie kann das denn sein? Ich dachte das Modul sendet sofort das was vom Bus kommt. Denn der hat doch nur ein 16 Bit FIFO. Wie kann er dann eine ganze Sekunde lang was senden, während auf dem Bus nichts geschickt wird?
Aber soll erstmal zweitrangig sein. Es wird ja schonmal irgendwas gesendet.

Nun hab ich mich auch mal an den Empfänger gewagt:
Das Gebilde schaut wie folgt aus:

RFM12 --[SPI]--> AVR (Mega32)
So, als Programm hab ich folgendes geschrieben:
Code:
$regfile = "m32def.dat"
$crystal = 8000000

Ddra = &B01111000
Ddrb = &B10110000
Ddrc = &B11110000
Ddrd = &B00010000
Porta = &B00000000
Portb = &B00000100
Portc = &B00000000
Portd = &B00001000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Porta.6 , Rs = Porta.4
Config Lcdbus = 4
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0

Enable Interrupts 

Waitms 10
Initlcd
Cursor Off
Waitms 10

Spiinit
Waitms 100

'RF12 Init:
  Waitms 200
  Locate 1 , 1
  Lcd "Start INIT..."
  Reset Porta.3                                             'Modulpower aus
  Waitms 1200
  Set Porta.3
  Waitms 200                                                'Modulpower an

  Spi_data = &H80D7
  Spiout Spi_data , 2
  Spi_data = &H82D9
  Spiout Spi_data , 2
  Spi_data = &HA640
  Spiout Spi_data , 2
  Spi_data = &HC647
  Spiout Spi_data , 2
  Spi_data = &H94A0
  Spiout Spi_data , 2
  Spi_data = &HC2AC
  Spiout Spi_data , 2
  Spi_data = &HCA81
  Spiout Spi_data , 2
  Spi_data = &HC483
  Spiout Spi_data , 2
  Spi_data = &H9850
  Spiout Spi_data , 2
  Spi_data = &HE000
  Spiout Spi_data , 2
  Spi_data = &HC800
  Spiout Spi_data , 2
  Spi_data = &HC400
  Spiout Spi_data , 2

  Spi_data = &HCA81
  Spiout Spi_data , 2
  'Enable FIFO
  Spi_data = &HCA83
  Spiout Spi_data , 2
  'Set Portb.2

Locate 1 , 1
Lcd "Wait for data..."
Set Error_led

Do
Loop Until Pinb.2 = 0

  Spi_data = &H0000
  Spiout Spi_data , 2

  Spi_data = &HB000
  Spiout Spi_data , 2

Locate 1 , 1
Lcd "Jetzt kommt was"
Set Error_led

Do
Loop

End
Anschluss ist hier wie folgt:
RFM12 -> M32
SCK -> SCK
SDO -> MISO
SDI -> MOSI
nSEL -> SS
nIRQ -> INT2 (PB2)
VDD -> PA3
FSK -> PA0
DCLK, FFIT -> PA1
NINT, VDI -> PA2

Das Proggi läuft durch, bis auf dem Display drinne steht "Wait for data..."
Und da bleibt es stehen. Ganz egal was ich mit dem Sender mache.

Beim durchstöbern der Suche hab ich hier noch ein anderes Empfangs-Programm gefunden, welches ich getestet habe.
Bei diesem Blick ich allerdings nicht durch
Hier mal der Code:

Code:
$regfile = "m32def.dat"
$crystal = 8000000

'DDR = &B76543210   ; 0=Eingang  ; 1=Ausgang
Ddra = &B01111000
Ddrb = &B10110000
Ddrc = &B11110000
Ddrd = &B00010000
Porta = &B00000000
Portb = &B00000100
Portc = &B00000000
Portd = &B00001000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Porta.6 , Rs = Porta.4
Config Lcdbus = 4

Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_readys
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Senden
Declare Sub Empfangen

Const Rf12freq = 433.92
Const Rf12baud = 1200
Const Maxchar = 16

' config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1

Led Alias Portd.4                                           'Im Text als Portd.7


Waitms 20

Initlcd
Cursor Off

Waitms 10

Locate 1 , 1
Lcd " Cyberdriver 2"
Locate 2 , 1
Lcd " Test-Programm"
Wait 1

' werden benötigt für rf12_ready
Spi_cs Alias Portb.4                                        ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6                                        ' MISO-PIN
Set Spi_cs

' init the spi pins
Spiinit

Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
'Dim J As Byte

Locate 1 , 1 : Lcd "Init RFM12      "
Waitms 100
Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
Locate 1 , 1 : Lcd "Set Frequenz    "
Waitms 100
Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Locate 1 , 1 : Lcd "Set Bandwith    "
Waitms 100
Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Locate 1 , 1 : Lcd "Set Baudrate    "
Waitms 100
Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
Locate 1 , 1 : Lcd "Set Tx-Power    "
Waitms 100
Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift


'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
'Text = "433MHz Test #" + J

' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren

Do                                                                              ' Ewigschleife
   Empfangen
   Toggle Led
   Locate 1 , 1 : Lcd "Ready           "
   Wait 1
Loop

End

' ########################################################################
' ####### Tranceiverroutinen
' ########################################################################

Sub Empfangen
   Locate 1 , 1 : Lcd "Empfange        "
   Waitms 100
   Locate 2 , 1 : Lcd "                "
   Locate 2 , 1
   Call Rf12_rxdata(maxchar)
   For Count = 1 To Maxchar
      Lcd Chr(rfdata(count)) ;
      Waitms 100
   Next Count
End Sub

Sub Senden
   Locate 1 , 1 : Lcd "Sende           "
   Waitms 100
   Call Rf12_txdata(maxchar)
   Waitms 10
End Sub

' ########################################################################
' ###### Unterroutinen
' ########################################################################

Sub Rf12_init:
   Waitms 150
   Temp = Rf12_trans(&Hc0e0)
   Temp = Rf12_trans(&H80d7)
   Temp = Rf12_trans(&Hc2ab)
   Temp = Rf12_trans(&Hca81)
   Temp = Rf12_trans(&He000)
   Temp = Rf12_trans(&Hc800)
   Temp = Rf12_trans(&Hc4f7)
End Sub

Sub Rf12_setfreq(byval Freq As Single)
   Freq = Freq - 430.00
   Temp = Freq / 0.0025
   If Temp < 96 Then
      Temp = 96
   Elseif Temp > 3903 Then
      Temp = 3903
   End If
   Temp = Temp + &HA000
   Temp = Rf12_trans(temp)
End Sub

Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
   Drssi = Drssi And 7
   Gain = Gain And 3
   Temp = Bandwith And 7
   Shift Temp , Left , 2
   Temp = Temp + Gain
   Shift Temp , Left , 3
   Temp = Temp + Drssi
   Temp = Temp + &H9400
   Temp = Rf12_trans(temp)
End Sub

Sub Rf12_setbaud(byval Rfbaud As Long )
   Local Ltemp As Long
   If Rfbaud < 663 Then Exit Sub
   If Rfbaud < 5400 Then
      Temp = 43104 / Rfbaud
      Temp = Temp + &HC680
   Else
      Ltemp = 344828 / Rfbaud
      Temp = Ltemp
      Temp = Temp + &HC600
   End If
   Decr Temp
   Temp = Rf12_trans(temp)
End Sub

Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
   Outpower = Outpower And 7
   Temp = Fskmod And 15
   Shift Temp , Left , 4
   Temp = Temp + Outpower
   Temp = Temp + &H9800
   Temp = Rf12_trans(temp)
End Sub

Sub Rf12_txdata(byval Maxchar As Byte)
   Temp = Rf12_trans(&H8238)
   Rf12_ready
   Temp = Rf12_trans(&Hb8aa)
   Rf12_ready
   Temp = Rf12_trans(&Hb8aa)
   Rf12_ready
   Temp = Rf12_trans(&Hb8aa)
   Rf12_ready
   Temp = Rf12_trans(&Hb82d)
   Rf12_ready
   Temp = Rf12_trans(&Hb8d4)
   Rf12_ready
   For Count = 1 To Maxchar
      Rf12_ready
      Temp = &HB800 + Rfdata(count)
      Temp = Rf12_trans(temp)
   Next Count
   Rf12_ready
   Temp = Rf12_trans(&H8208)
End Sub

Sub Rf12_rxdata(byval Maxchar As Byte)
   Temp = Rf12_trans(&H82c8)
   Temp = Rf12_trans(&Hca81)
   Temp = Rf12_trans(&Hca83)
   For Count = 1 To Maxchar
      Rf12_ready
      Temp = Rf12_trans(&Hb000)
      Rfdata(count) = Temp
   Next Count
   Temp = Rf12_trans(&H8208)
End Sub

Function Rf12_trans(byval Wert As Word) As Word
   Local Lowbyte As Byte
   Local Highbyte As Byte
   Lowbyte = Wert And 255
   Shift Wert , Right , 8
   Reset Spi_cs
   Highbyte = Spimove(wert)
   Lowbyte = Spimove(lowbyte)
   Set Spi_cs
   Temp = Highbyte * 256
   Temp = Temp + Lowbyte
   Rf12_trans = Temp
End Function

Sub Rf12_ready
   Local I As Word
   Reset Spi_cs
   For I = 1 To 65000
      If Spi_sdo = 1 Then Exit For
   Next
End Sub
Auf dem Display steht dann immer "Empfange"
Nach einiger Zeit läuft dann die untere Zeile mit wilden Zeichen voll (Das Zeichen gibts im Display-Datenblatt nicht mal, sind grob gesagt 4 waagerechte striche übereinander).
So, an dem Verhalten ändert sich aber absolut nichts, ob ich den sender an hab oder aus. Das verhalten ist immer exakt gleich.

Hm, nun ja. Hoffe das sich jemand diesen Langen Text durchliest.
Wäre echt super dankbar für jede Hilfe.
Komm hier echt absolut nimmer weiter.
Will zumidnest mal ein Paar Zeichen übertragen können.
Ich denke danach würd ich selbst weiter kommen.

Hoffe auf hilfe.
Gruß, euer Robodriver