hw.S
author Tero Marttila <terom@paivola.fi>
Sun, 20 Apr 2014 23:51:57 +0300
changeset 80 5254ba612630
parent 3 0584de343264
permissions -rw-r--r--
dmx-web: slightly better RGB colorpicker control..
.nolist
.include "m168def.inc"      ; Same family as 328P
.list

; Interrupt vector
.org 0x00
        rjmp        main            ; Reset

.org OC1Aaddr
        rjmp        timer           ; Timer 1 Compare A 

; Program code
main:
    ; Setup pins for output
        sbi         DDRB, PORTB4        ; Out
        sbi         DDRB, PORTB5        ; Out
        
    ; Flags for output
        ldi         r16, (1 << PORTB4)

    ; Setup Timer 0
        ; Count to 64k
        ldi         r18, HIGH(0xffff/2)
        ldi         r19, LOW(0xffff/2)
        sts         OCR1AH, r18
        sts         OCR1AL, r19
 
        ; Normal port operation for both comperators
        ; Bits WGM10:1 zero
        ldi         r18,    0x00
        sts         TCCR1A, r18
 
        ; CTC mode, 1/64 prescaled
        ; the timer will start counting from now, but that shouldn't matter..
        ldi         r18,    (1 << WGM12) | (0b011 << CS10)
        sts         TCCR1B, r18
       
        ; Enable timer interrupt
        ldi         r18, (1 << OCIE1A)
        sts         TIMSK1, r18
        
        ; Setup sleep for Idle mode
        ldi         r18, (0b000 << SM0) | (1 << SE)
        sts         SMCR, r18

        ; ...and enable interrupts
        sei

loop:
        ; Flip
        com         r16
        
        ; Output
        out         PORTB, r16

        ; Wait
wait:   sleep
        cpi         r20, 1
        brne        wait
        ldi         r20, 0

        ; continue
        rjmp loop

; Counter overflow handler
timer:
        ; Set flag
        ldi         r20, 1

        ; Re-enable interrupts
        reti