dmx.s
author Tero Marttila <terom@paivola.fi>
Sun, 20 Apr 2014 23:51:57 +0300
changeset 80 5254ba612630
parent 62 2d68a76322cb
permissions -rw-r--r--
dmx-web: slightly better RGB colorpicker control..
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
;;; vim: set ft=avr:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
.nolist
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
.include "m168def.inc"      ; Same family as 328P
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
.list
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
     7
.include "macros.inc"
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
;; Interrupt Vector
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
.cseg
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
.org 0x0000
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        rjmp        Main
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
;; CPU cycles / second: 16 Mhz
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
.set CPU_CYCLES = 16 * 1000 * 1000
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    18
;; Delays
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    19
.include "delay.inc"
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    20
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
;; DMX baud raite: 250k
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
.set DMX_BAUD = 250 * 1000
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
;; CPU cycles / bit: 64
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
.set DMX_CYCLES = CPU_CYCLES / DMX_BAUD
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    27
;; DMX output I/O
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
.set DMX_DDR = DDRB
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
.set DMX_PORT = PORTB
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
.equ DMX_DATA = PORTB3
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    32
;; DMX protocol timer
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    33
; Registers
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    34
.set DMX_TIMER_CRA = TCCR2A
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    35
.set DMX_TIMER_CRB = TCCR2B
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    36
.set DMX_TIMER_CNT = TCNT2
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    37
.set DMX_TIMER_OCRA = OCR2A
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    38
.set DMX_TIMER_OCRB = OCR2B
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    39
.set DMX_TIMER_IMSK = TIMSK2
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    40
.set DMX_TIMER_IFR = TIFR2
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    41
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    42
; Compare output match isn't used
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    43
.set DMX_TIMER_COMA = 0b00
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    44
.set DMX_TIMER_COMB = 0b00
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    45
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    46
; Control register, generation mode value
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    47
.set DMX_TIMER_WGM_10 = 0b10        ; CTC
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    48
.set DMX_TIMER_WGM_2 = 0b0
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    49
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    50
; Clock select
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    51
.set DMX_TIMER_CS_STOP = 0b000
62
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
    52
.set DMX_TIMER_CS = 0b001      ; 1/1
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
    53
;.set DMX_TIMER_CS = 0b111       ; 1/1024
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    54
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    55
; Counted value
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    56
.set DMX_TIMER_TOP = DMX_CYCLES     ; number of cycles for baud
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    57
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
;; Debug LED
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
.set LED_DDR = DDRB
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
.set LED_PORT = PORTB
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
.set LED_PIN = PINB
62
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
    62
.set LED_BIT = PORTB0
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
;; Set up DMX output
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
DMX_Init:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    ; Setup output port
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        ; out
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        sbi     DMX_DDR, DMX_DATA
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        ; drive high
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        sbi     DMX_PORT, DMX_DATA
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    73
    ; Setup timer
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    74
        ; setup CTC mode with no output pins
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    75
        poke        [DMX_TIMER_CRA, r16, (DMX_TIMER_COMA << COM2A0) | (DMX_TIMER_COMB << COM2B0) | (DMX_TIMER_WGM_10 << WGM20)]
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    76
        poke        [DMX_TIMER_CRB, r16, (DMX_TIMER_WGM_2 << WGM22) | (DMX_TIMER_CS_STOP << CS20)]
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    77
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    78
        ; trigger threshold for CTC
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    79
        poke        [DMX_TIMER_OCRA, r16, (DMX_TIMER_TOP)]
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    80
		
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    ; OK
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    82
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    83
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    84
;; Start Break signal
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    85
;;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    86
;; 22 bits - 1s long; then DMX_Break_Mark
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    87
;;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    88
DMX_Break_Start:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    89
    ; Low
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    90
        cbi         DMX_PORT, DMX_DATA
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    91
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    92
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    93
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    94
;; Start Mark-after-break signal
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    95
;;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    96
;; 2 bits - 1s long; then DMX_Break_End
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    97
;;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    98
DMX_Break_Mark:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    99
    ; High
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   100
        sbi         DMX_PORT, DMX_DATA
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   101
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   102
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   103
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   104
;; End break; prepare for DMX_Frame
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   105
DMX_Frame_Start:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   106
    ; Start timer
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   107
        poke        [DMX_TIMER_CRB, r20, (DMX_TIMER_WGM_2 << WGM22) | (DMX_TIMER_CS << CS20)]
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   108
    
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   109
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   110
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   111
;; Do a full DMX break, using some random length
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   112
;;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   113
DMX_Break:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   114
    ; Break
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   115
        ; start
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   116
        rcall       DMX_Break_Start
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   117
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   118
        ; wait; about 100ms?
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   119
        ldi         r20, 82 / 10
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   120
        rcall       VarDelay
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   121
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   122
    ; MAB
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   123
        ; mark
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   124
        rcall       DMX_Break_Mark
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   125
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   126
        ; short wait
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   127
        ldi         r20, 1
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   128
        rcall       VarDelay
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   129
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   130
    ; Timed frames
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   131
        ; start frame
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   132
        rcall       DMX_Frame_Start
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   133
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   134
    ; ok
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   135
    ret
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
;; Bitbang one DMX bit out
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
;;  uses SREG/C to send
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   139
;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   140
; Uses Timer2 as a bit sync clock, sending out the next bit once we've hit 64 cycles on the timer
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
DMX_Bit:
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   142
    ; Wait for bit sync clock
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   143
_dmx_bit_wait:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   144
        ; test OCA hit
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   145
        sbic    TIFR2, OCF2A     
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   146
        rjmp    _dmx_bit_wait   
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   147
62
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
   148
;sbi         LED_PORT, LED_BIT
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   149
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   150
    ; Output bit
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   151
        ; XXX: ugly bit-testing, can't we do this using something more nifty?
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        brcs    _dmx_bit_1
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   154
        ; bit 0
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
        cbi     DMX_PORT, DMX_DATA
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   156
        rjmp    _dmx_bit_done
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
_dmx_bit_1:
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   159
        ; bit 1
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        sbi     DMX_PORT, DMX_DATA
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        nop
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   163
    ; Bit sent
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   164
_dmx_bit_done:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   165
        ; reset OCA hit for next bit
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   166
        cbi     TIFR2, OCF2A
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   168
    ; OK, bit sync clock keeps running for next bit
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   169
    ret
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   171
;; Bitbang one DMX byte out, using DMX_Bit
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
;;  r16: byte value
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   173
;
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   174
; Uses Timer2 as a bit sync clock; must call DMX_Frame_Start before first DMX_Frame
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
DMX_Frame:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    ; Start bit
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   177
        clc
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        rcall       DMX_Bit
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    ; Data bits: 8
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
        ldi         r21, 8
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
        
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
_dmx_frame_loop:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        ; shift + send bit
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
        lsl         r16
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        rcall       DMX_Bit
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        ; loop
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
        dec         r21
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
        brne        _dmx_frame_loop
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    ; Stop bits
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   193
        sec
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        rcall       DMX_Bit
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        rcall       DMX_Bit
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
    ; OK
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   198
    ret
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   200
;; End of DMX frames
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   201
DMX_Frame_End:
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   202
    ; Keep mark from end of last frame; DMX_Break_Start starts the break
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   203
    ; Stop the timer
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   204
        poke        [DMX_TIMER_CRB, r20, (DMX_TIMER_WGM_2 << WGM22) | (DMX_TIMER_CS_STOP << CS20)]
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   205
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   206
    ; OK
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   207
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   208
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   209
;; Send one value on all frames
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
;;  r17: byte value
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
DMX_Flood:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    ; Break
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
        rcall       DMX_Break
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    ; Start code
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
        ldi         r16, 0
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        rcall       DMX_Frame
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    ; Channels
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
        ; number of channels to send
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        ldi         r22, 100
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
_dmx_flood_channels:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
        ; restore channel value
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
        mov         r16, r17
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        ; send channel value
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        rcall       DMX_Frame
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
        ; loop
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
        dec         r22
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
        brne        _dmx_flood_channels
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   234
    ; End packet
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   235
        rcall       DMX_Frame_End
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   238
    ret
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   239
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
;; Program main
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
Main:
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
; Initialization
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
    ; Debug
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
        sbi         LED_DDR, LED_BIT
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   245
sbi         LED_PORT, LED_BIT
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
    ; Stack
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   248
		poke		[SPL, r16:r17, RAMEND]
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
    ; Init
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
        rcall       DMX_Init
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
62
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
   253
cbi         LED_PORT, LED_BIT
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
    ; Send; value
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   256
_main_loop:
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
        ldi         r17, 255
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
        rcall       DMX_Flood
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
62
2d68a76322cb hello-dmx: working basic dmx output using DmxSimple's frame-timing inline assembler code
Tero Marttila <terom@paivola.fi>
parents: 46
diff changeset
   260
cbi         LED_PORT, LED_BIT
46
ffb0c3ec9bc0 moar dmx?
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   261
45
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
        ; never returns..
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
        rjmp        _main_loop
7c684d241675 dmx: initial try.. failed
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264