Page 3 of 3

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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 :D

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 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

PostPosted: 09 May 2013, 23:01
by deluca
Ottima domanda js-bascom,

ci spetta saperlo...... gio919kun. :D

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 10 May 2013, 14:37
by gio919kun
Con il mio codice assembly

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 10 May 2013, 15:47
by legacy
Ottimo, ce lo posti completo, ora che funziona ?

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 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

PostPosted: 10 May 2013, 22:03
by js-bascom
Bravissimo, viva l'assembly.

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

PostPosted: 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

PostPosted: 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

PostPosted: 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 :)