;
; hello5.pwm.asm
; Neil Gershenfeld MIT CBA 7/29/05
; PWM test program
; 

.include "tn13def.inc"
.def temp = R16	; temporary storage
.def temp1 = R17 ; temporary storage
.def pwm = R18 ; PWM value
.def delaycount = R19 ; sample update delay counter

.cseg
.org 0
rjmp reset

;
; delay
;
delay:
   mov temp, delaycount
   delay_loop:
      dec temp
      brne delay_loop
   ret
;
; main program
;
reset:	   
   ;
   ; initialization
   ;
   ldi temp, low(RAMEND)
   out SPL, temp ; set stack pointer to top of RAM
   ldi temp, (1<<CLKPCE)
   ldi temp1, ((0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0))
   out CLKPR, temp ; write CLKPCE to change clock prescaler
   out CLKPR, temp1 ; set clock to 9.6MHz/1
   ldi temp, ((1 << COM0B0) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00))
   out TCCR0A, temp ; set OC0B on compare match and set fast PWM mode, 0xFF TOP
   ldi temp, (1 << CS00)
   out TCCR0B, temp ; set timer 0 prescalar to 1
   sbi DDRB, PB1 ; enable OC0B output pin
   ldi pwm, 128
   ldi delaycount, 255
   ;
   ; infinite main loop
   ;
   up:
      out OCR0B, pwm
      rcall delay
      inc pwm
      cpi pwm, 255
	 brne up
   ldi pwm, 128
   dec delaycount
   cpi delaycount, 1
      brne up
   ldi delaycount, 255
   rjmp up
