??? 01/31/07 18:15 Read: times Msg Score: +1 +1 Good Answer/Helpful |
#131821 - Full code for reference if anyone's interested Responding to: ???'s previous message |
Please excuse any typos in the comments - it's been a long day.
; ; Starting with ATMEL 89C51ED2 and SPI ; ; LED on port 22 on wait 1 second ; LED on port 23 on wait one second ; LED on port 22 off wait one second ; LED on port 23 off wait one second ; Oh, the excitement! ; $NOMOD $TITLE(BYTE SPI_TEST) $DEBUG $OBJECT $NOPAGING ;Variable declarations $include(C:\asm51\89C51ED2.inc) SS EQU P2.1 ;J7-29 rec_data Data 30h T1COUNT Data 31h ;Timer 1 count trans_completed Bit 00h ALARM1 Bit 01h ;Flag for timer 1 set in timer 1 interrupt ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; Macros START_50MS_TIMER MACRO FIFTY_MS_INTERVALS ;FIFTY_MS_INTERVALS is the ;number of .05 second ;intervals to wait for clr ET1 clr alarm1 orl TMOD,#10h ;Set timer 1 to 16-bit mode MOV TH1,#0B0H MOV TL1,#03CH ;Initialize TL1 to overflow every .05 seconds SETB ET1 ;Enable timer interrupt 1 SETB EA ;Enable all interrupts MOV T1COUNT, FIFTY_MS_INTERVALS ;Set T1COUNT to 20 to wait for 1s SETB TR1 ;Turn timer 0 on ENDM ; ; End of Macros ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ org 0000H ljmp MAIN ORG 001Bh ljmp T1_INTERRUPT ;Timer 1 interrupt org 4Bh ljmp SPI_INT org 100h MAIN: orl spcon, #10h setb SS orl spcon, #82h anl spcon, #0F7h ;cpol = 0 mov a, spcon clr acc.2 mov spcon, a orl ien1, #04h orl spcon, #40h clr trans_completed setb ea ;////////////////////////////////////////////////////////////////////////////// ; ; Set up MAX6957 registers ; clr SS mov SPDAT,#04h ; config register jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#01h ; disable shutdown, global current control, trans det disabled jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS ; read 2 bytes into SPI slave nop ; min CS pulse is 19 ns so at 12 MHz one nop should do it clr SS mov SPDAT,#0Dh ; ports 20, 21, 22, 23 config register jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#0Ch ; set port 22 & 23 to LED Driver jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS ; read 2 bytes into SPI slave nop ; min CS pulse is 19 ns so at 12 MHz one nop should do it ;////////////////////////////////////////////////////////////////////////////// ; ; Main loop ; LOOP1: clr SS mov SPDAT,#36h ; port 22 jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#01h ; on jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS nop ; min CS pulse is 19 ns so at 12 MHz one nop should do it START_50MS_TIMER #20 ;Delay for 20 * .05 seconds jnb Alarm1, $ clr SS mov SPDAT,#37h ; port 22 jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#01h ; on jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS nop ; min CS pulse is 19 ns so at 12 MHz one nop should do it START_50MS_TIMER #20 ;Delay for 20 * .05 seconds jnb Alarm1, $ clr SS mov SPDAT,#36h ; port 22 jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#00h ; off jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS nop ; min CS pulse is 19 ns so at 12 MHz one nop should do it START_50MS_TIMER #20 ;Delay for 20 * .05 seconds jnb Alarm1, $ clr SS mov SPDAT,#37h ; port 23 jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ mov SPDAT,#00h ; off jnb trans_completed,$ ; /* wait end of transmission */ clr trans_completed ; /* clear software transfer flag */ setb SS START_50MS_TIMER #20 ;Delay for 20 * .05 seconds jnb Alarm1, $ jmp loop1 ; endless loop ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ; Timer1 interrupt. Timer 1 used for multiples of .05 seconds. T1_INTERRUPT: MOV TH1,#03CH MOV TL1,#0B0H DJNZ T1COUNT,T1_EXIT ;If we haven't reached 0 then jump out of int routine SETB ALARM1 CLR ET1 ;stop timer CLR TR1 T1_EXIT: RETI ; ; End of Timer1 interrupt ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ; SPI interrupt. SPI_INT: ; /* interrupt address is 0x004B */ mov R7,SPSTA mov ACC,R7 jnb ACC.7,BREAK1 ;case 0x80: mov rec_data,SPDAT ; /* read receive data */ setb trans_completed ; /* set software flag */ BREAK1: jnb ACC.4,BREAK2 ;case 0x10: cpl p2.0 ;J7-31 ; Debugging ; /* put here for mode fault tasking */ BREAK2: jnb ACC.6,BREAK3 ;case 0x40: cpl p2.0 ;J7-31 ; Debugging ; /* put here for overrun tasking */ BREAK3: RETI ; ; End of SPI interrupt ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ END |