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.
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)
Programm des Empfängers (ATmega8/4MHz)
Edit: Die LED´s sind die vom nanoboard und sitzen beim mega 8 an PortD
Und die SPIsignale werden von den controllern korrekt ausgegeben
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.
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
Edit: Die LED´s sind die vom nanoboard und sitzen beim mega 8 an PortD
Und die SPIsignale werden von den controllern korrekt ausgegeben