led7seg.s
changeset 8 449fee4187f6
parent 7 697ea917c901
child 15 c8f3a514bbef
equal deleted inserted replaced
7:697ea917c901 8:449fee4187f6
     6 .org 0x00
     6 .org 0x00
     7         rjmp        init
     7         rjmp        init
     8 
     8 
     9 .org SPIaddr
     9 .org SPIaddr
    10         rjmp        SPI_Interrupt
    10         rjmp        SPI_Interrupt
       
    11 
       
    12 .org ADCCaddr
       
    13         rjmp        ADC_Interrupt
    11 
    14 
    12 ;; SPI
    15 ;; SPI
    13 .equ SPI_DDR    = DDRB
    16 .equ SPI_DDR    = DDRB
    14 .equ SPI_PORT   = PORTB
    17 .equ SPI_PORT   = PORTB
    15 .equ SPI_SCK    = PORTB5
    18 .equ SPI_SCK    = PORTB5
   173         com         r16
   176         com         r16
   174 
   177 
   175     ; Display
   178     ; Display
   176         rjmp        SPI_Send
   179         rjmp        SPI_Send
   177 
   180 
   178         
   181 ;; ADC
       
   182 .equ ADC_DDR    = DDRC
       
   183 .equ ADC_PORT   = PORTC
       
   184 .equ ADC_PIN    = PORTC0
       
   185         
       
   186 ;; Initialize the ADC for starting conversions
       
   187 ADC_Init:
       
   188     ; Setup ADMUX
       
   189         ; Use AVcc as ref
       
   190         ; Left-adjust result (for 8-bit access)
       
   191         ; Select ADC0
       
   192         ldi         r16, (0b01 << REFS0) | (1 << ADLAR) | (0b000 << MUX0)
       
   193         sts         ADMUX, r16
       
   194     
       
   195     ; Setup ADCSRB
       
   196         ; Free-running mode
       
   197         ldi         r16, (0b000 << ADTS0)
       
   198         sts         ADCSRB, r16
       
   199 
       
   200     ; Setup ADCSRA
       
   201         ; Enable
       
   202         ; Start right away...
       
   203         ; Auto-trigger
       
   204         ; Enable Interrupt
       
   205         ; Scale 1/128
       
   206         ldi         r16, (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (1 << ADIE) | (0b111 << ADPS0)
       
   207         sts         ADCSRA, r16
       
   208 
       
   209     ; Disable digital circuit for pin
       
   210         ldi         r16, (1 << ADC_PIN)
       
   211         sts         DIDR0, r16
       
   212 
       
   213     ; Debug LED
       
   214         sbi         DDRD, PORTD7
       
   215         sbi         PORTD, PORTD7
       
   216 
       
   217     ; Done
       
   218         ret
       
   219 
       
   220 ADC_Interrupt:
       
   221     ; Off
       
   222         cbi         PORTD, PORTD7
       
   223     
       
   224     ; Done
       
   225         reti    
       
   226 
       
   227 ;; Read the current 8-bit ADC sample 
       
   228 ; Returns value in r16
       
   229 ADC_Read8:
       
   230     ; Copy
       
   231         lds         r16, ADCH
       
   232 
       
   233     ; Done
       
   234         ret
   179 
   235 
   180 ;; Delay for approx. one second
   236 ;; Delay for approx. one second
   181 Delay_1s:
   237 Delay_1s:
   182         ; 40 * 64k = 2.6M loops
   238         ; 40 * 64k = 2.6M loops
   183         ldi         r20, 40
   239         ldi         r20, 40
   253 _spin_next:
   309 _spin_next:
   254         ; display
   310         ; display
   255         mov         r16, r24
   311         mov         r16, r24
   256         rcall       LCD_ShowRaw
   312         rcall       LCD_ShowRaw
   257 
   313 
   258         ; short delay
   314         ; variable delay -> r16
   259         ldi         r20, 6
   315         rcall       ADC_Read8
   260         ldi         r21, 255
   316 
       
   317         ; short delay, from ADC
       
   318         mov         r20, r16
       
   319         ldi         r21, 1
   261         rcall       ShortDelay
   320         rcall       ShortDelay
   262 
   321 
   263         ; next segment
   322         ; next segment
   264         lsl         r24
   323         lsl         r24
   265         
   324         
   278         out         SPL, r17
   337         out         SPL, r17
   279 
   338 
   280     ; Enable interrupts
   339     ; Enable interrupts
   281         sei
   340         sei
   282 
   341 
       
   342     ; ADC (slowest to start up)
       
   343         rcall       ADC_Init
       
   344 
   283     ; SPI
   345     ; SPI
   284         rcall       SPI_Init
   346         rcall       SPI_Init
   285     
   347     
   286     ; LCD (requires interrupts)
   348     ; LCD (requires interrupts, blocks)
   287         rcall       LCD_Init    
   349         rcall       LCD_Init    
   288     
   350     
   289     ; Run
   351     ; Run
   290         ; spin!
   352         ; spin!
   291         rcall       Main_Spin
   353         rcall       Main_Spin