Page 3 of 3
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
03 May 2013, 10:04
by js-bascom
Non saprei se sta funzionado bene o no. Sembra che il board e' trasmettitore, quindi penso che doversti aver un'altro board che funzioni come ricevitore e quind vedere se l'informazione e' ricevuta bene.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
03 May 2013, 10:16
by deluca
Confermo quanto detto da js-bascom,
non è detto che stia funzionando tutto e bene, possiamo cmq affermare che l'interfaccia seriale sta funzionando.
per testare il circuito completo devi montarne un altro per la ricezione, solo così potrai essere certo del buon funzionamento.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
03 May 2013, 21:40
by gio919kun
Ok grazie, appena avrò novità mi farò risentire
buon week end
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
03 May 2013, 22:28
by js-bascom
Senza dubbio il nuovo deluca avatar e' molto piu' simpatico del robot.......
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
04 May 2013, 13:24
by deluca
@js, grazie per il simpatico........ all'avatar si intende.
si però il robot si muoveva e salutava,
ma ad un certo punto mi ha chiesto di essere sostituito perchè a furia di salutare ha usurato gli harmonic-drive del braccio...
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
06 May 2013, 22:04
by gio919kun
Ciao ragazzi, finalmente ho delle novità positive sono riuscito a leggere i registri dei moduli come volevo. Il problema stava nella routine di SPI in pratica io leggevo mentre scrivevo invece dovevo prima scrivere e poi leggere, quindi ho creato una subroutine a parte per la lettura.
- Code: Select all
SPI_MasterRecive:
sbis SPSR, SPIF
rjmp SPI_MasterRecive
in status, SPDR
ret
Ora stò cercando di trasmettere qualcosa dal TX all'RX. Vi aggiornerò grazie a tutti per l'aiuto
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
09 May 2013, 17:39
by gio919kun
Salve, porto ottime notizie, finalmente funziona tutto, trasmissione ricezione interrupt e tutto il resto. Mille grazie per il vostro aiuto e la vostra cordialità, consiglierò a tutti questo forum.
Saluti
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
09 May 2013, 22:05
by js-bascom
Sta lavorando con il tuo codice in assembly o solo con il BASCOM?
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
09 May 2013, 23:01
by deluca
Ottima domanda js-bascom,
ci spetta saperlo...... gio919kun.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
10 May 2013, 14:37
by gio919kun
Con il mio codice assembly
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
10 May 2013, 15:47
by legacy
Ottimo, ce lo posti completo, ora che funziona ?
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
10 May 2013, 21:39
by gio919kun
Si certo anche se sono un po confusionari comunque se hai problemi a capire il codice mi puoi contattare.
Questo è il TX:
- Code: Select all
;*************************************************
;* written by: Abbruzzo Giovanni
;* date: 1/05/2013
;* version: 1.0
;* file saved as: ProvaNRF24L01.asm
;* for AVR: m8535
;* clock frequency: 8MHz
;* items: setup SPI and using NRF24L01+ device
;* Legend:
;* PB1=CE (to nRF24L01 side)
;*
;* PB3=CSN
;* PB4=SS
;* PB5=MOSI
;* PB6=MISO
;* PB7=SCK
;*
;* PD3=INT1 (IRQ to nRF24L01 side)
;*
;* W_REGISTER=001AAAAA
;* R_REGISTER=000AAAAA
;*
;*
;*************************************************
.nolist
.include "m8535def.inc"
.include "E:\AVRFiles\Library\nrf24l01registers.inc"
.list
.def temp=r16
.def data=r17
.def counter=r18
.def counter2=r19
.def regcounter=r20
.def target=r21
.def status=r22
;Look-up-table
rjmp Init; Reset Handler
reti ; IRQ0 Handler (PD2)
rjmp IRQ1 ; IRQ1 Handler (PD3)
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 Compare A Handler
reti ; Timer1 Compare B Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
reti ; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handle
reti ; IRQ2 Handler (PB2)
reti ; Timer0 Compare Handler
reti ; Store Program Memory Ready Handler
One_sec:
in temp, TCNT0 ;read T/C0
cp temp, target ;is temp = target?
breq PC + 2 ;yes, so skip 2 steps
rjmp One_sec ;no, so loops back to One_sec
ldi temp, 63
add target, temp ;add n1 to target
inc regcounter ;increment regcounter
cpi regcounter, 62 ;is regcounter = n2?
breq PC+2 ;yes, so skip 2 steps
rjmp One_sec ;no, so loops back to One_sec
clr regcounter ;restart to count with 0
ret
;Wait 28 mS about
Wait:
dec counter
breq PC+2
rjmp Wait
ldi counter, 240
dec counter2
breq PC+2
rjmp Wait
ldi counter2,240
ret
;Start transmission throuth SPI
Start_Transmission:
sbi PORTB, 1 ;Alza CE per iniziare la trasmissione
rcall Wait
rcall Wait
cbi PORTB, 1 ;Abbassa CE
SPI_MasterRecive:
sbis SPSR, SPIF
rjmp SPI_MasterRecive
in status, SPDR
ret
SPI_MasterTransmit:
; Start transmission of data (r17)
out SPDR,data
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
Init: ldi temp, LOW(RAMEND) ;Initialize Stack Pointer
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Initialize Ports
clr temp
out DDRD, temp ;Set PORTD as input
ser temp
out PORTD, temp ;Pull ups on PortD off
out DDRC, temp ;Set PORTC as output
out PORTC, temp ;Start with lights off
;Variables
ldi counter, 240
ldi counter2, 240
;Timer counter
ldi temp, 0b00000101
out TCCR0, temp ;T/C0 counts at CK/1024
clr temp
out TCNT0, temp ;init T/C0 to zero
ldi target, 63
clr regcounter ;start to count with 0
;SPI_MasterInit
;Set MOSI, SCK,CE,CSN SS output , all others input
ldi temp,(1<<DDB7)|(1<<DDB5)|(1<<DDB4)|(1<<DDB1)|(1<<DDB3)
out DDRB,temp
;Enable SPI, Master, set clock rate fck/8
ldi temp, (1<<SPI2X)
out SPSR, temp ;Double speed
ldi temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<SPR1)|(0<<DORD)|(0<<CPHA)|(0<<CPOL)
out SPCR,temp
ldi temp, (1<<PB3);Start CSN high
out PORTB, temp
;Eneble interupts
ldi temp, (0<<ISC11)|(0<<ISC10)
out MCUCR, temp ;INT1 generates an interrupt request on low level
ldi temp, (1<<INT1)
out GICR, temp ;Enables ext INT1 interrupts
sei
Init_NRF24L01:
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Accedo al W_REGISTER al quale gli passo l'indirizzo di CONFIG register
subi data, -REG_CONFIG
rcall SPI_MasterTransmit
ldi data, 0b01001110 ;PWR_UP and TXmode (in CONFIG register) set TX_DS and MAX_DS interrupt active low and CRC0 (2 bytes)
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER;Accedo al W_REGISTER al quale gli passo l'indirizzo di EN_AA register
subi data,-REG_EN_AA
rcall SPI_MasterTransmit
ldi data, 0b00000001 ;Abilito ENAA_P0
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Abilta l'indirizzo addr0 in ricezione
subi data,-REG_EN_RXADDR
rcall SPI_MasterTransmit
ldi data, 0b00000001
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER
subi data, -REG_RF_CH
rcall SPI_MasterTransmit
ldi data, 0b00101000 ;Set 2,44 GHz frequency
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER
subi data, -REG_RF_SETUP
rcall SPI_MasterTransmit
ldi data, 0b00001110 ;Set air data rate 2Mbps, set output power 0dBm
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Addressing TX5
subi data, -REG_TX_ADDR
rcall SPI_MasterTransmit
ldi data,0x34 ;Sending address 0xB3B4B5B605
rcall SPI_MasterTransmit
ldi data,0x43
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x01
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Addressing RX0
subi data, -REG_RX_ADDR_P0
rcall SPI_MasterTransmit
ldi data,0x34 ;Sending address 0xB3B4B5B605
rcall SPI_MasterTransmit
ldi data,0x43
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x01
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
Start:
ldi temp, 0b11111110
out PORTC, temp
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3
out PORTC, status
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_TX_PAYLOAD
rcall SPI_MasterTransmit
ldi data, 0b01010101
rcall SPI_MasterTransmit
sbi PORTB, 1 ;Alza CE per iniziare la trasmissione
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
ldi temp, 0b11011111
out PORTC, temp
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3
out PORTC, status
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
sbic PINC, 0
rcall Flush_TXFIFO
nop
rjmp Start
Flush_TXFIFO:
ldi temp, 0b01111111
out PORTC, temp
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, FLUSH_TX
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
;Leggi STATUS
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3
out PORTC, status
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
ret
Flush_Max_Rt:
ldi temp, 0b10111111
out PORTC, temp
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Abilta l'indirizzo addr0 in ricezione
subi data,-REG_STATUS
rcall SPI_MasterTransmit
ldi data, 0b00010000 ;Reset MAX_RT
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
;Leggi STATUS
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3
out PORTC, status
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
ret
IRQ1:
ldi temp, 0b10111111
out PORTC, temp
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
;Leggi STATUS
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3 ;Alza CSN per abilitare la comunicazione SPI
out PORTC, status
sbic PINC, 4
rcall Flush_Max_Rt
;Leggi STATUS
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ser data ;NOP write nop for receiving status register
rcall SPI_MasterTransmit
rcall SPI_MasterRecive
sbi PORTB, 3 ;Alza CSN per abilitare la comunicazione SPI
out PORTC, status
sbic PINC, 5
rjmp End
reti
End:
ldi temp, 0b11101111
rjmp End
e questo il RX:
- Code: Select all
;*************************************************
;* written by: Abbruzzo Giovanni
;* date: 2/05/2013
;* version: 1.0
;* file saved as: Project2dot6ricevitore.asm
;* for AVR: m8515
;* clock frequency: 8MHz
;* items: setup SPI and using NRF24L01+ device
;* Legend:
;* PB1=CE (to nRF24L01 side)
;*
;* PB3=CSN (to nRF24L01 side)
;* PB4=SS (non utilizzato)
;* PB5=MOSI
;* PB6=MISO
;* PB7=SCK
;* PD3=INT1 (to nRF24L01 side)
;*
;* W_REGISTER=001AAAAA
;* R_REGISTER=000AAAAA
;*
;*
;*************************************************
.nolist
.include "m8515def.inc"
.include "E:\AVRFiles\Library\nrf24l01registers.inc"
.list
.def temp=r16
.def data=r17
.def counter=r18
.def counter2=r19
.def regcounter=r20
.def target=r21
.def status=r22
;Look-up-table
rjmp Init; Reset Handler
reti ; IRQ0 Handler (PD2)
rjmp Start; IRQ1 Handler (PD3)
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 Compare A Handler
reti ; Timer1 Compare B Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
reti ; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handle
reti ; IRQ2 Handler
reti ; Timer0 Compare Handler
reti ; Store Program Memory Ready Handler
;Wait 30 mS about
Wait:
dec counter
breq PC+2
rjmp Wait
ldi counter, 240
dec counter2
breq PC+2
rjmp Wait
ldi counter2,240
ret
One_sec:
in temp, TCNT0 ;read T/C0
cp temp, target ;is temp = target?
breq PC + 2 ;yes, so skip 2 steps
rjmp One_sec ;no, so loops back to One_sec
ldi temp, 63
add target, temp ;add n1 to target
inc regcounter ;increment regcounter
cpi regcounter, 62 ;is regcounter = n2?
breq PC+2 ;yes, so skip 2 steps
rjmp One_sec ;no, so loops back to One_sec
clr regcounter ;restart to count with 0
ret
;Start transmission throuth SPI
SPI_MasterRecive:
sbis SPSR, SPIF
rjmp SPI_MasterRecive
in status, SPDR
ret
SPI_MasterTransmit:
; Start transmission of data (r17)
out SPDR,data
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
Init: ldi temp, LOW(RAMEND) ;Initialize Stack Pointer
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Initialize Ports
ser temp
out DDRC, temp ;Set PORTC as output
out PORTC, temp ;Start with LEDs off
;Variables
ldi counter, 240
ldi counter2, 240
;SPI_MasterInit
;Set MOSI, SCK,CE,CSN SS output , all others input
ldi temp,(1<<DDB7)|(1<<DDB5)|(1<<DDB4)|(1<<DDB1)|(1<<DDB3)
out DDRB,temp
;Enable SPI, Master, set clock rate fck/8
ldi temp, (1<<SPI2X)
out SPSR, temp ;Double speed
ldi temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0) ;
out SPCR,temp
ldi temp, (1<<PB3);Start CSN high
out PORTB, temp
;Timer counter
ldi temp, 0b00000101
out TCCR0, temp ;T/C0 counts at CK/1024
clr temp
out TCNT0, temp ;init T/C0 to zero
ldi target, 63
clr regcounter ;start to count with 0
;Eneble interupts
ldi temp, (0<<ISC11)|(0<<ISC10)
out MCUCR, temp ;INT1 generates an interrupt request on low level
ldi temp, (1<<INT1)
out GICR, temp ;Enables extINT1 interrupt
Init_NRF24L01:
;Remember CSN start high
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Accedo al W_REGISTER al quale gli passo l'indirizzo di CONFIG register
subi data, -REG_CONFIG
rcall SPI_MasterTransmit
ldi data, 0b00111111 ;PWR_UP and RXmode (in CONFIG register) set RX_DS interrupt active low and CRC0 (2 bytes)
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER;Accedo al W_REGISTER al quale gli passo l'indirizzo di EN_AA register
subi data,-REG_EN_AA
rcall SPI_MasterTransmit
ldi data, 0b00000001 ;Abilito ENAA_P0
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Abilta l'indirizzo addr0 in ricezione
subi data,-REG_EN_RXADDR
rcall SPI_MasterTransmit
ldi data, 0b00000001
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER
subi data, -REG_RF_CH
rcall SPI_MasterTransmit
ldi data, 0b00101000 ;Set 2,44 GHz frequency
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER
subi data, -REG_RF_SETUP
rcall SPI_MasterTransmit
ldi data, 0b00001110 ;Set air data rate 2Mbps, set output power 0dBm and eneble LNA
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Addressing RX0
subi data, -REG_RX_ADDR_P0
rcall SPI_MasterTransmit
ldi data,0x34 ;Sending address 0xB3B4B5B605
rcall SPI_MasterTransmit
ldi data,0x43
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x10
rcall SPI_MasterTransmit
ldi data,0x01
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER ;Addressing RX0
subi data, -REG_RX_PW_P0
rcall SPI_MasterTransmit
ldi data, 0b00000001 ;1 byte
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
Loop:
cbi PORTC, 0
sei
sbi PORTB, 1 ;Alza CE per iniziare la ricezione
nop
nop
nop
nop
rjmp Loop
Start:
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_CONFIG ;Leggi config
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondo
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_EN_AA ;Leggi en_aa
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per ricevere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondo
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_EN_RXADDR ;Leggi rx_addr
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondo
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_RF_CH;Leggi rf_ch
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondo
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_RF_SETUP ;Leggi rf_setup
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondo
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_REGISTER
subi data, -REG_RX_PW_P0 ;Leggi config
rcall SPI_MasterTransmit
ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
rcall One_sec
rcall One_sec ;Aspetta 3 secondi
rcall One_sec
rcall One_sec
rcall One_sec
rcall One_sec
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, R_RX_PAYLOAD
rcall SPI_MasterTransmit
ser data ;Questo byte serve solo per riceveere payload
rcall SPI_MasterTransmit
rcall SPI_MasterRecive ;Ricevi status
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
out PORTC, status
cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
ldi data, W_REGISTER
subi data,-REG_STATUS
rcall SPI_MasterTransmit
ldi data, 0b01000000 ;Reset RX_DR
rcall SPI_MasterTransmit
sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
Loop1:
nop
nop
rjmp Loop1
e questa è la libreria da importare:
- Code: Select all
/* Memory Map */
.equ REG_CONFIG = 0x00
.equ REG_EN_AA = 0x01
.equ REG_EN_RXADDR = 0x02
.equ REG_SETUP_AW = 0x03
.equ REG_SETUP_RETR =0x04
.equ REG_RF_CH =0x05
.equ REG_RF_SETUP =0x06
.equ REG_STATUS =0x07
.equ REG_OBSERVE_TX = 0x08
.equ REG_CD =0x09
.equ REG_RX_ADDR_P0= 0x0A
.equ REG_RX_ADDR_P1= 0x0B
.equ REG_RX_ADDR_P2 = 0x0C
.equ REG_RX_ADDR_P3 = 0x0D
.equ REG_RX_ADDR_P4 = 0x0E
.equ REG_RX_ADDR_P5 = 0x0F
.equ REG_TX_ADDR = 0x10
.equ REG_RX_PW_P0 = 0x11
.equ REG_RX_PW_P1 = 0x12
.equ REG_RX_PW_P2 = 0x13
.equ REG_RX_PW_P3 = 0x14
.equ REG_RX_PW_P4 = 0x15
.equ REG_RX_PW_P5 = 0x16
.equ REG_FIFO_STATUS =0x17
.equ REG_FEATURE =0x1D
.equ REG_DYNPD= 0x1C
/* Bit Mnemonics */
.equ REG_MASK_RX_DR= 6
.equ REG_MASK_TX_DS = 5
.equ REG_MASK_MAX_RT =4
.equ REG_EN_CRC =3
.equ REG_CRCO =2
.equ REG_PWR_UP = 1
.equ REG_PRIM_RX = 0
.equ REG_ENAA_P5 = 5
.equ REG_ENAA_P4 = 4
.equ REG_ENAA_P3 = 3
.equ REG_ENAA_P2 = 2
.equ REG_ENAA_P1 = 1
.equ REG_ENAA_P0 = 0
.equ REG_ERX_P5 = 5
.equ REG_ERX_P4 = 4
.equ REG_ERX_P3 = 3
.equ REG_ERX_P2 = 2
.equ REG_ERX_P1 = 1
.equ REG_ERX_P0 = 0
.equ REG_AW = 0
.equ REG_ARD = 4
.equ REG_ARC = 0
.equ REG_PLL_LOCK = 4
.equ REG_RF_DR = 3
.equ REG_RF_PWR = 1
.equ REG_LNA_HCURR = 0
.equ REG_RX_DR = 6
.equ REG_TX_DS =5
.equ REG_MAX_RT =4
.equ REG_RX_P_NO =1
.equ REG_TX_FULL =0
.equ REG_PLOS_CNT =4
.equ REG_ARC_CNT =0
.equ REG_TX_REUSE =6
.equ REG_FIFO_FULL =5
.equ REG_TX_EMPTY =4
.equ REG_RX_FULL =1
.equ REG_RX_EMPTY =0
.equ REG_RPD =0x09
.equ REG_RF_DR_LOW =5
.equ REG_RF_DR_HIGH =3
.equ REG_RF_PWR_LOW =1
.equ REG_RF_PWR_HIGH =2
/* Instruction Mnemonics */
.equ R_REGISTER =0x00
.equ W_REGISTER =0x20
.equ REGISTER_MASK =0x1F
.equ R_RX_PAYLOAD =0x61
.equ W_TX_PAYLOAD =0xA0
.equ FLUSH_TX =0xE1
.equ FLUSH_RX =0xE2
.equ REUSE_TX_PL =0xE3
.equ FAI_NIENTE =0xFF
.equ ACTIVATE =0xA0
.equ DATADATA =0x73
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
10 May 2013, 22:03
by js-bascom
Bravissimo, viva l'assembly.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
11 May 2013, 00:03
by legacy
E, w l'asm ... mi ricorda tanto le parti in asm della mia scheda MIPS32, e le dovevo per forza scrivere in asm, anche se scrivere in asm su un core super scalare con pipeline hazards non e' per niente bello. Stavo scrivendo un layer del BSP e certe cose (per es, leggere/scrivere un registro CPU, TLB o COP, manipolare lo stack, invalidare la cache) in C non le puoi fare o le puoi fare ma non in modo altrettanto efficiente, oltre al fatto che molti compilatori C non si sa mai come traducono qualcosa, servono un sacco di pragma o comunque di paletti e relative verifiche, ed io non volevo farmi male. Morale ho scritto si e no 200 di rige in asm per tagliare la testa al toro, pero' a lavoro finito mi e' venuto il malditesta.
Trovo piacevole solo l'asm di macchine CISC anni '80, tra cui Z80 o 6800 e derivati.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
11 May 2013, 07:37
by deluca
@gio919,
un bel lavoretto, complimenti !! specialmente per un ragazzo alle prime armi... ma di sicuro talentuoso.
Leggere righe di programma scritte in asm da altri, per me è un vero piacere.
Sappiamo che si studia solo a livello educazionale e che purtroppo non è più la tendenza attuale, causa i compilatori che ti fanno risparmiare in time-to-market,
ma ripensare e rispolverare i miei progetti realizzati in assembly con lo Z80 prima, con l'8051 e L'ST6 dopo mi fa venire una certa nostalgia.
In bocca al lupo.
Re: Delucidazioni su SPI (codice assembly) MCU ATMEL
Posted:
11 May 2013, 09:58
by gio919kun
Grazie grazie, ma questa è solo una piccola parte del progetto, ora va implementato con tutto il resto. Viva l'assembly, saluti e crepi il lupo