- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: RFM12 Module von Pollin am AVR

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270

    RFM12 Module von Pollin am AVR

    Anzeige

    Praxistest und DIY Projekte
    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
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    78
    Beiträge
    80
    Hallo
    https://www.roboternetz.de/phpBB2/ze...ighlight=rfm12
    seh dir mal das untere Programm von Knickohr an und die Pinbelegung.
    Das Programm funktioniert bei mir auf selbst gebauten Platinen ohne Probleme allerdings habe ich int nicht angeschlossen und FSK mit 10 Kohm gegen 5V+ gelegt.
    Desweiteren seh mal bei google und glaube auch hier nach ,mit dem Pollinboard soll es mit dem Optokoppler Probleme geben (behoben von Pollin ?) die haben alle bruecken eingebaut soweit ich gelesen hab.Wollte mir auch eins holen darum habe ich erstmal durchgelesen ob das Board was ist.
    Ich hoffe ich konnte dir weiterhelfen
    Gruß raggy

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Danke für deine Antwort,

    weiter bringt mich das allerdings nicht.

    Das Programm von Knickohr ist ja exakt das was ich hier gepostet habe und auf meinem Controller getestet habe. Hab lediglich die Pins entsprechend angepasst.
    FSK mal als Eingang konfiguriert und den Pull-Up Widerstand aktiviert (im geposteten Programm ist der noch aus, habs aber auch mit pull-up schonmal probiert), ergibt ja den gleichen Effekt.
    int ist ja bei mir auch als Eingang.
    Und beim empfangen läuft wie gesagt alle 1 Sekunde die unter Display Zeile mit einem komischen, nichtidentifizierbarem Zeichen voll (Welches das Display laut Datenblatt gar nicht beinhaltet)

    Das Pollinboard hab ich nicht. Das ist eine Schaltung auf Streifenrasterplatinen zusammen gelötet.[/list]
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    78
    Beiträge
    80
    Hi
    ich vermisse in deiner Pin aufstellung Gnd
    AVR und RFM12 oder so sollten gemeinsam Gnd haben
    Zum anderen die Baud hat nichts mit der seriellen schnittstelle zu tun,es muß an dem Sender und Empfaenger gleich eingestellt werden durch die Initalisierung am Programm anfang.
    Wenn du an dem Programm nichts veraendert hast als nur die Pin dann muß es ansich laufen,wuerde die Hardware noch mal nachsehen ob sich da nicht was eingeschlichen hatBei mir funktioniert das Programm sowohl mit Atmega8 als auch mit Atmega16 /32

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Also jetzt hab ich auch mal am Sender das Programm von Knickohr rein geladen.

    Der Sender arbeitet ja mit einem Mega8, also musste ich da keinerlei Änderungen am Programm machen.

    Der Empfänger arbeitet mit einem Mega 32. Desshalb musste ich da ein wenig anpassen.
    Aber ich blick in dem Programm net durch. Das ist mir zu verschachtelt.

    Warum läuft denn beim Empfänger ständig die untere Zeile mit diesem merkwürdigem Zeichen voll? Obwohl nichts empfangen werden kann.
    Muss der Empfänger nicht so lange nichts machen, bis er was empfängt?

    Die beiden GND vom Modul liegen auf dem gleichen GND wie der Controller.

    Die Hardware hab ich schon mehrfach durchgemessen, aber keine Fehler gefunden.

    Die Modul-Initialisierung läuft übrigens bei beiden Modulen scheinbar fehlerfrei duch


    ^^ Nachtrag:
    Ach ja, einwas ist bei mir noch anders als bei Knickohr.
    Meine Schaltungen laufen beide auf 8MHz
    Hab das im Programm natürlich bei der Taktung umgeschrieben.
    Dürfte doch eigentlich nichts aus machen oder?
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    78
    Beiträge
    80
    Hallo
    Wenn Du mich fragst wuerde ich es erstmal genauso machen wie in dem
    Programm,dann kanst du es immer noch umaendern und die auswirkungen sehen.
    Hat aber den vorteil das mann erstmal sieht ob alles in Ordnung ist,RFM12
    und auch die restliche Schaltung.
    Wenn da wirres zeug ankommt ist irgendwas verkehrt habe beim ersten mal auch erst rumexperimentiert,bis es lief.Ob der FSK mit geschalteten Pull up vom Atmega das richtige ist ??? der wiederstand ist viel hoeher (Datenblatt)
    mehr weiß ich leider auch nicht
    Zum Programm das ist fuer mich auch so ein Raetzel aber alle im Internet bauen darauf auf. zumindest Bascom.
    Gruß raggy

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Danke für deine Antwort.

    Also um weiter Fehler ausschließen zu können, hat mir ein Freund nun 2 Pollin-Evaluation-Boards zur Verfügung gestellt. Eins mit dem RFM01 Modul und das zweite mit einem RFM02 Modul.

    Ist zwar nicht das RFM12-Modul was ich brauch, aber erstmal egal.
    WEIL:

    Er hat da das Test-Programm von Pollin drauf gespielt. Nun übersetze ich den Quellcode von C in Basic um dann zumindest mal zu sehen ob meine Übersetzung korrekt ist.
    Und wie ich bis jetzt feststellen musste, ist meine Übersetzung offensichtlich absolut falsch. Denn mit dem Basic-Code Empfängt das Modul nichts.

    Also scheint etwas an der Konfiguration falsch zu sein.
    Demm beim Empfangen wird ja nur Konfiguriert und dann auf den IRQ gewartet. Aber nach meiner Konfiguration über Basic kommt kein IRQ.
    Daten kommen aber vom anderen Modul 100%ig an. Das beweist ja, wenn ich wieder das C-Programm auf spiele, dann empfängt der Chip was.

    Also liegt hier definitiv der Fehler im Basic.
    Meine Vermutung ist, der Fehler liegt genau genommen beim SPI.
    Mit SPI hab ich noch nie gearbeitet und keinerlei Erfahrung.

    Schaut euch den Code bitte mal an, ob ihr das Fehler finden könnt:
    Code:
    ' Empfangen von Daten auf dem Evaluation-Board
    ' Modul: RFM01
    ' AVR: Mega8
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'DDR = &B76543210   ; 0=Eingang  ; 1=Ausgang
    Ddrb = &B00000000
    Ddrc = &B00000000
    Ddrd = &B01110000
    Portb = &B00000000
    Portc = &B00000000
    Portd = &B00000000
    
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1       ' LED zur Schleifenkontrolle
    
    Declare Function Rf01_trans(byval Wert As Word) As Word
    
    Dim A As Byte
    Dim Temp As Word
    
    Led1 Alias Portd.6
    Led2 Alias Portd.5
    Modul_power Alias Portd.4
    
    ' 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
    
    Spiinit
    
    Wait 1
    
    Reset Modul_power
    For A = 1 To 6
      Toggle Led1
      Waitms 200
    Next A
    
    Reset Led1
    
    Set Modul_power
    
    Waitms 200
    
      Temp = Rf01_trans(&H0000)
      Temp = Rf01_trans(&H898a)
      Temp = Rf01_trans(&Ha640)
      Temp = Rf01_trans(&Hc847)
      Temp = Rf01_trans(&Hc69b)
      Temp = Rf01_trans(&Hc42a)
      Temp = Rf01_trans(&Hc240)
      Temp = Rf01_trans(&Hc080)
      Temp = Rf01_trans(&Hce88)
      Temp = Rf01_trans(&Hce8b)
      Temp = Rf01_trans(&Hc081)
    
    
    Ddrd.7 = 1                                                  'FSK
    Ddrd.2 = 0                                                  'nIRQ
    
    Do
    
      Do
      Loop Until Pind.2 = 0
    
      Set Led2
      Waitms 300
      Reset Led2
    
    Loop
    
    
    
    Function Rf01_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
       Rf01_trans = Temp
    End Function
    
    End
    (Ist der Code für Mega8 auf den Pollin-Evaluation-Board mit angeschlossendem RFM01 Modul


    Bin schon total verzweifelt
    So schwer kann das doch wohl nicht sein....
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    78
    Beiträge
    80
    Wenn Du mit Interrupt arbeites muß Du in Config SPI auch interrupt = On
    setzen.
    $framesize = 40 ist wichtig (Variable)
    ansonsten weiß ich wirklich nicht weiter.
    Gruß raggy

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Okay, also ich hab es jetzt nochmal noch feiner umgeschrieben das Programm.
    Und hab so weit erstmal etwas hin bekommen, das die Schaltung zumindest reagiert, sobald Daten an kommen.
    Irgendwie scheint da das Hardware-SPI nicht so richtig zu funktionieren oder ich bein einfach zu blöd für...
    Hab das SPI jetzt raus gelassen und ne komplette Software-SPI Lösung geschrieben. Und damit funktionierts...

    Für alle dies Interessiert, hier der code (nur Schade das result beim Empfangen immer 0x00 ist, obwohl beim ersten Byte 0x31 gesendet wird...)

    Code:
    ' Empfangen von Daten auf dem Evaluation-Board
    ' Modul: RFM01
    ' AVR: Mega8
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Declare Function Rf01_trans(byval Wert As Word) As Word
    Declare Function Read_fifo() As Byte
    
    Dim A As Byte
    Dim B As Byte
    Dim Temp As Word
    Dim Result As Byte
    
    Led1 Alias Portd.6
    Led2 Alias Portd.5
    Modul_power Alias Portd.4
    Spi_cs Alias Portb.2                                        ' SS-Pin
    Spi_sdo Alias Pinb.4                                        ' MISO-PIN
    
    Ddrd.4 = 1
    Ddrd.5 = 1                                                  'LED 2 Ausgang
    Ddrd.6 = 1
    Reset Led2
    Reset Modul_power
    
    Wait 1
    
    For A = 1 To 6
      Toggle Led2
      Waitms 200
    Next A
    
    Reset Led2
    Set Modul_power
    
    Waitms 200
    
    Portb.2 = 1                                                 'Slave inaktiv
    Portb.3 = 1                                                 'MOSI auf high
    Portb.5 = 0                                                 'Sck Low
    Portb.7 = 1                                                 'FSK high
    Ddrb.2 = 1
    Ddrb.3 = 1
    Ddrb.4 = 0                                                  'MISO = Eingang
    Ddrb.5 = 1
    
    'Ddrd.2 = 0                                                  'INT0 als Eingang
    'Ddrd.7 = 1                                                  'FSK als Ausgang
    
    
      Temp = Rf01_trans(&H0000)
      Temp = Rf01_trans(&H898a)
      Temp = Rf01_trans(&Ha640)
      Temp = Rf01_trans(&Hc847)
      Temp = Rf01_trans(&Hc69b)
      Temp = Rf01_trans(&Hc42a)
      Temp = Rf01_trans(&Hc240)
      Temp = Rf01_trans(&Hc080)
      Temp = Rf01_trans(&Hce88)
      Temp = Rf01_trans(&Hce8b)
      Temp = Rf01_trans(&Hc081)
    
    
    Ddrd.7 = 1                                                  'FSK
    Ddrd.2 = 0                                                  'nIRQ
    
    B = 0
    Do
    
      Do
      Loop Until Pind.2 = 0
      Set Led2
      B = B + 1
      Result = Read_fifo()
      If Result = &H00 Then
        Set Led1
        Waitms 200
        Reset Led1
      End If
    
      If B = 18 Then
        Temp = Rf01_trans(&Hce88)
        Temp = Rf01_trans(&Hce8b)
        B = 0
        'Set Led2
        'Waitms 200
        'Reset Led2
      End If
      Reset Led2
    Loop
    
    
    
    Function Rf01_trans(byval Wert As Word) As Word
    Temp = 0
    Portb.5 = 0                                                 'Low SCK
    Portb.2 = 0                                                 'Low SS
    
    For A = 15 To 0 Step -1
      If Wert.a = 1 Then
        Portb.3 = 1
      Else
        Portb.3 = 0
      End If
      Portb.5 = 1                                               'high sck
      nop
      nop
      nop
      nop
      Portb.5 = 0
    
    Next A
    Portb.2 = 1
    
    End Function
    
    Function Read_fifo() As Byte
      Portb.5 = 0
      Portb.3 = 0
      Portb.2 = 0
      For A = 0 To 15
        Portb.5 = 1
        nop
        Portb.5 = 0
        nop
      Next A
      For A = 7 To 0 Step -1
        If Pinb.4 = 1 Then
          Result.a = 1
        Else
          Result.a = 0
        End If
    
        Portb.5 = 1
        nop
        Portb.5 = 0
        nop
      Next A
      Portb.2 = 1
    
      Read_fifo = Result
    End Function
    
    End
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Hallo!

    Ich würde mich gerne kurz an das Thema dranhängen...
    Hintergrund:
    Ein recht kurzfristiges Projekt wo wir Platinen machen lassen und erstmal ein Grundprogramm benutzen.
    Später soll dann die Funk-Steuerung nachgerüstet werden.
    Also muss ich platz lassen für das RFM01 (nur Empfang).
    Controller ist ein Mega32 und noch kann ich Pins belegen wie ich lustig bin.
    Daher wollte ich nochmal Rückfrage halten, ob das auch wirklich so richtig ist...

    RFM01 <-> Mega32
    VCC 5V gemeinsam mit dem AVR
    SDI <-> MOSI
    SDO <-> MISO
    SCK <-> SCK
    nSel <-> SS
    DATA/nFFS <-> über 1 (10?) kOhm auf VCC


    Folgende Pins sind dann am RFM01 noch unbelegt welche brauche ich?
    2 - nIRQ - Interrupt Request Output (active low)
    4 - DCLK/CFIL/FFIT - Clock Output (AVR hat nen eigenen 16 MHz Schwinger)
    5 - CLK - Clock Output for external µC (wie ist das jetzt anders als DCLK?)
    6 - nRES - Reset Output (active low) - hier sagt er bescheid vonwegen Neustart?
    11 - VDI - Valid Data Indicator - hier eine LED ran?


    Besonders wichtig wäre es zu wissen, ob ich irgendwelche externen Interrupts brauche und an welchem Bein vom RFM01.
    Der Mega32 soll das Hauptprogramm nur bei Empfang unterbrechen.

    Zusatzfrage:
    Wäre es ggfs. möglich mit ein und derselben Pinbelegung zum AVR alternativ auch das RFM12 zu benutzen?

    Vielen Dank schonmal im Voraus....
    Stefan

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen