; ; hello.RGB.45.asm ; ; RGB LED PWM hello-world ; ; Neil Gershenfeld ; CBA MIT 11/4/07 ; ; (c) Massachusetts Institute of Technology 2007 ; Permission granted for experimental and personal use; ; license for commercial sale available from MIT. ; .include "tn45def.inc" ; ; definitions ; .equ red = PB3; red pin .equ green = PB4; green pin .equ blue = PB2; blue pin .equ rxpin = PB0; receive pin ; ; registers ; .def temp = R16; temporary storage .def temp1 = R17; temporary storage .def count = R17; loop counter .def pwm = R18; PWM counter ; ; code segment ; .cseg .org 0 rjmp reset ; ; getchar ; assumes no line driver (doesn't invert bits) ; getchar: ldi bitcnt,9 ; 8 data bit + 1 stop bit getchar1: sbis PINB, rxpin ; wait for start bit rjmp getchar1 rcall bitdelay ; 0.5 bit delay getchar2: rcall bitdelay ; 1 bit delay rcall bitdelay ; clc ; clear carry sbis PINB, rxpin ; if RX pin high skip sec ; otherwise set carry dec bitcnt breq getchar3 ; return if all bits read ror rxbyte ; otherwise shift bit into receive byte rjmp getchar2 ; go get next bit getchar3: ret ; ; bitdelay ; serial bit delay ; .equ b = 13 ; 9600 baud (8 MHz clock /8) bitdelay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; main program ; reset: ; ; set clock divider to /8 ; ldi temp, (1 << CLKPCE) ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0) out CLKPR, temp out CLKPR, temp1 ; ; set stack pointer to top of RAM ; ldi temp, high(RAMEND) out SPH, temp ldi temp, low(RAMEND) out SPL, temp ; ; init LED pins for output ; sbi PORTB, red sbi DDRB, red sbi PORTB, green sbi DDRB, green sbi PORTB, blue sbi DDRB, blue ; ; main loop ; main_loop: ldi count, 255 off_red_loop: mov pwm, count sbi PORTB, red off_red_loop_off: dec pwm brne off_red_loop_off mov pwm, count cbi PORTB, red off_red_loop_on: inc pwm brne off_red_loop_on dec count brne off_red_loop ldi count, 255 red_green_loop: mov pwm, count cbi PORTB, red sbi PORTB, green red_green_loop_off: dec pwm brne red_green_loop_off mov pwm, count sbi PORTB, red cbi PORTB, green red_green_loop_on: inc pwm brne red_green_loop_on dec count brne red_green_loop green_blue_loop: mov pwm, count cbi PORTB, green sbi PORTB, blue green_blue_loop_off: dec pwm brne green_blue_loop_off mov pwm, count sbi PORTB, green cbi PORTB, blue green_blue_loop_on: inc pwm brne green_blue_loop_on dec count brne green_blue_loop blue_on_loop: mov pwm, count sbi PORTB, red sbi PORTB, green blue_on_loop_off: dec pwm brne blue_on_loop_off mov pwm, count cbi PORTB, red cbi PORTB, green blue_on_loop_on: inc pwm brne blue_on_loop_on dec count brne blue_on_loop on_off_loop: mov pwm, count cbi PORTB, red cbi PORTB, green cbi PORTB, blue on_off_loop_off: dec pwm brne on_off_loop_off mov pwm, count sbi PORTB, red sbi PORTB, green sbi PORTB, blue on_off_loop_on: inc pwm brne on_off_loop_on dec count brne on_off_loop rjmp main_loop