Also wie versprocvhen einmal ein testbericht des heutigen nachmittags.
Di programme sehen wie folgt aus:
Sender
CodeBox Assembler
.include "tn85def.inc"
.org 0x0000
rjmp reset
;ANSCHLÜSSE UND REGISTER
.def temp1=r16
.def temp2=r17
.def temp3=r18
.def counter = r19
.def lsb = r23
.def msb = r24
.equ SS = PB3
.equ NIRQ = PB4
.equ SDO = PB0
.equ SDI = PB1
.equ SCK = PB2
.equ rfmpin = pinb
.equ rfmport= portb
.equ rfmddr = ddrb
.equ XTAL = 1000000
.org 0x0010
reset:
ldi temp1, low(ramend)
out spl, temp1
ldi temp1, high(ramend)
out sph, temp1
ldi temp1, (1<<SDI)|(1<<SS)|(1<<SCK)
out rfmddr, temp1
sbi rfmport, SS ;Nsel auf high
rcall delay100ms
main:
rcall RFMinittrans
loop:
ldi lsb, 0xC7
rcall sendbyte
rcall delay100ms
rjmp loop
.include "AVRRFM12B_USIV3.asm"
.include "stddelay.inc"
Empfänger:
CodeBox Assembler
.include "tn44def.inc"
.org 0x0000
rjmp reset
;ANSCHLÜSSE UND REGISTER
.def temp1=r16
.def temp2=r17
.def temp3=r18
.def counter = r19
.def lsb = r23
.def msb = r24
.equ SS = Pa3
.equ NIRQ = PB2
.equ SDO = Pa6
.equ SDI = Pa5
.equ SCK = Pa4
.equ LED = PB1
.equ rfmpin = pina
.equ rfmport= porta
.equ rfmddr = ddra
.equ XTAL = 1000000
.org 0x0020
reset:
ldi temp1, low(ramend)
out spl, temp1
ldi temp1, high(ramend)
out sph, temp1
ldi temp1, (1<<SDI)|(1<<SS)|(1<<SCK)
out rfmddr, temp1
sbi rfmport, SS ;Nsel auf high
rcall delay100ms
main:
rcall rfminitrec
rcall delay1ms
rcall Fifo_reset
loop:
sbic rfmpin,nirq ;wenn nirq low
rjmp loop
******!********"******!********"******!********"******!********"******!********"******!********"******!********"******!********"
;Daten vorhanden
rcall readFIFO
rcall Fifo_reset
cpi lsb, 0xC7
breq ja
rjmp loop
ja:
sbi ddrb, LED
sbi portb, LED
rcall delay100ms
cbi portb, LED
rcall readstatus
ret
.include "AVRRFM12B_USIV3.asm"
und die routine
CodeBox Assembler
;*******************************ACHTUNG*********ACHTUNG!!!!!!!**********
;Die routine SPI4RFM12 verändert das msb und lsb
;Beim senden von mehreren Datenbytes muss das MSB stehts neu geladen werden!
;
;
RFMinitrec: ;INIT FÜR EMPFÄNGER
ldi msb, 0x80
ldi lsb, 0xE7
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x82
ldi lsb, 0x99
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xA7
ldi lsb ,0x08
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC6
ldi lsb, 0x47
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x94
ldi lsb, 0xA0
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC2
ldi lsb, 0xAD
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCA
ldi lsb, 0x81
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCA
ldi lsb ,0x83
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCE
ldi lsb, 0xD4
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC4
ldi lsb, 0x83
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x98
ldi lsb ,0x50
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCC
ldi lsb, 0x17
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xE0
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC8
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC0
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ret
RFMinittrans: ;INIT FÜR SENDER
ldi msb, 0x80
ldi lsb, 0xE7
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x82
ldi lsb, 0xDA
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xA7
ldi lsb ,0x08
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC6
ldi lsb, 0x47
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x90
ldi lsb, 0xC0
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC2
ldi lsb, 0xAD
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCA
ldi lsb, 0x81
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCA
ldi lsb ,0x83
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCE
ldi lsb, 0xD4
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC4
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x98
ldi lsb ,0x50
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xCc
ldi lsb, 0x17
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xE0
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC8
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC0
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ret
;***************************************RESET FIFO******************************
Fifo_reset:
ldi msb, 0xca
ldi lsb, 0x81
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xca
ldi lsb, 0x83
rcall delay1ms
rcall SPI4RFM12
ret
RXEN:
ldi msb, 0x82
ldi lsb, 0x99
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x94
ldi lsb, 0xA0
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC4
ldi lsb, 0x83
rcall delay1ms
rcall SPI4RFM12
ret
TXEN:
ldi msb, 0x82
ldi lsb, 0xDA
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0x90
ldi lsb, 0xC0
rcall delay1ms
rcall SPI4RFM12
ldi msb, 0xC4
ldi lsb, 0x00
rcall delay1ms
rcall SPI4RFM12
ret
;*******************************readFIFO*******************************
;Daten sollten anschließend in lsb stehen
;Daten sind im FIFO vorhanden wen der Status 0x8000 entspricht also das bit 15 gesetzt ist
readFIFO:
;ldi counter, 100
schleife: ;sind daten vorhanden?
;dec counter
;breq nix ;100 mal keine Daten?? dann wieder ins Hauptprogramm
;rcall readstatus
;sbrs msb, 7 ;wenn daten vorhanden weiter machen
;rjmp schleife
ldi msb, 0xB0 ;Befehl für das lesen des FIFOS
ldi lsb, 0x00
rcall SPI4RFM12 ;datenbyte in lsb
ret
nix:
ret
;***************************************readstatus************************
;Status muss in msb/lsb stehen
readstatus: ;Muss ebenfalls funktionieren
ldi msb, 0x00
ldi lsb, 0x00
rcall SPI4RFM12
ret
;************************************sendbyte********************************
;SENDET BYTE AUS LSB
;Verändert:Counter, LSB, MSB
sendbyte:
push lsb
ldi msb, 0xB0 ;Msb mit sendebefehl füllen
ldi counter, 3
bla: ;3 mal preambel senden 0xAA
ldi msb, 0xB0 ;Msb mit sendebefehl füllen
ldi lsb, 0xAA
rcall SPI4RFM12
rcall delay1ms
dec counter
brne bla
ldi msb, 0xB0 ;Msb mit sendebefehl füllen
ldi lsb, 0x2D ;Synclow
rcall SPI4RFM12
rcall delay1ms
ldi msb, 0xB0 ;Msb mit sendebefehl füllen
ldi lsb, 0xD4 ;Synchigh
rcall SPI4RFM12
rcall delay1ms
ldi msb, 0xB0 ;Msb mit sendebefehl füllen
pop lsb
rcall SPI4RFM12 ;Datenbyte
ret ;BYTE müsste übertragen sein
;****************************UNTERROUTINEN*********************************
SPI4RFM12: ;Getestet mit logic. Funktioniert
cbi rfmport, SS ;Sendet msb+lsb.Antwort in msb/lsb
wait: ;warten AUF SDO=LOW
sbic rfmpin, sdo
rjmp wait
mov temp1, msb ;MSB
rcall SPITransfer
mov msb, temp1
mov temp1, lsb ;LSB
rcall SPITransfer
mov lsb, temp1
nop nop nop
sbi rfmport, SS
ret
SPITransfer:
out USIDR,temp1
ldi r16,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)
ldi r17,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
out USICR,r16 ; MSB
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16 ; LSB
out USICR,r17
in temp1,USIDR
ret
.include "stddelay.inc"
Der logikanalyzer zeigt das der sender mit den werten aus der routine inittialisiert wird. Danach folgt einen pause und er erhält jeweils 3mal preambel synchword Datenbyte. Einen Antwort des Moduls erhalte ich hierbei nicht( ist denke ich auch so angedacht vom hersteller)
Das Empfänger Modul wird initialisiert mit RFMinitrec danach folgt reset FIFO ich erhalte den Inhalt des Statusregisters als 0x4000 beim ersten auslesen danach 0x0000
Danach wartet das Programm bis Nirq low wird (was meines erachtens signalisiert das Daten im FIFO bereit stehen). Das Problem ist das Nirq immer low ist, aber das Programm trotzdem nicht über den Punkt welche oben mit "******!********" im Code markiert ist hinaus kommt. Es wird also nie in die routine readFIFO gesprungen, obwohl nirq immer low ist.
PS: Abstand der Module ca 20 cm. Auch eine näherung bringt nichts! Ich hoffe das ich nicht wieder vor dem problem sitze, obwohl es klar erkenntlich ist.