led7seg.s
author Tero Marttila <terom@fixme.fi>
Fri, 07 May 2010 01:46:22 +0300
changeset 8 449fee4187f6
parent 7 697ea917c901
child 15 c8f3a514bbef
permissions -rw-r--r--
ADC\!
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
.nolist
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
.include "m168def.inc"      ; Same family as 328P
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
.list
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
;; Interrupt Vector
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
.org 0x00
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
        rjmp        init
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
.org SPIaddr
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
        rjmp        SPI_Interrupt
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    12
.org ADCCaddr
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    13
        rjmp        ADC_Interrupt
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    14
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
;; SPI
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
.equ SPI_DDR    = DDRB
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
.equ SPI_PORT   = PORTB
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
.equ SPI_SCK    = PORTB5
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
.equ SPI_MISO   = PORTB4
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
.equ SPI_MOSI   = PORTB3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
.equ SPI_SS     = PORTB2
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
.equ SPI_FLAGS  = GPIOR0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
.equ SPI_BUSY   = 0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
;; Initialize SPI subsystem for master operation
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
SPI_Init:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    ; Set modes
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        sbi         SPI_DDR, SPI_SCK        ; Out
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        sbi         SPI_DDR, SPI_MOSI       ; Out
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        sbi         SPI_DDR, SPI_SS         ; Out
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    ; Drive SS high (off)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        sbi         SPI_PORT, SPI_SS
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    ; Set control mode
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        ; Enable interrupt
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        ; Enable SPI
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        ; MSB first
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        ; Master mode
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        ; Polarity/phase: Mode 0 (sample on rising edge)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        ; Clock rate 1/16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        ldi         r16, (1 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        out         SPCR, r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    ; Flags
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        clr         r0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        out         SPI_FLAGS, r0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    ; Done
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        ret
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
;; Send byte
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
;;  Input: r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
;;  XXX: should not be busy...
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
SPI_Send:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    ; Flag
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        sbi         SPI_FLAGS, SPI_BUSY
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    ; Enable slave (low)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        cbi         SPI_PORT, SPI_SS
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    ; Write byte (starts SCK)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        out         SPDR, r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    ; Wait for interrupt
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    ; Done
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        ret
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
;; Wait for byte to be sent
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
SPI_Wait:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
wait_idle:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        sbic        SPI_FLAGS, SPI_BUSY     ; Test for busy flag
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        rjmp        wait_idle               ; loop
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    ; Done
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        ret
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
;; Service SPI interrupt
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
SPI_Interrupt:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    ; Store SREG
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        in          r16, SREG
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    ; Drive SS high (off)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        sbi         SPI_PORT, SPI_SS
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    ; Flag
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        cbi         SPI_FLAGS, SPI_BUSY
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    ; Done
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        out         SREG, r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        reti
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
;; LCD
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
.equ LCD_DDR    = DDRB
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
.equ LCD_PORT   = PORTB
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
.equ LCD_OE     = PORTB1                ; Output Enable (Low)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
; Output font for 7-segment display
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
LCD_Font:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
.db     0b00111111, 0b00000110      ; 0, 1
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
.db     0b01011011, 0b01001111      ; 2, 3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
.db     0b01100110, 0b01101101      ; 4, 5
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
.db     0b01111101, 0b00000111      ; 6, 7
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
.db     0b01111111, 0b01100111      ; 8, 9
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
.db     0b10000000, 0b00000000      ; ., 
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
;.db     0b00111111,     ; 0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
;        0b00000110,     ; 1
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
;        0b01011011,     ; 2
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
;        0b01001111,     ; 3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
;        0b01100110,     ; 4
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
;        0b01101101,     ; 5
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
;        0b01111101,     ; 6
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
;        0b00000111,     ; 7
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
;        0b01111111,     ; 8
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
;        0b01100111,     ; 9
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
;        0b10000000,     ; .
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
;        0b01000000      ; 
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
.equ LCD_0      = 0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
.equ LCD_1      = 1
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
.equ LCD_2      = 2
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
.equ LCD_3      = 3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
.equ LCD_4      = 4
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
.equ LCD_5      = 5
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
.equ LCD_6      = 6
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
.equ LCD_7      = 7
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
.equ LCD_8      = 8
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
.equ LCD_9      = 9
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
.equ LCD_DOT    = 10
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
.equ LCD_EMPTY  = 11
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
;; Initialize LCD to empty, and enable
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
LCD_Init:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    ; Setup ENable port
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        sbi         LCD_PORT, LCD_OE    ; Disabled (Low)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        sbi         LCD_DDR, LCD_OE     ; Out
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        ; empty
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        ldi         r16, 0b11111111
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    ; Output
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        rcall       SPI_Send
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        rcall       SPI_Wait
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    ; Enable
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        cbi         LCD_PORT, LCD_OE
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    ; Done
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        ret
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
;; Display a single digit on the display
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
;;  Input: r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
LCD_Show:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        clr         r0, 0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    ; Prep address
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        ; base addr for font table
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        ldi         ZH, high(2*LCD_Font)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        ldi         ZL, low(2*LCD_Font)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        ; offset
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        add         ZL, r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        adc         ZH, r0
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    ; Load char
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        lpm         r16, Z
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   169
    
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   170
    ;; Continue
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   172
;; Display a raw segment mask
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   173
;;  Input: r16
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   174
LCD_ShowRaw:
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    ; Invert
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        com         r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    ; Display
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   179
        rjmp        SPI_Send
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   181
;; ADC
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   182
.equ ADC_DDR    = DDRC
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   183
.equ ADC_PORT   = PORTC
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   184
.equ ADC_PIN    = PORTC0
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   185
        
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   186
;; Initialize the ADC for starting conversions
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   187
ADC_Init:
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   188
    ; Setup ADMUX
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   189
        ; Use AVcc as ref
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   190
        ; Left-adjust result (for 8-bit access)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   191
        ; Select ADC0
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   192
        ldi         r16, (0b01 << REFS0) | (1 << ADLAR) | (0b000 << MUX0)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   193
        sts         ADMUX, r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   194
    
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   195
    ; Setup ADCSRB
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   196
        ; Free-running mode
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   197
        ldi         r16, (0b000 << ADTS0)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   198
        sts         ADCSRB, r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   199
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   200
    ; Setup ADCSRA
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   201
        ; Enable
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   202
        ; Start right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   203
        ; Auto-trigger
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   204
        ; Enable Interrupt
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   205
        ; Scale 1/128
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   206
        ldi         r16, (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (1 << ADIE) | (0b111 << ADPS0)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   207
        sts         ADCSRA, r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   208
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   209
    ; Disable digital circuit for pin
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   210
        ldi         r16, (1 << ADC_PIN)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   211
        sts         DIDR0, r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   212
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   213
    ; Debug LED
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   214
        sbi         DDRD, PORTD7
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   215
        sbi         PORTD, PORTD7
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   216
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   217
    ; Done
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   218
        ret
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   219
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   220
ADC_Interrupt:
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   221
    ; Off
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   222
        cbi         PORTD, PORTD7
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   223
    
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   224
    ; Done
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   225
        reti    
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   226
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   227
;; Read the current 8-bit ADC sample 
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   228
; Returns value in r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   229
ADC_Read8:
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   230
    ; Copy
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   231
        lds         r16, ADCH
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   232
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   233
    ; Done
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   234
        ret
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   235
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   236
;; Delay for approx. one second
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   237
Delay_1s:
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   238
        ; 40 * 64k = 2.6M loops
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   239
        ldi         r20, 40
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   240
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   241
;; Delay for r20 * 64k cycles
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   242
VarDelay:
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   243
        ldi         r21, 255
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   244
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   245
;; Delay for r20 * r21 * 255 cycles
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   246
ShortDelay:
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   247
        ldi         r22, 255
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   248
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   249
delay:
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   250
        dec         r22
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   251
        brne        delay
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   252
        dec         r21
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   253
        brne        delay
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   254
        dec         r20
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   255
        brne        delay
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   256
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   257
        ret
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   258
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   259
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   260
;; Count down from 9
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   261
; Returns once we've hit zero
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   262
Main_Countdown:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   263
        ; init from 9
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   264
        ldi         r24, LCD_9
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   265
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   266
loop:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   267
        ; display
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   268
        mov         r16, r24
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   269
        rcall       LCD_Show
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   270
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   271
        ; exit if zero
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   272
        tst         r24
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   273
        ret
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   274
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   275
        ; count down
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   276
        dec         r24
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   277
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   278
        ; wait...
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   279
        rcall        Delay_1s
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   280
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   281
        ; next
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   282
        rjmp        loop
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   283
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   284
;; Blink between dot and empty
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   285
Main_Blink:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   286
_blink_loop:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   287
        ; dot
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   288
        ldi         r16, LCD_DOT
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   289
        rcall       LCD_Show
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   290
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   291
        ; wait...
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   292
        rcall       Delay_1s
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   293
        
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   294
        ; empty
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   295
        ldi         r16, LCD_EMPTY
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   296
        rcall       LCD_Show
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   297
        
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   298
        rcall       Delay_1s
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   299
        
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   300
        ; loop
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   301
        rjmp        _blink_loop
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   302
 
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   303
;; Chase segments
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   304
Main_Spin:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   305
_spin_init:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   306
        ; init from top
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   307
        ldi         r24, 0b00000001 
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   308
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   309
_spin_next:
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   310
        ; display
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   311
        mov         r16, r24
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   312
        rcall       LCD_ShowRaw
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   313
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   314
        ; variable delay -> r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
        rcall       ADC_Read8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   316
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   317
        ; short delay, from ADC
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   318
        mov         r20, r16
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   319
        ldi         r21, 1
7
697ea917c901 tweak delay
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   320
        rcall       ShortDelay
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   321
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   322
        ; next segment
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   323
        lsl         r24
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   324
        
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   325
        ; go back to A if we hit G
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   326
        sbrc        r24, 6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   327
        rjmp        _spin_init
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   328
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   329
        rjmp        _spin_next
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   330
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   331
Main:
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
init:
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
    ; Stack
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
        ldi         r16, high(RAMEND)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
        ldi         r17, low(RAMEND)
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
        out         SPH, r16
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
        out         SPL, r17
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   338
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
    ; Enable interrupts
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
        sei
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   342
    ; ADC (slowest to start up)
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   343
        rcall       ADC_Init
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   344
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
    ; SPI
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
        rcall       SPI_Init
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
    
8
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   348
    ; LCD (requires interrupts, blocks)
3
0584de343264 SPI/LCD thingie
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
        rcall       LCD_Init    
6
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   350
    
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   351
    ; Run
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   352
        ; spin!
88c930373d62 LCD spin\!
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   353
        rcall       Main_Spin
4
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   354
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   355
end:
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   356
        rjmp        end
b45780fbd7e8 count down a and blink \o/
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   357