Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include "tn85def.inc" ;usi2l: This version is cut down and works at 9600 baud
- again:
- ldi r16, low(RAMEND)
- out SPL, r16
- ldi r16,high(RAMEND)
- out SPH, r16
- top:
- ldi r16,$ff
- out DDRB,r16
- out PORTB,r16
- ldi r19,(1<<USIWM0)|(0<<USICS0) ;need this otherwise msb not initially joined to D0
- out USICR,r19
- rjmp test_usiRxT
- ;----------------------------------------
- reverseBits: ;r16 gets reversed
- push r17
- push r18
- ldi r18,8
- ldi r17,0
- uprb:
- lsl r16
- ror r17
- dec r18
- brne uprb
- mov r16,r17
- pop r18
- pop r17
- ret
- ;-----------------------
- split62: ;split r16 into two bytes, r16 and r17 where r16 contains first 6 bits preceded by
- ldi r17,$ff
- clc
- ror r16
- ror r17
- sec
- ror r16
- ror r17
- ret
- rjmp split62
- ;-------------------------
- waitForPin0Low:
- sbic PINB,0
- rjmp waitForPin0Low
- ret ;when pin PB1 goes low
- ;------------------------
- waitForPin0High:
- sbis PINB,0
- rjmp waitForPin0High
- ret ;when pin PB1 goes high
- ;-------------------------------------
- startTim0:
- LDI r16,0b0000_0010 ; 3=/64 4 = /256 SET TIMER PRESCALER TO /1024, 03 is /64
- OUT TCCR0B,r16
- ret ;with timer now started
- ;-----------------------------------------------
- stopTim0:
- LDI r16,0b0000_0000 ;Stop TIMER
- OUT TCCR0B,r16
- ret ;with timer now stopped
- ;-----------------------------------------------
- USITransfer_Fast3: ;USES TIMER0:
- out USIDR,r16
- ldi r19,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
- ldi r18,8
- LDI r16,0b0000_0010 ; 2=/8 3=/64 4 = /256 5= /1024 2=/8 SET TIMER PRESCALER TO /1024,
- OUT TCCR0B,r16 ;start tim0
- upt23:
- rcall clrTCNT0
- rcall waitTilTim0Fin
- out USICR,r19
- dec r18
- brne upt23
- ret
- ;---------------------------------------
- clrTCNT0:
- clr r16
- out TCNT0,r16
- ret
- ;---------------------***--
- waitTilTim0Fin: ;wait til timer 0 counts up to top value
- in r16,TCNT0
- cpi r16,104 ;Now try 104 /8 9600? Yes, worked.
- brne waitTilTim0Fin
- ret
- ;-----------------------
- waitHalfBit: ;wait til timer 0 counts to half above
- rcall clrTCNT0 ;this took 2 days to insert.
- rcall startTim0
- whb:
- in r16,TCNT0
- cpi r16,104/2
- brne whb
- rcall stopTim0
- ret ;used during start bit rx
- ;-----------------------------------------------------
- usiTxT: ;uses timer0. Byte to be sent is in r16
- ldi r17,$ff ;make r1 an output as this stage. Can interfere with Rx
- out DDRB,r17
- rcall reverseBits ;needed
- rcall split62 ;now have (10 + 6lsbs) + (2 msbs + 6Stops) in r116,r17
- rcall USITransfer_Fast3 ;there's the r16 gone
- mov r16,r17
- rcall USITransfer_Fast3 ;and the r17.
- LDI r16,0b0000_0000 ;stop timer,
- OUT TCCR0B,r16
- ret ;with r16 having been sent via USI Tx
- ;--------------------------------------
- usiRxT: ;input a byte serially via PB0 using usi
- ldi r16,$fc
- out DDRB,r16 ;make both Tx,Rx inputs to stop interference
- rcall waitForPin0High
- rcall waitForPin0Low ;2
- rcall waitHalfBit
- ldi r16,$ff
- out PORTB,r16 ;fill usi data reg with 1's so no start bits come out while shifting
- rcall USITransfer_Fast3 ;do 8 shifts into usidr from PB0. Emerge with byte in usidr
- in r16,USIDR
- rcall reverseBits ;needed
- rcall usiTxT ;display byte.
- ret
- ;------------------------
- test_usiRxT: ;worked
- rcall usiRxT
- rjmp test_usiRxT
Advertisement
Add Comment
Please, Sign In to add comment