![]() |
![]() |
|
|
|
|
|
|
||||||||||||||||
|
|
|
||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|||||||||||||||||||||||
|
Home
|
|||||||||||||||||||||||
![]() |
![]() |
LED effects
![]() Download design files in Proteus 7 format
;*****************************************************************
;LED illumination
;rev. 4, 06/09/2010god
;MCU ATtiny2313 , internal RC generator, 4 MHZ
;*****************************************************************
.include "2313def.inc" ;Done some changes for
ATtiny2313 !
; r0 - consits group 1
; r1 - consits group 2
; r2 - consits group 3
; r3 - consits group 4
; r4 - counter of groups for Effect 1
; r5 - counter of groups for Dynamic Indication
; r6 - counter of effects
.cseg
.org $000
rjmp RESET ;Reset
Handle
reti ;LabINT0; External
Interrupt0 Vector Address
reti ;LabINT1; External
Interrupt1 Vector Address
reti ;TIM1_CAPT;
Timer/Counter1 Capture Event
reti ;TIM1_COMP;
Timer/Counter1 Compare Match A
reti ;TIM1_OVF;
Timer/Counter1 Overflow
rjmp TIM0_OVF;
Timer/Counter0 Overflow
reti
reti
reti
reti
;************************************************
TIM0_OVF: ;it does dynimic indication
mov r16, r5 ; couter is
loaded
clz
cpi r16, 0 ; if is 0
then group 1
breq Tvar1
clz
cpi r16, 1 ; if is 1
then group 2
breq Tvar2
clz
cpi r16, 2 ; if is 2
then group 3
breq Tvar3
rjmp Tvar4 ; else group
4
Tvar1:
mov r16, r0
out PORTB, r16
cbi PORTD, PD3 ; clear
group 4
sbi PORTD, PD0 ;
indicate group 1
inc r5
rjmp Tizhod
Tvar2:
mov r16, r1
out PORTB, r16
cbi PORTD, PD0 ; clear
group 1
sbi PORTD, PD1 ;
indicate group 2
inc r5
rjmp Tizhod
Tvar3:
mov r16, r2
out PORTB, r16
cbi PORTD, PD1 ; clear
group 2
sbi PORTD, PD2 ;
indicate group 3
inc r5
rjmp Tizhod
Tvar4:
mov r16, r3
out PORTB, r16
cbi PORTD, PD2 ; clear
group 3
sbi PORTD, PD3 ;
indicate group 4
clr r5
Tizhod:
sei
reti
;************************************************
Efekt1:
in r17, TIFR ;chek if
TMR1 is overtime
sbrs r17, TOV1
rjmp E1izh ;if not
overtime -> go out
ldi r17, $80 ; clear
interrupt flag
out TIFR, r16
sec ; flag C = 1
rol r0 ; load 1 through
flag C
bst r0,6 ; load the bit
through flag T into next register
rol r1 ;
bld r1,0
bst r1,6
rol r2
bld r2,0
bst r2,6
rol r3
bld r3,0
bst r3,6
brts E1Clr ; check for
finishing (last bit in last register)
rjmp E1izh
E1Clr:
clr r0 ; clear all
registers
clr r1
clr r2
clr r3
E1izh:
ret
;************************************************
Efekt2:
in r17, TIFR ;;chek if
TMR1 is overtime
sbrs r17, TOV1
rjmp E2izh ;if it is
not -> go out
ldi r17, $80 ;clear
interrupt flag
out TIFR, r16
mov r17, r4 ; load
counter
clz
cpi r17, 0 ; if 0
rolling r0
breq E2var0
clz
cpi r17, 1 ; if 1
rolling r1
breq E2var1
clz
cpi r17, 2 ; if 2
rolling r3
breq E2var2
rjmp E2var3 ; else
rolling r3
E2var0:
clc ; flag C = 0
rol r0 ; load 1 through
flag C
sbrc r0, 6 ;check if
first 6 bits are 0's
rjmp E2izh ; if are not
-> go out
clc ; if it is ->
rolling next register
rol r1 ; (in this case
r1)
rjmp E2izINC
E2var1:
clc ; flag C = 0
rol r1 ; load 1 through
flag C
sbrc r1, 6 ;check if
first 6 bits are 0's
rjmp E2izh ; if are not
-> go out
clc ;if it is ->
rolling next register
rol r2 ; (in this case
r2)
rjmp E2izINC
E2var2:
clc ; flag C = 0
rol r2 ; load 1 through
flag C
sbrc r2, 6 ;check if
first 6 bits are 0's
rjmp E2izh ; if are not
-> go out
clc ;if it is ->
rolling next register
rol r3 ; (in this case
r3)
rjmp E2izINC
E2var3:
clc ; flag C = 1
rol r3 ; load 1 through
flag C
sbrc r3, 6 ;check if
first 6 bits are 0's
rjmp E2izh ; if are not
-> go out
ldi r17, $FF ;if they
are -> each bit is set
mov r0, r17
mov r1, r17
mov r2, r17
mov r3, r17
E2izINC:
inc r4 ;this fragment
increase counter (r4)
mov r17, r4
clc
cpi r17, 4 ;if it is =
4, then it is cleared
brlo E2izh ;to start
again
clr r4 ;r4=0 , or it
pointes r0
E2izh:
ret
;************************************************
Prog1: ;Main program
sbis PORTD, PD4 ;check
for pressing button "+"
rjmp IncTmr
sbis PORTD, PD5 ;check
for pressing button "-"
rjmp DecTmr
sbis PORTD, PD6 ;check
for pressing button "F"
rjmp EfSel ;(for change
of effect
mov r17, r6 ; load
effect counter
clz
cpi r17, 0 ; if 0 then
roll r0
breq PRvar0
rcall Efekt2
rjmp Prog1
PRvar0:
rcall Efekt1
rjmp Prog1
IncTmr:
ldi r17,TCNT1H
clz
cpi r17, $FC ;check for
max value
breq IncOut ;$FC is max
value
inc r17
out TCNT1H, r17
IncOut:
rjmp Prog1
DecTmr:
ldi r17,TCNT1H
clz
cpi r17, $CC ;check for
max value
breq DecOut ;$CC is max
value
dec r17
out TCNT1H, r17
DecOut:
rjmp Prog1
EfSel:
mov r17, r6
clz
cpi r17, 1 ;check for
max value
breq EfSel1 ;$1 is max
value
inc r6 ;(2 effects)
rjmp Prog1
EfSel1:
clr r6
rjmp Prog1
;************************************************
Reset: ;Initiation section
ldi r16, $DF ;STACK
forming
out SPL, r16
ldi r16,$FF ;Init. Port
B
out DDRB, r16 ;B0 - B7
are outputs
ldi r16,$0F ;Init. Port D
out DDRD, r16 ;D0 - D3 are outputs
; D4, D5 and D6 are inputs
clr r16
out PORTD, r16 ;clear
all groups
clr r0 ;clear all
registers
clr r1
clr r2
clr r3
clr r4 ;clear counter
for Effect 1
clr r5 ;clear counter
for Dynimic Indication
clr r6 ;clear counter
of effects
ldi r16, 3
; 8-bit Timer
out TCCR0B, r16 ;Prescaler=1/64
ldi r16, 3
; 16-bit Timer
out TCCR1B, r16 ;Prescaler=1/64
ldi r16, $E7 ;load E795
for time interval 0,1s
ldi r17, $FF
out TCNT1H, r16 ; first
is high Byte
out TCNT1L, r17 ;
second is low Byte
sei
; enable global interrupt
ldi r16, 2 ; enable
TMR0 interrupt
out TIMSK, r16
rjmp Prog1 ; end of
initialisation section .exit
![]() PCB Top Layer ![]() PCB Bottom Layer
|
|||||||||||||||||||||
![]() |
![]() |
|
|||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||
|
|
|||||||||||||||||||||||
|
|
|||||||||||||||||||||||
|
Elektrotekno.com | Free Schematics Search Engine | Electronic Kits | Electronic Accessories |
|||||||||||||||||||||||
|
|
|||||||||||||||||||||||