Servus, mal wieder, zusammen,
endlich habe ich jetzt die richtigen RFM12 Module mit 433Mhz bekommen. Heute habe ich sie integriert und wollte sie natürlich testen.
Beschaltet habe ich sie beide wie hier:
Bild hier  

an jeweils 2 Atmega88.

Hier ist der Code des Senders:
Code:
' #######################################################################
' ###    generated. Take care that the chip supports all fuse bytes.
' ### RFM12-Test in Bascom
' ### Basiert auf Code von Benedikt K. ( in C )
' ### Joachim Fossie Bär Reiter 04/2007 ( Bascom )
' ### Wigbert Picht Verbesserungen
' ### Version V0.1    03.06.07
' ###                   www.comwebnet.de
' ########################################################################
' #        !!   ATMEGA mit externen Takt Fussen !!
' #########################################################################

$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000                                          '
$baud = 19200
Baud = 19200

Config Portd.0 = Output                                     'LED zur Schleifenkontrolle
Portd.0 = 1
Waitms 500
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 = 19200
Const Maxchar = 32


'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

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

'init the spi pins
Spiinit

' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Dim S As String * 10



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


' ########################################################################
' ###### Hauptproggi
' ########################################################################


Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"

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

Do                                                          'Ewigschleife


                                                       'Goto Empf
 Schleife:

 Toggle Portd.5                                             'Schleifenkontrolle

 If Len(s) > 2 Then                                         'wenn String >... dann Ausgabe
 'interrupt niRQ                                         'warten auf nIRQ
 Senden
 Text = S
 S = ""

 End If
 Goto Schleife

 Zuruck:
Loop
End

' ########################################################################
' ####### Tranceiverroutinen
' ########################################################################
Sub Empfangen
  Print "Empfange"
  Call Rf12_rxdata(maxchar)
  For Count = 1 To Maxchar
    Print Chr(rfdata(count)) ; "-";
  Next Count
  Print
  Goto Zuruck
End Sub

Sub Senden
  'Waitms 1                                                  'e
' Hier ist die Senderoutine
  Print "Sende"
  Call Rf12_txdata(maxchar)
  Waitms 10
End Sub

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

Sub Rf12_init:
  Waitms 150
  Temp = Rf12_trans(&Hc0e0)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&H80d7)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&Hc2ab)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&Hca81)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&He000)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&Hc800)
  Toggle Portd.0
  Waitms 400
  Temp = Rf12_trans(&Hc4f7)
  Toggle Portd.0
  Waitms 400
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_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb82d)
  Rf12_readys
  Temp = Rf12_trans(&Hb8d4)
  Rf12_readys
  For Count = 1 To Maxchar
    Rf12_readys
    Temp = &HB800 + Rfdata(count)
    Temp = Rf12_trans(temp)
  Next Count
  Rf12_readys
  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_readys                                             'ready Senden
  Reset Spi_cs
  While Spi_sdo = 0
  Wend
End Sub

Sub Rf12_ready                                              'ready Empfangen
  Reset Spi_cs
  While Spi_sdo = 0
   If Len(s) > 0 Then                                       'Wenn ein string eingelesen
    Temp = Rf12_trans(&Hca81)                               'Fifo deaktivieren
    Temp = Rf12_trans(&H8208)                               'Empf. ausschalten
    Goto Schleife                                           'Springe zum hauptprogramm
   Else                                                     'sonst warte weiter auf Empfangsdaten
   Wend
  End If
End Sub

'  #################################################################
'  ######## String einlesen durch Interrupt
'  #################################################################
Und hier der des Empfängers:

Code:
' #######################################################################
' ###    generated. Take care that the chip supports all fuse bytes.
' ### RFM12-Test in Bascom
' ### Basiert auf Code von Benedikt K. ( in C )
' ### Joachim Fossie Bär Reiter 04/2007 ( Bascom )
' ### Wigbert Picht Verbesserungen
' ### Version V0.1    03.06.07
' ###                   www.comwebnet.de
' ########################################################################
' #        !!   ATMEGA mit externen Takt Fussen !!
' #########################################################################

$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000                                          '
$baud = 19200
Baud = 19200

Config Portd.5 = Output                                     'LED zur Schleifenkontrolle
Home
Lcd "Starte init"
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 = 19200
Const Maxchar = 32
Config Lcd = 16 * 2
Config Portb.0 = 1
Config Lcdpin = Pin , Db7 = Portc.3 , Db6 = Portc.2 , Db5 = Portc.1 , Db4 = Portc.0 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Portd.7 = 0
Config Portd.6 = 0
Portb.0 = 1

'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

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

'init the spi pins
Spiinit

' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Dim S As String * 10

'Einlesen der String durch Interrupt


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


' ########################################################################
' ###### Hauptproggi
' ########################################################################


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

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

Do                                                          'Ewigschleife

 Empfangen
                                                       'Goto Empf
 Schleife:

 Toggle Portd.5                                             'Schleifenkontrolle

 If Len(s) > 2 Then                                         'wenn String >... dann Ausgabe
 'interrupt niRQ                                         'warten auf nIRQ

 Text = S
 S = ""
 Empfangen
 End If
 Goto Schleife

 Zuruck:
Loop
End

' ########################################################################
' ####### Tranceiverroutinen
' ########################################################################
Sub Empfangen
Home
  Lcd "Empfange"
  Call Rf12_rxdata(maxchar)
  Locate 2 , 1
  For Count = 1 To Maxchar
    Lcd Chr(rfdata(count)) ; "-";
  Next Count
  Print
  Goto Zuruck
End Sub

Sub Senden
  'Waitms 1                                                  'e
' Hier ist die Senderoutine
  Print "Sende"
  Call Rf12_txdata(maxchar)
  Waitms 10
End Sub

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

Sub Rf12_init:
  Waitms 150
  Home
Lcd "C0e0"
  Temp = Rf12_trans(&Hc0e0)
   Home
Lcd "80d7"
  Temp = Rf12_trans(&H80d7)
   Home
Lcd "Cc2ab"
  Temp = Rf12_trans(&Hc2ab)
   Home
Lcd "Ca81"
  Temp = Rf12_trans(&Hca81)
   Home
Lcd "e000"
  Temp = Rf12_trans(&He000)
   Home
Lcd "c800"
  Temp = Rf12_trans(&Hc800)
   Home
Lcd "c4f7"
  Temp = Rf12_trans(&Hc4f7)
   Home
Lcd "fertig"
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_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb8aa)
  Rf12_readys
  Temp = Rf12_trans(&Hb82d)
  Rf12_readys
  Temp = Rf12_trans(&Hb8d4)
  Rf12_readys
  For Count = 1 To Maxchar
    Rf12_readys
    Temp = &HB800 + Rfdata(count)
    Temp = Rf12_trans(temp)
  Next Count
  Rf12_readys
  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_readys                                             'ready Senden
  Reset Spi_cs
  While Spi_sdo = 0
  Wend
End Sub

Sub Rf12_ready                                              'ready Empfangen
  Reset Spi_cs
  While Spi_sdo = 0
   If Len(s) > 0 Then                                       'Wenn ein string eingelesen
    Temp = Rf12_trans(&Hca81)                               'Fifo deaktivieren
    Temp = Rf12_trans(&H8208)                               'Empf. ausschalten
    Goto Schleife                                           'Springe zum hauptprogramm
   Else                                                     'sonst warte weiter auf Empfangsdaten
   Wend
  End If
End Sub

'  #################################################################
'  ######## String einlesen durch Interrupt
'  #################################################################

Onrxd:
  S = S + Chr(udr)
Return
Soviel dazu.Jetzt kommen die Fehler:
Am Sender habe ich eine überprüfungsled an Portd.0. Diese leuchtet aber nur extrem schwach. Ich habe den Code auch schon reduziert wie hier:
Code:
$regfile = "m88def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 8000000                                          '
$baud = 19200
Baud = 19200

Config Portd.0 = Output                                     'LED zur Schleifenkontrolle
Portd.0 = 1
Allerding bleibt das Phänomen. Wenn ich allerding die beiden Baudzeilen entferne leuchtet sie wieder sehr hell wie gewohnt. Was soll das?

Mein 2. Fehler (und der ist mir sehr wichtig): Das Programm läuft an, hält aber bei Sender und empfänger jeweil bei der Init Funktion an der Stelle He000 auf (also direkt beim Aufruf). Woran liegt das? Den 1k Widerstand zwischen Data und 5V liegt an und ich verwenden den internen 8mhz Os.

Ich wäre euch tausendfach dankbar wenn ihr mir helft diese Module ENDLICH zum laufen zu bringen. Bin am verzweifeln.