;
|
|
; tinyblink
|
|
; Blinks an LED on pin 4 (PB2)
|
|
;
|
|
|
|
.DEVICE ATtiny10
|
|
|
|
; variables
|
|
.EQU delayMult1 = 0xff ; the delay is delay3*delaymult2*delaymult1
|
|
.EQU delayMult2 = 0xff
|
|
.EQU delayMult3 = 0x0f
|
|
|
|
.CSEG ; code section
|
|
.ORG $0000 ; the starting address
|
|
main:
|
|
; set up the stack
|
|
ldi r16, high(RAMEND)
|
|
out SPH, r16
|
|
ldi r16, low(RAMEND)
|
|
out SPL, r16
|
|
|
|
; set clock divider
|
|
ldi r16, 0x00 ; clock divided by 1
|
|
ldi r17, 0xD8 ; the key for CCP
|
|
out CCP, r17 ; Configuration Change Protection, allows protected changes
|
|
out CLKPSR, r16 ; sets the clock divider
|
|
|
|
; initialize port
|
|
ldi r16, 1<<PB2 ; sets pin 4 (PB2) to putput
|
|
out DDRB, r16 ; data direction
|
|
ldi r16, 0x00 ; sets all pins low
|
|
out PORTB, r16
|
|
|
|
; nop for sync
|
|
nop
|
|
|
|
loop:
|
|
; turn on and delay
|
|
ldi r16, (1<<PB2)
|
|
out PORTB, r16
|
|
rcall delay
|
|
|
|
; turn off and delay
|
|
ldi r16, 0x00
|
|
out PORTB, r16
|
|
rcall delay
|
|
rjmp loop
|
|
|
|
delay:
|
|
; not really needed, but keep r16-r18
|
|
push r16
|
|
push r17
|
|
push r18
|
|
|
|
ldi r16, delayMult1
|
|
ldi r17, delayMult2
|
|
ldi r18, delayMult3
|
|
|
|
; start delay loop
|
|
delayLoop:
|
|
subi r16, 1 ; subtract 1
|
|
sbci r17, 0 ; if r16 was 0, subtract 1
|
|
sbci r18, 0 ; if r17 was 0, subtract 1
|
|
brne delayLoop ; while r18 is not 0, loop
|
|
; end delay loop
|
|
|
|
pop r17
|
|
pop r16
|
|
pop r18
|
|
ret
|
|
|
|
|
|
|