; Sky Coyote 6/26/08 ; atm32 test program ; use buttons to set timer0 pwm duty cycle .include "m32def.inc" ;------------------------------------------------------------------------------------ ; interrupt service vectors .cseg .org 0 ; reset rjmp resethandler ;----------------------------------------------------------------------------------- ; reset handler .def temp = r16 ; working .def oldButtons = r17 ; persistent .def leds = r18 ; persistent .def oldLeds = r19 ; persistent resethandler: in temp, mcucsr ; disable the JTAG ori temp, 0b10000000 out mcucsr, temp out mcucsr, temp ldi temp, low(ramend) ; set stackptr to ram end out spl, temp ldi temp, high(ramend) out sph, temp ldi temp, 0b01100011 ; timer0 as non-inverting pwm at clock/64 ; 3686400/64 = 57600 Hz, /512 = pwm = 112.5 Hz out tccr0, temp clr temp ; set 0% duty cycle pwm out ocr0, temp clr temp ; clear timer out tcnt0, temp sbi ddrb, 3 ; output on oc0(pb3) ser temp ; all leds off (portc) out ddrc, temp clr temp rcall display clr temp ; all buttons high (porta) out ddra, temp ser temp out porta, temp clr oldButtons ; old buttons up clr leds ; leds off clr oldLeds ; old leds off ;----------------------------------------------------------------------------------- ; main loop .def temp = r16 ; working .def oldButtons = r17 ; persistent .def leds = r18 ; persistent .def oldLeds = r19 ; persistent main: rcall getButtons ; get buttons cp temp, oldButtons ; check for change in buttons breq main rcall delay ; debounce com oldButtons ; new state = (input and !old) xor state and oldButtons, temp eor leds, oldButtons mov oldButtons, temp ; save buttons cp leds, oldLeds ; check for change in leds breq main mov oldLeds, leds ; save state mov temp, leds ; display state rcall display mov temp, leds ; set pwm out ocr0, temp rjmp main ; infinite loop ;---------------------------------------------------------------------------------- ; get buttons .def result = r16 ; output getButtons: in result, pina com result ret ;---------------------------------------------------------------------------------- ; display on leds .def input = r16 ; input/working display: com input out portc, input ret ;---------------------------------------------------------------------------------- ; delay 0.10 .def loop1 = r20 ; working .def loop2 = r21 ; working .def loop3 = r22 ; working delay: ldi loop1, 67 delay_0: ldi loop2, 13 delay_1: ldi loop3, 140 delay_2: dec loop3 brne delay_2 dec loop2 brne delay_1 dec loop1 brne delay_0 ret