RFM12 Assembler nix geht

Senpai

Mitglied
14. Mai 2012
143
0
16
Sprachen
  1. Assembler
Hallo,
habe mich mal wieder in eine Sache gestürzt mit der ich bisher noch keine erfahrungen hatte und diesmal geht es um die RFM12 Funkmodule.
Ich wollte zum ausprobieren einen Sender der ein Byte sendet welches heruntergezählt wird und einen empfänger an dem das ausgegebene Byte über LED´s dargestellt wird.
Aber wie erwartet funktioniert es nicht.:mad:
Die initialisierung habe ich nach den infos von Mikrocontroller.net da ich aus dem Datenblatt nicht ganz schlau geworden war

http://www.mikrocontroller.net/articles/RFM12

Programm des Senders(Mega16/4MHz)

Code:
 rjmp init

 .def msb = r16
 .def lsb = r17

 ;***************************************************************
 ;Initialisieren
 ;***************************************************************

 init:
 ;Stack initialisieren
 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

 ;spi initialisieren
 ;PB5(MOSI), PB7(SCK) und PB4 als Ausgang setzen
 ldi r16,0b10110000
 out ddrb,r16

 ; SPI einschalten,MCU als Master deklarieren und SPI clock auf 1/16 der CPU frequenz setzen
 ldi r16,0b01010001
 out SPCR,r16
 
 ;***************************************************************
 ;RFM12 initialisieren
 cbi portb,4
 ;MSB,Grundkonfiguration
 ldi msb,0b1000000
 ;Bit7-2Byte sendepuffer ein, Bit6-2Byte Empfangspuffer ein,
 ;Bit5 und 4-Frequenzbereich 868MHz wählen,Bit3-0 Kondensatorgröße wählen 12,5pF
 ldi lsb,0b11101000
 rcall send

 cbi portb,4
 ;Msb Power Management
 ldi msb,0b10000010
 ;Bit7 Empfängerteil aus, Bit6 Basisband empfang aus, Bit5 Sender komplett ein, Bit4synthesizer einschalten
 ;Bit3 Quarz ein, Bit2 Brownouterkennung aus, Bit1 Wake-uptimer aus, Bit0 CLK-takt ausgeben(0)
 ldi lsb,0b00111000
 rcall send

 cbi portb,4
 ;Frequency setting
 ;Setze Sende und Empfangsfrequenz auf 868MHz(1600)
 ldi msb,0b10100110
 ldi lsb,0b01000000
 rcall send

 cbi Portb,4
 ;MSB,Bitrate 
 ldi msb,0b11000110
 ;Funkübertragung(9600Bit/s)
 ldi lsb,0b00100011
 rcall send

 cbi Portb,4
 ;Msb Senderkonguration
 ldi msb,0b10011000
 ;Bit7-4 Frequenzhub +-15KHz(0000), Bit3-0 Ausgangsleistung Max(0000)
 ldi lsb,0
 rcall send


 clr lsb


 ;***************************************************************
 ;Hauptprogramm
 ;***************************************************************

 main:
 dec lsb

 cbi Portb,4
 ;MSB Senderegister anschreiben
 ldi msb,0b1011000
 rcall send
 
 rjmp main
 ;***************************************************************
 ;Unterprogramme
 ;***************************************************************

 ;Wert senden
 send:
 out SPDR,msb
 rcall wait
 out SPDR,lsb
 rcall wait
 sbi Portb,4
 ret


 wait:
 ;SPIF im Register SPSR gesetzt?
 ;Wenn ja Senden beendet
 sbis SPSR,SPIF
 rjmp wait

 ret


Programm des Empfängers (ATmega8/4MHz)

Code:
 ;*************************************************************** 
 ;***************************************************************
 ;PB5 = SCK
 ;PB4 = MISO
 ;PB3 = MOSI
 ;PB2 = Nsel
 ;PB1 = NIRQ
 ;*************************************************************** 
 ;*************************************************************** 
 .def msb=r16
 .def lsb=r17

 ;*************************************************************** 
 ;Initialisierung
 ;*************************************************************** 
 rjmp init

 init:
 ;Stack initialisieren
 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

 ;PortD alsAusgang definieren
 ldi r16,255
 out ddrd,r16

 ;spi initialisieren
 ;PB3(MOSI), PB5(SCK) und PB2 als Ausgang setzen
 ldi r16,0b00101100
 out ddrb,r16

 ; SPI einschalten,MCU als Master deklarieren und SPI clock auf 1/16 der CPU frequenz setzen
 ldi r16,0b01010001
 out SPCR,r16
 
 ;*************************************************************** 
  ;RFM12 initialisieren

 cbi portb,2
 ;MSB,Grundkonfiguration
 ldi msb,0b1000000
 ;Bit7-2Byte sendepuffer einschalten,Bit6-2Byte Empfangspuffer einschalten,
 ;Bit5 und 4-Frequenzbereich 868MHz wählen,Bit3-0 Kondensatorgröße wählen 12,5pF
 ldi lsb,0b11101000
 rcall send

 cbi Portb,2
 ;MSB,Power Management
 ldi msb,0b10000010
 ;Bit7 Receiver ein, Bit6 Basisempfangsteil ein, Bit5Sender Aus, Bit4 Synthesizer aus,
 ;Bit3 Quarz ein, Bit2 Brownoutdetektor aus, Bit1 Wakeuptimer aus, Bit0 CLK Ausgang ein
 ldi lsb,0b11001001
 rcall send

 cbi portb,2
 ;Frequency setting command
 ;Setze Sende und Empfangsfrequenz auf 868MHz(1600)
 ldi msb,0b10100110
 ldi lsb,0b01000000
 rcall send

 cbi Portb,2
 ;Data rate command
 ;MSB,Bitrate 
 ldi msb,0b11000110
 ;Funkübertragung(9600)
 ldi lsb,0b00100011
 rcall send

 cbi Portb,2
 ;receiver control command
 ldi msb,0b11000000
 ;Bit7-5 (100)Basisband =200KHz, Bit4,3 (00)Dämpfung=0,
 ;Bit2-0 Empfindlichkeit des Empfängers (000)-103dB
 ldi lsb,0b10000000
 rcall send

 cbi Portb,2
 ;Data Filter
 ldi msb,0b11000010
 ;Bit7 Signaltakterkennun automatisch ein,Bit6 manuelle signaltakterkennung(einstellung wird ignoriert bei aktiver automatischer) langsam(0)
 ;Bit5=1(unbekannt), Bit4 Filtertyp Digital(0), Bit3=1(Unbekannt),
 ;Bit2-0 Schwellwert ab wann das signal stark genug ist um verarbeitet zu werden(100)mittel
 ldi lsb,0b10101100
 rcall send

 cbi Portb,2
 ;FiFO steuerung
 ldi MSB,0b11001010
 ;Bit7-4 Füllstand des FIFO bis nriq auf low geht (1000)1Byte, Bit3 synchronmuster ist 2Byte lang(0),
 ;Bit2 Fifo wird nach erkanntem synchronmuster gefüllt(0), Bit1 FIFO freigegeben(1), Bit0 Power on reset ein
 ldi lsb,0b10000011
 rcall send

 cbi Portb,2
 ;Automatische Frequenznachregelung
 ldi msb,0b11000100
 ;Bit7-6 AFC immer aktiv (11),Bit5-4 Ziehfrequenzbereich(11), Bit3 übernimmt erechnete werte für den offset(1)
 ;Bit2 Berechnungsmodus präzise(1), Bit1 Offset freigeben(1), Bit0 Berechnung freigeben(1)
 ldi lsb,0b11111111
 rcall send

 ;*************************************************************** 
 ;Hauptprogramm
 ;*************************************************************** 
 main:
 ;NIRQ low? Wenn Ja wurde ein Byte empfangen und kann ausgelesen werden
 sbis PinB,1
 rcall einlesen
 rjmp main

 ;*************************************************************** 
 ;Unterprogramme
 ;***************************************************************

 ;Werte aus r16 und r17 über SPIsenden 
 send:
 out SPDR,msb
 rcall wait
 out SPDR,lsb
 rcall wait
 sbi Portb,2
 ret

 wait:
 ;SPIF im Register SPSR gesetzt?
 ;Wenn ja Senden beendet
 sbis SPSR,SPIF
 rjmp wait
 ret 

 ;***************************************************************

 ;einlesen und Ausgeben der Empfangenen daten
 einlesen:
 ;überprüfe ob empfangen des SPI beendet ist
 rcall wait
 ;übertrage empfangenes Byte nach r18
 in r18,SPDR
 out Portd,r18
 ret



RFM12sender.GIFRFM12empfaenger.GIF

Edit: Die LED´s sind die vom nanoboard und sitzen beim mega 8 an PortD
Und die SPIsignale werden von den controllern korrekt ausgegeben
 
Hallo Senpai,

leider habe ich selber den RFM12B noch nicht eingesetzt, und kann dir nicht sagen, ob die Initialisierung richtig ist.

Ich habe mir trotzdem einmal deine Assemblerprogramme angeschaut und ich meine, etwas gefunden zu haben.

Bei dem Empfänger ist das SPI-Modul ja auch wie beim Sender auf Master konfiguriert. In der Routine "einlesen" müsstest du also erst eine SPI-Übertragung initialisieren, also etwas (Dummybyte oder bestimmtes Byte -> Datenblatt RFM12B nachschauen) in das SPI-Datenregister schreiben. Im Moment hängst du in der Routine "wait", da nie übertragen wird und SPIF nie high wird.

Vielleicht hilft dies ja schon etwas.

Dirk :ciao:
 
Stimmt das macht sinn der RFM12 ist ja ein slave.........:rolleyes:
werde das morgen mal testen

vielen Dank das du dir die mühe gemacht hast da drüber zu gucken dachte mir eig schon das es zu viel verlangt ist
das sich da einer durchwurschtelt :flowers:
 
Hallo,

ich hab letztens nen Thread darüber gefunden. Ich glaube beim deutschen Bascom Forum. Da war ein Link auf eine Seite ...
Gobotronics's Blog - RFM12 programming

Da drin gibts auch den folgenden Link ...
RFM12 Tutorials

Im Bascom-Thread war auch nen Link auf eine Seite, auf der man die Registerinhalte für die Einstellungen berechnen lassen konnte.

Den Bascom-Thread hab ich auch wieder gefunden ...
bascom-forum.de - RFM12 einfacher Code

Ja ... es ist Bascom und kein Assembler. Aber es liefert Informationen wie man das Modul ansprechen kann. Außerdem sind die angegebenen Links sehr gute Einsprungpunkte für eine Fülle weiterer Infos zu den Modulen.

Gruß
Dino
 
So ich habe jetzt den Bereich für das einlesen volgendermaßen geändert

Code:
 ;einlesen und Ausgeben der Empfangenen daten
 einlesen:
 ;Lesebefehl an RFM12
 ldi MSB,0b10110000
 ldi lsb,0
 ;überprüfe ob empfangen des SPI beendet ist
 rcall wait
 ;übertrage empfangenes Byte nach r18
 in r18,SPDR
 out Portd,r18
 ret

allerdings wird dieser programmteil nie erreicht da Nirq(PB1) nie low wird
der Pin sollte so wie ich das verstanden habe kurzfristig low werden wenn die eingestellte Füllgrenze des Eingangspuffers erreicht wurde.
Eingestellt habe ich ihn auf ein Byte.
Also stimmt wohl irgendetwas in der Initialisierung noch nicht:hmmmm:

hat denn einer von euch schonmal mit den Dingern gearbeitet?
habe hier im Forum ein paar Beiträge dazu gefunden allerdings im Bereich Bascom und das raff ich nicht:pcguru:

Edit: Danke dino für die links habe deinen beitrag erst übersehen werde mich da mal durchwurschteln
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)