parent
9c04c8f3f3
commit
868f28bff1
@ -1,29 +1,14 @@ |
||||
# Object files |
||||
*.o |
||||
*.ko |
||||
*.obj |
||||
*.elf |
||||
|
||||
# Precompiled Headers |
||||
*.gch |
||||
*.pch |
||||
|
||||
# Libraries |
||||
*.lst |
||||
*~ |
||||
*.bak |
||||
*.lib |
||||
*.a |
||||
*.la |
||||
*.lo |
||||
|
||||
# Shared objects (inc. Windows DLLs) |
||||
*.dll |
||||
*.so |
||||
*.so.* |
||||
*.dylib |
||||
|
||||
# Executables |
||||
*.exe |
||||
*.out |
||||
*.app |
||||
*.i*86 |
||||
*.x86_64 |
||||
*.hex |
||||
|
@ -0,0 +1,517 @@ |
||||
.DEVICE ATtiny13 |
||||
.LIST |
||||
.LISTMAC |
||||
;běží na 9.6MHz, ckdiv8=0 (zapnuto) |
||||
;avrdude příkaz pro FUSEs: -U lfuse:w:0x6a:m -U hfuse:w:0xff:m |
||||
;LFUSE: 0x6A |
||||
;HFUSE: 0xFF |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
|
||||
.def ARG = r20 ;registr pro předání hodnoty rutinám |
||||
|
||||
;počátek paměti SRAM pro uložení přečtené teploty (9 bajtů) |
||||
.equ SRAM_t_H = 0x00 |
||||
.equ SRAM_t_L = 0x00 |
||||
|
||||
;komunikační kanál pro ds1820 |
||||
.equ PORTn = PORTB |
||||
.equ PINn = PINB |
||||
.equ DDRn = DDRB |
||||
.equ n = 0 ;pin pro komunikaci s DS1820 |
||||
|
||||
; Č A S O V Á N Í |
||||
;délka 1 cyklu = T = 1/f |
||||
; tXXXu = [XXX / (4*T)] - 2 |
||||
; (ldi, rcall a ret zabere 8 cyklů) |
||||
; nejnižší hodnota je 1 ... 12T čekání |
||||
; attiny13@9.6MHz+CKDIV8...T=0.83333us |
||||
.equ t480u = 142 |
||||
.equ t410u = 120 |
||||
.equ t70u = 19 |
||||
.equ t64u = 17 |
||||
.equ t60u = 16 |
||||
.equ t54u = 14 |
||||
.equ t10u = 1 |
||||
|
||||
;registry pro CRC rutinu |
||||
.def rChar = r19 |
||||
.def rCount = r18 ;počet bajtů |
||||
.def rBitCount = r17 |
||||
.def rTemp = r16 |
||||
.def rCRC8 = r21 ;výsledek (musí být jiný než ARG) |
||||
|
||||
.def R = r4 |
||||
.def G = r5 |
||||
.def B = r6 |
||||
.def tL = r2 |
||||
.def tH = r3 |
||||
|
||||
;6us je obvykle moc málo pro volání DELAY |
||||
.MACRO t6uDELAY |
||||
ldi r16,2 ;pro attiny13@9.6MHz+CKDIV8 je to 2 x 4T = 8T = 8 x 0.83333us = 6us čekání |
||||
t6u: nop ;pozor! některé překladače labely v makrech nepodporují! |
||||
dec r16 |
||||
brne t6u |
||||
.ENDMACRO |
||||
|
||||
;ovládání sběrnice |
||||
.MACRO BUS_L |
||||
cbi PORTn,n |
||||
sbi DDRn,n ;pin n výstupní, výstup 0 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BUS_H |
||||
sbi PORTn,n |
||||
cbi DDRn,n ;pin n vstupní, pullup zapnutý (+ doporučeno 4.7k externí pullup) |
||||
.ENDMACRO |
||||
|
||||
.MACRO RGB_OFF |
||||
cbi PORTB,1 |
||||
cbi PORTB,2 |
||||
cbi PORTB,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO RGB_ON |
||||
sbi PORTB,1 |
||||
sbi PORTB,2 |
||||
sbi PORTB,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO PWM_CYCLE |
||||
ldi r17,@0 ;1 |
||||
PWM0: RGB_OFF ; 6 |
||||
ldi r16,40 ; 1 |
||||
PWM1: cp r16,R ; 1 |
||||
brne PWM2 ; 1/2 |
||||
sbi PORTB,1 ; 2 |
||||
PWM2: cp r16,G ; 1 |
||||
brne PWM3 ; 1/2 |
||||
sbi PORTB,2 ; 2 |
||||
PWM3: cp r16,B ; 1 |
||||
brne PWM4 ; 1/2 |
||||
sbi PORTB,3 ; 2 |
||||
PWM4: dec r16 ; 1 |
||||
brne PWM1 ; 1/2 (805)*r17+6 |
||||
dec r17 ; 1 |
||||
brne PWM0 ; 1/2 |
||||
RGB_OFF ;6 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
|
||||
; začátek kódu |
||||
.org 0x0010 |
||||
RESET: ldi r16,low(RAMEND) ;nastaví stack pointer |
||||
out SPL,r16 |
||||
|
||||
ldi r16,0b00011111 ;směr portu B - vše na výstup. Směr pinu n se bude měnit za chodu |
||||
out DDRB,r16 |
||||
ldi r16,0b00000000 ;RGB=0b000, ledka zhasnuta |
||||
out PORTB,r16 |
||||
|
||||
;tělo programu |
||||
clr R |
||||
clr G |
||||
clr B |
||||
MainLoop: |
||||
rcall GET_T ;teplota do SRAM 0x00-0x08 |
||||
|
||||
cpi ARG, 0 |
||||
brne MainLoop |
||||
|
||||
;výpočet barvy |
||||
ldi ZH,SRAM_t_H ;počátek řetězce přijatých bajtů do Z |
||||
ldi ZL,SRAM_t_L |
||||
ld tL,Z+ ;načíst teplotu z paměti |
||||
ld tH,Z |
||||
ldi r16,40 |
||||
mov R,r16 ;defaultní barva - bílá, 40 40 40 |
||||
mov G,r16 |
||||
mov B,r16 |
||||
ldi r16,0 |
||||
cpse tH,r16 ;pokud tH != 0x00, skoč na mínus |
||||
rjmp MINUS |
||||
;PLUS nebo NULA |
||||
ldi r16,21 ;tL >= 10.5? --> c10_20 |
||||
cp tL,r16 |
||||
brge c10_20 |
||||
;0-blue,10-white |
||||
clr R |
||||
clr G |
||||
mov r16,tL |
||||
lsl r16 |
||||
mov R,r16 |
||||
mov G,r16 |
||||
rjmp C_DONE |
||||
|
||||
c10_20: ;10-white,20-yellow |
||||
ldi r16,41 ;tL >= 20.5? --> c20_30 |
||||
cp tL,r16 |
||||
brge c20_30 |
||||
|
||||
mov r16,tL |
||||
subi r16,20 |
||||
lsl r16 |
||||
sub B,r16 |
||||
rjmp C_DONE |
||||
|
||||
c20_30: ;20-yellow,30-red |
||||
ldi r16,61 ;tL >= 30.5? --> c30_40 |
||||
cp tL,r16 |
||||
brge c30_40 |
||||
clr B |
||||
mov r16,tL |
||||
subi r16,40 |
||||
lsl r16 |
||||
sub G, r16 |
||||
rjmp C_DONE |
||||
|
||||
c30_40: ;30-red, 40-purple |
||||
ldi r16,81 ;tL >= 40.5? --> c40_50 |
||||
cp tL,r16 |
||||
brge c40_50 |
||||
clr B |
||||
clr G |
||||
mov r16,tL |
||||
subi r16,60 |
||||
lsl r16 |
||||
add B, r16 |
||||
rjmp C_DONE |
||||
|
||||
c40_50: ;40-purple, 50-"UV" |
||||
ldi r16,101 ;tL >= 50.5? --> c50_hi |
||||
cp tL,r16 |
||||
brge c50_hi |
||||
clr G |
||||
mov r16,tL |
||||
subi r16,80 |
||||
sub R, r16 |
||||
rjmp C_DONE |
||||
|
||||
c50_hi: |
||||
clr G |
||||
ldi r16,20 |
||||
mov R,r16 |
||||
rjmp C_DONE |
||||
|
||||
MINUS: |
||||
neg tL |
||||
ldi r16,21 ;-tL >= 10.5? --> cm10_20 |
||||
cp tL,r16 |
||||
brge cm10_20 |
||||
mov r16,tL |
||||
lsl r16 |
||||
clr R |
||||
clr G |
||||
add G,r16 |
||||
rjmp C_DONE |
||||
|
||||
cm10_20: |
||||
ldi r16,41 ;-tL >= 20? --> cm20_lo |
||||
cp tL,r16 |
||||
brge cm20_lo |
||||
clr R |
||||
mov r16,tL |
||||
subi r16,20 |
||||
lsl r16 |
||||
sub B,r16 |
||||
rjmp C_DONE |
||||
|
||||
cm20_lo: |
||||
clr R ;-tL >= 20? --> cm40_lo |
||||
clr B |
||||
rjmp C_DONE |
||||
|
||||
C_DONE: |
||||
|
||||
; mov r16,R |
||||
; ldi r17,11 |
||||
; rcall EEwrite |
||||
; mov r16,G |
||||
; ldi r17,12 |
||||
; rcall EEwrite |
||||
; mov r16,B |
||||
; ldi r17,13 |
||||
; rcall EEwrite |
||||
|
||||
; ldi ZH, SRAM_t_H |
||||
; ldi ZL, SRAM_t_L |
||||
;NextEE: ld r16,Z |
||||
; mov r17, ZL |
||||
; rcall EEwrite |
||||
; inc ZL |
||||
; cpi ZL,2 |
||||
; brlo NextEE |
||||
|
||||
PWM_CYCLE 255 |
||||
|
||||
rjmp MainLoop |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;G E T T E M P E R A T U R E |
||||
;Přečte 9 bajtů z teplotního čidla na pinu n (PINn, PORTn, DDRn) a uloží je do SRAM na adresu 0x00 až 0x08. |
||||
;status je uložen do ARG (ARG == 0 -> CRC se shoduje, OK; ARG != 0 -> CRC se neshoduje, chyba přenosu) |
||||
; |
||||
;SRAM po vykonání procedury GET_T: |
||||
; 0x00 temperature low byte - unit: 0.5°C |
||||
; 0x01 temperature high byte (sign, 0x00 = positive, 0xff = negative) |
||||
; 0x02 "user byte 1" |
||||
; 0x03 "user byte 2" |
||||
; 0x04 reserved, 0xFF |
||||
; 0x05 reserved, 0xFF |
||||
; 0x06 count remain (default 0x0C) |
||||
; 0x07 count per °C (fixed to 0x10) |
||||
; 0x08 CRC |
||||
;celá čtecí rutina trvá obvykle asi 550ms, max je asi 750ms. Během rutiny "W4C" může být prováděno něco jiného s pevnou délkou 700ms. |
||||
GET_T: |
||||
push r17 ;ulož používané registry do STACKu |
||||
|
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0x44 ;CONVERT_T |
||||
rcall TxBYTE |
||||
rcall W4C ;čekej na konverzi teploty |
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0xBE ;READ_SCRATCHPAD |
||||
rcall TxBYTE |
||||
|
||||
;přijmout 9 bajtů, uložit na 0x00 až 0x09 v SRAM |
||||
ldi ZH, SRAM_t_H |
||||
ldi ZL, SRAM_t_L |
||||
NEXT_B: rcall RxBYTE ;přijmi 1 bajt -> ARG |
||||
|
||||
N_B3: st Z+,ARG ;do SRAM na adresu Z ulož výsledek. Z++ |
||||
cpi ZL,9 ;je Z == 9? |
||||
brlo NEXT_B ;je-li menší, čti další bajt |
||||
|
||||
;vypočítat CRC, pokud se shoduje s přečtenou hodnotou, r16=1, jinak r16=0 |
||||
ldi XH,SRAM_t_H |
||||
ldi XL,SRAM_t_L |
||||
ldi rCount,9 |
||||
rcall CRC8 |
||||
mov ARG,rCRC8 |
||||
|
||||
pop r17 |
||||
ret ;návrat, ARG==0 .. ok, ARG!=0 .. error |
||||
|
||||
|
||||
;D E L A Y |
||||
; r16 = d = poček čtyřkloků zmenšený o 2 (dva čtyřkloly se vykonají při nastavení r16 pomocí LDI (1T), RCALL (3T) a RET (4T)) |
||||
DELAY: nop |
||||
dec r16 |
||||
brne DELAY |
||||
nop |
||||
ret ; po návratu je r16 = 0 |
||||
|
||||
|
||||
|
||||
;R E S E T P U L S E |
||||
TxRESET: |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
PWM_CYCLE 1 |
||||
;ldi r16,t480u |
||||
;rcall DELAY ;480us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t70u |
||||
rcall DELAY ;70us čekání |
||||
|
||||
sbic PINn,n |
||||
rjmp TxRESET ;není-li presence pulse, zopakuj TxRESET |
||||
|
||||
;ldi r16,t410u |
||||
;rcall DELAY ;410T čekání |
||||
PWM_CYCLE 1 |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;T R A N S M I T B Y T E |
||||
; odešlou se data z ARG |
||||
TxBYTE: ldi r17,8 ;čítač bytů = 8 |
||||
;nový bit |
||||
TxNB: lsr ARG ;nový bit; rotovat ARG: ARG.0 -> C |
||||
brcs Tx1 ;jednička - skok na Tx1, jinak pokračuj |
||||
|
||||
;-- Odeslání 0 -- |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
ldi r16,t60u |
||||
rcall DELAY ;60us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
rjmp TxLOOP ;skok na konec rutiny |
||||
|
||||
;-- Odeslání 1 -- |
||||
Tx1: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t64u |
||||
rcall DELAY ;64us čekání |
||||
|
||||
TxLOOP: dec r17 ;odečti 1 od čítače bitů |
||||
brne TxNB ;zbývají bity? ano -> TxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E B Y T E |
||||
; do ARG se uloží přečtený byte |
||||
RxBYTE: ldi r17,8 ;čítač bitů |
||||
clr ARG ;vymaž ARG |
||||
;nový bit |
||||
RxNB: rcall RxBIT |
||||
|
||||
ror ARG ;rotuj ARG C[=PINB.n] -> ARG.7, ARG.0 -> C |
||||
dec r17 ;odečti 1 od čítače bitů |
||||
brne RxNB ;zbývají bity? ano -> RxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E S I N G L E B I T |
||||
RxBIT: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
sbic PINn,n ;PINB.n -> C |
||||
sec |
||||
sbis PINn,n |
||||
clc |
||||
|
||||
ldi r16,t54u |
||||
rcall DELAY ;54us čekání |
||||
ret ;návrat |
||||
|
||||
|
||||
;Č E K Á N Í N A D O K O N Č E N Í K O N V E R Z E |
||||
;čekání na dokončení konverze teploty (nelze použít v parazitním režimu, v tom je třeba čekat 700ms.) |
||||
W4C: BUS_H |
||||
;až 700ms dlouhá čekací smyčka |
||||
W4C0: ldi r18,5 |
||||
W4C1: PWM_CYCLE 200 |
||||
dec r18 |
||||
brne W4C1 |
||||
|
||||
rcall RxBIT ;přijmi bit do C. |
||||
brcc W4C0 ;C=0 -> čekej dál |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;V Ý P O Č E T C R C |
||||
;XH,XL,rCount --> rCRC8 |
||||
CRC8: push XH ;save XH |
||||
push XL ;save XL |
||||
push rChar ;save rChar |
||||
push rCount ;save rCount |
||||
push rBitCount ;save rBitCount |
||||
push rTemp ;save rTemp |
||||
|
||||
clr rCRC8 ;start with a zero CRC-8 |
||||
|
||||
;begin loop to do each byte in the string |
||||
CRC8BYT: |
||||
ld rChar,X+ ;fetch next string byte and bump pointer |
||||
ldi rBitCount,8 ;load the bit-counter for this byte |
||||
|
||||
;begin loop to do each bit in the byte |
||||
CRC8BIT: |
||||
mov rTemp,rChar ;get a temporary copy of current data |
||||
eor rTemp,rCRC8 ;XOR the data byte with the current CRC |
||||
lsr rCRC8 ;position to the new CRC |
||||
lsr rChar ;position to next bit of this byte |
||||
lsr rTemp ;get low bit of old result into c-bit |
||||
brcc CRC8NA ;br if low bit was clear (no adjustment) |
||||
ldi rTemp,$8C ;magical value needed for CRC-8s |
||||
eor rCRC8,rTemp ;fold in the magic CRC8 value |
||||
CRC8NA: |
||||
dec rBitCount ;count the previous bit done |
||||
brne CRC8BIT ;br if not done all bits in this byte |
||||
;end loop to do each bit in the byte |
||||
|
||||
dec rCount ;count this byte done |
||||
brne CRC8BYT ;br if not done all bytes in the string |
||||
;end loop to do each byte in the string |
||||
|
||||
pop rTemp ;restore rTemp |
||||
pop rBitCount ;restore rBitCount |
||||
pop rCount ;restore rCount |
||||
pop rChar ;restore rChar |
||||
pop XL ;restore XL |
||||
pop XH ;restore XH |
||||
ret ;return to caller |
||||
; |
||||
;END OF SUBROUTINE CRC8 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;cteni z EEPROM, v [r17 je ADRESA], v (r16 se objeví DATA) |
||||
;EEread: |
||||
; sbic EECR,1 |
||||
; rjmp EEread ;cekani dokud neni EEPROM ready |
||||
; |
||||
; out EEARL, r17 ;ulozit adresu z r17 |
||||
; sbi EECR,0 ;nastavenim EERE zacina cteni |
||||
; in r16,EEDR ;cteni dat z EEDR do r16 |
||||
; |
||||
; ret |
||||
|
||||
|
||||
;zapis do EEPROM, v [R17 je ADRESA], v [R16 jsou DATA] |
||||
EEwrite: |
||||
sbic EECR,EEPE |
||||
rjmp EEwrite ;cekani dokud neni EEPROM ready |
||||
|
||||
cbi EECR,EEPM1 ;nastavit programovaci mod |
||||
cbi EECR,EEPM0 |
||||
|
||||
out EEARL, r17 ;dej adresu z r17 do EEARL |
||||
out EEDR, r16 ;dej data z r16 do EEDR |
||||
sbi EECR,EEMPE ;master program enable |
||||
sbi EECR,EEPE ;program enable |
||||
|
||||
ret |
||||
|
||||
|
||||
|
@ -0,0 +1,496 @@ |
||||
.DEVICE ATtiny13 |
||||
.LIST |
||||
.LISTMAC |
||||
;běží na 9.6MHz, ckdiv8=0 (zapnuto) |
||||
;avrdude příkaz pro FUSEs: -U lfuse:w:0x6a:m -U hfuse:w:0xff:m |
||||
;LFUSE: 0x6A |
||||
;HFUSE: 0xFF |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
|
||||
.def ARG = r20 ;registr pro předání hodnoty rutinám |
||||
|
||||
;počátek paměti SRAM pro uložení přečtené teploty (9 bajtů) |
||||
.equ SRAM_t_H = 0x00 |
||||
.equ SRAM_t_L = 0x00 |
||||
|
||||
;komunikační kanál pro ds1820 |
||||
.equ PORTn = PORTB |
||||
.equ PINn = PINB |
||||
.equ DDRn = DDRB |
||||
.equ n = 0 ;pin pro komunikaci s DS1820 |
||||
|
||||
; Č A S O V Á N Í |
||||
;délka 1 cyklu = T = 1/f |
||||
; tXXXu = [XXX / (4*T)] - 2 |
||||
; (ldi, rcall a ret zabere 8 cyklů) |
||||
; nejnižší hodnota je 1 ... 12T čekání |
||||
; attiny13@9.6MHz+CKDIV8...T=0.83333us |
||||
.equ t480u = 142 |
||||
.equ t410u = 120 |
||||
.equ t70u = 19 |
||||
.equ t64u = 17 |
||||
.equ t60u = 16 |
||||
.equ t54u = 14 |
||||
.equ t10u = 1 |
||||
|
||||
;registry pro CRC rutinu |
||||
.def rChar = r19 |
||||
.def rCount = r18 ;počet bajtů |
||||
.def rBitCount = r17 |
||||
.def rTemp = r16 |
||||
.def rCRC8 = r21 ;výsledek (musí být jiný než ARG) |
||||
|
||||
.def R = r4 |
||||
.def G = r5 |
||||
.def B = r6 |
||||
.def tL = r2 |
||||
.def tH = r3 |
||||
|
||||
;6us je obvykle moc málo pro volání DELAY |
||||
.MACRO t6uDELAY |
||||
ldi r16,2 ;pro attiny13@9.6MHz+CKDIV8 je to 2 x 4T = 8T = 8 x 0.83333us = 6us čekání |
||||
t6u: nop ;pozor! některé překladače labely v makrech nepodporují! |
||||
dec r16 |
||||
brne t6u |
||||
.ENDMACRO |
||||
|
||||
;ovládání sběrnice |
||||
.MACRO BUS_L |
||||
cbi PORTn,n |
||||
sbi DDRn,n ;pin n výstupní, výstup 0 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BUS_H |
||||
sbi PORTn,n |
||||
cbi DDRn,n ;pin n vstupní, pullup zapnutý (+ doporučeno 4.7k externí pullup) |
||||
.ENDMACRO |
||||
|
||||
.MACRO RGB_OFF |
||||
cbi PORTB,1 |
||||
cbi PORTB,2 |
||||
cbi PORTB,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO RGB_ON |
||||
sbi PORTB,1 |
||||
sbi PORTB,2 |
||||
sbi PORTB,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO PWM_CYCLE |
||||
ldi r17,@0 ;1 |
||||
PWM0: RGB_OFF ; 6 |
||||
ldi r16,40 ; 1 |
||||
PWM1: cp r16,R ; 1 |
||||
brne PWM2 ; 1/2 |
||||
sbi PORTB,1 ; 2 |
||||
PWM2: cp r16,G ; 1 |
||||
brne PWM3 ; 1/2 |
||||
sbi PORTB,2 ; 2 |
||||
PWM3: cp r16,B ; 1 |
||||
brne PWM4 ; 1/2 |
||||
sbi PORTB,3 ; 2 |
||||
PWM4: dec r16 ; 1 |
||||
brne PWM1 ; 1/2 (805)*r17+6 |
||||
dec r17 ; 1 |
||||
brne PWM0 ; 1/2 |
||||
RGB_OFF ;6 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
|
||||
; začátek kódu |
||||
.org 0x0010 |
||||
RESET: ldi r16,low(RAMEND) ;nastaví stack pointer |
||||
out SPL,r16 |
||||
|
||||
ldi r16,0b00011111 ;směr portu B - vše na výstup. Směr pinu n se bude měnit za chodu |
||||
out DDRB,r16 |
||||
ldi r16,0b00000000 ;RGB=0b000, ledka zhasnuta |
||||
out PORTB,r16 |
||||
|
||||
;tělo programu |
||||
clr R |
||||
clr G |
||||
clr B |
||||
MainLoop: |
||||
rcall GET_T ;teplota do SRAM 0x00-0x08 |
||||
|
||||
cpi ARG, 0 |
||||
brne MainLoop |
||||
|
||||
; ldi ZH, SRAM_t_H |
||||
; ldi ZL, SRAM_t_L |
||||
;NextEE: ld r16,Z |
||||
; mov r17, ZL |
||||
; rcall EEwrite |
||||
; inc ZL |
||||
; cpi ZL,2 |
||||
; brlo NextEE |
||||
|
||||
;výpočet barvy |
||||
ldi ZH,SRAM_t_H ;počátek řetězce přijatých bajtů do Z |
||||
ldi ZL,SRAM_t_L |
||||
ld tL,Z+ ;načíst teplotu z paměti |
||||
ld tH,Z |
||||
ldi r16,40 |
||||
mov R,r16 ;defaultní barva - bílá, 40 40 40 |
||||
mov G,r16 |
||||
mov B,r16 |
||||
ldi r16,0 |
||||
cpse tH,r16 ;pokud tH != 0x00, skoč na mínus |
||||
rjmp MINUS |
||||
;PLUS nebo NULA |
||||
ldi r16,41 ;tL >= 20.5? --> c20_40 |
||||
cp tL,r16 |
||||
brge c20_40 |
||||
sub B,tL |
||||
rjmp C_DONE |
||||
|
||||
c20_40: |
||||
ldi r16,81 ;tL >= 40.5? --> c40_60 |
||||
cp tL,r16 |
||||
brge c40_60 |
||||
|
||||
clr B |
||||
mov r16,tL |
||||
subi r16,40 |
||||
sub G,r16 |
||||
rjmp C_DONE |
||||
|
||||
c40_60: |
||||
ldi r16,121 ;tL >= 60.5? --> c60_hi |
||||
cp tL,r16 |
||||
brge c60_hi |
||||
clr G |
||||
clr B |
||||
mov r16,tL |
||||
subi r16,80 |
||||
add B, r16 |
||||
rjmp C_DONE |
||||
|
||||
c60_hi: |
||||
clr G |
||||
rjmp C_DONE |
||||
|
||||
MINUS: |
||||
neg tL |
||||
ldi r16,21 ;-tL >= 10.5? --> cm10_20 |
||||
cp tL,r16 |
||||
brge cm10_20 |
||||
mov r16,tL |
||||
lsl r16 |
||||
sub R,r16 |
||||
sub G,r16 |
||||
rjmp C_DONE |
||||
|
||||
cm10_20: |
||||
ldi r16,41 ;-tL >= 20? --> cm20_40 |
||||
cp tL,r16 |
||||
brge cm20_40 |
||||
clr R |
||||
mov r16,tL |
||||
subi r16,20 |
||||
lsl r16 |
||||
mov G,r16 |
||||
rjmp C_DONE |
||||
|
||||
cm20_40: |
||||
ldi r16,81 ;-tL >= 20? --> cm40_lo |
||||
cp tL,r16 |
||||
brge cm40_lo |
||||
clr R |
||||
mov r16,tL |
||||
subi r16,40 |
||||
sub B,r16 |
||||
rjmp C_DONE |
||||
|
||||
cm40_lo: |
||||
clr R |
||||
clr B |
||||
rjmp C_DONE |
||||
|
||||
C_DONE: |
||||
|
||||
; mov r16,R |
||||
; ldi r17,11 |
||||
; rcall EEwrite |
||||
; mov r16,G |
||||
; ldi r17,12 |
||||
; rcall EEwrite |
||||
; mov r16,B |
||||
; ldi r17,13 |
||||
; rcall EEwrite |
||||
|
||||
PWM_CYCLE 255 |
||||
|
||||
rjmp MainLoop |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;G E T T E M P E R A T U R E |
||||
;Přečte 9 bajtů z teplotního čidla na pinu n (PINn, PORTn, DDRn) a uloží je do SRAM na adresu 0x00 až 0x08. |
||||
;status je uložen do ARG (ARG == 0 -> CRC se shoduje, OK; ARG != 0 -> CRC se neshoduje, chyba přenosu) |
||||
; |
||||
;SRAM po vykonání procedury GET_T: |
||||
; 0x00 temperature low byte - unit: 0.5°C |
||||
; 0x01 temperature high byte (sign, 0x00 = positive, 0xff = negative) |
||||
; 0x02 "user byte 1" |
||||
; 0x03 "user byte 2" |
||||
; 0x04 reserved, 0xFF |
||||
; 0x05 reserved, 0xFF |
||||
; 0x06 count remain (default 0x0C) |
||||
; 0x07 count per °C (fixed to 0x10) |
||||
; 0x08 CRC |
||||
;celá čtecí rutina trvá obvykle asi 550ms, max je asi 750ms. Během rutiny "W4C" může být prováděno něco jiného s pevnou délkou 700ms. |
||||
GET_T: |
||||
push r17 ;ulož používané registry do STACKu |
||||
|
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0x44 ;CONVERT_T |
||||
rcall TxBYTE |
||||
rcall W4C ;čekej na konverzi teploty |
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0xBE ;READ_SCRATCHPAD |
||||
rcall TxBYTE |
||||
|
||||
;přijmout 9 bajtů, uložit na 0x00 až 0x09 v SRAM |
||||
ldi ZH, SRAM_t_H |
||||
ldi ZL, SRAM_t_L |
||||
NEXT_B: rcall RxBYTE ;přijmi 1 bajt -> ARG |
||||
|
||||
N_B3: st Z+,ARG ;do SRAM na adresu Z ulož výsledek. Z++ |
||||
cpi ZL,9 ;je Z == 9? |
||||
brlo NEXT_B ;je-li menší, čti další bajt |
||||
|
||||
;vypočítat CRC, pokud se shoduje s přečtenou hodnotou, r16=1, jinak r16=0 |
||||
ldi XH,SRAM_t_H |
||||
ldi XL,SRAM_t_L |
||||
ldi rCount,9 |
||||
rcall CRC8 |
||||
mov ARG,rCRC8 |
||||
|
||||
pop r17 |
||||
ret ;návrat, ARG==0 .. ok, ARG!=0 .. error |
||||
|
||||
|
||||
;D E L A Y |
||||
; r16 = d = poček čtyřkloků zmenšený o 2 (dva čtyřkloly se vykonají při nastavení r16 pomocí LDI (1T), RCALL (3T) a RET (4T)) |
||||
DELAY: nop |
||||
dec r16 |
||||
brne DELAY |
||||
nop |
||||
ret ; po návratu je r16 = 0 |
||||
|
||||
|
||||
|
||||
;R E S E T P U L S E |
||||
TxRESET: |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
PWM_CYCLE 1 |
||||
;ldi r16,t480u |
||||
;rcall DELAY ;480us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t70u |
||||
rcall DELAY ;70us čekání |
||||
|
||||
sbic PINn,n |
||||
rjmp TxRESET ;není-li presence pulse, zopakuj TxRESET |
||||
|
||||
;ldi r16,t410u |
||||
;rcall DELAY ;410T čekání |
||||
PWM_CYCLE 1 |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;T R A N S M I T B Y T E |
||||
; odešlou se data z ARG |
||||
TxBYTE: ldi r17,8 ;čítač bytů = 8 |
||||
;nový bit |
||||
TxNB: lsr ARG ;nový bit; rotovat ARG: ARG.0 -> C |
||||
brcs Tx1 ;jednička - skok na Tx1, jinak pokračuj |
||||
|
||||
;-- Odeslání 0 -- |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
ldi r16,t60u |
||||
rcall DELAY ;60us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
rjmp TxLOOP ;skok na konec rutiny |
||||
|
||||
;-- Odeslání 1 -- |
||||
Tx1: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t64u |
||||
rcall DELAY ;64us čekání |
||||
|
||||
TxLOOP: dec r17 ;odečti 1 od čítače bitů |
||||
brne TxNB ;zbývají bity? ano -> TxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E B Y T E |
||||
; do ARG se uloží přečtený byte |
||||
RxBYTE: ldi r17,8 ;čítač bitů |
||||
clr ARG ;vymaž ARG |
||||
;nový bit |
||||
RxNB: rcall RxBIT |
||||
|
||||
ror ARG ;rotuj ARG C[=PINB.n] -> ARG.7, ARG.0 -> C |
||||
dec r17 ;odečti 1 od čítače bitů |
||||
brne RxNB ;zbývají bity? ano -> RxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E S I N G L E B I T |
||||
RxBIT: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
sbic PINn,n ;PINB.n -> C |
||||
sec |
||||
sbis PINn,n |
||||
clc |
||||
|
||||
ldi r16,t54u |
||||
rcall DELAY ;54us čekání |
||||
ret ;návrat |
||||
|
||||
|
||||
;Č E K Á N Í N A D O K O N Č E N Í K O N V E R Z E |
||||
;čekání na dokončení konverze teploty (nelze použít v parazitním režimu, v tom je třeba čekat 700ms.) |
||||
W4C: BUS_H |
||||
;až 700ms dlouhá čekací smyčka |
||||
W4C0: ldi r18,5 |
||||
W4C1: PWM_CYCLE 200 |
||||
dec r18 |
||||
brne W4C1 |
||||
|
||||
rcall RxBIT ;přijmi bit do C. |
||||
brcc W4C0 ;C=0 -> čekej dál |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;V Ý P O Č E T C R C |
||||
;XH,XL,rCount --> rCRC8 |
||||
CRC8: push XH ;save XH |
||||
push XL ;save XL |
||||
push rChar ;save rChar |
||||
push rCount ;save rCount |
||||
push rBitCount ;save rBitCount |
||||
push rTemp ;save rTemp |
||||
|
||||
clr rCRC8 ;start with a zero CRC-8 |
||||
|
||||
;begin loop to do each byte in the string |
||||
CRC8BYT: |
||||
ld rChar,X+ ;fetch next string byte and bump pointer |
||||
ldi rBitCount,8 ;load the bit-counter for this byte |
||||
|
||||
;begin loop to do each bit in the byte |
||||
CRC8BIT: |
||||
mov rTemp,rChar ;get a temporary copy of current data |
||||
eor rTemp,rCRC8 ;XOR the data byte with the current CRC |
||||
lsr rCRC8 ;position to the new CRC |
||||
lsr rChar ;position to next bit of this byte |
||||
lsr rTemp ;get low bit of old result into c-bit |
||||
brcc CRC8NA ;br if low bit was clear (no adjustment) |
||||
ldi rTemp,$8C ;magical value needed for CRC-8s |
||||
eor rCRC8,rTemp ;fold in the magic CRC8 value |
||||
CRC8NA: |
||||
dec rBitCount ;count the previous bit done |
||||
brne CRC8BIT ;br if not done all bits in this byte |
||||
;end loop to do each bit in the byte |
||||
|
||||
dec rCount ;count this byte done |
||||
brne CRC8BYT ;br if not done all bytes in the string |
||||
;end loop to do each byte in the string |
||||
|
||||
pop rTemp ;restore rTemp |
||||
pop rBitCount ;restore rBitCount |
||||
pop rCount ;restore rCount |
||||
pop rChar ;restore rChar |
||||
pop XL ;restore XL |
||||
pop XH ;restore XH |
||||
ret ;return to caller |
||||
; |
||||
;END OF SUBROUTINE CRC8 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;cteni z EEPROM, v [r17 je ADRESA], v (r16 se objeví DATA) |
||||
;EEread: |
||||
; sbic EECR,1 |
||||
; rjmp EEread ;cekani dokud neni EEPROM ready |
||||
; |
||||
; out EEARL, r17 ;ulozit adresu z r17 |
||||
; sbi EECR,0 ;nastavenim EERE zacina cteni |
||||
; in r16,EEDR ;cteni dat z EEDR do r16 |
||||
; |
||||
; ret |
||||
|
||||
|
||||
;zapis do EEPROM, v [R17 je ADRESA], v [R16 jsou DATA] |
||||
EEwrite: |
||||
sbic EECR,EEPE |
||||
rjmp EEwrite ;cekani dokud neni EEPROM ready |
||||
|
||||
cbi EECR,EEPM1 ;nastavit programovaci mod |
||||
cbi EECR,EEPM0 |
||||
|
||||
out EEARL, r17 ;dej adresu z r17 do EEARL |
||||
out EEDR, r16 ;dej data z r16 do EEDR |
||||
sbi EECR,EEMPE ;master program enable |
||||
sbi EECR,EEPE ;program enable |
||||
|
||||
ret |
||||
|
||||
|
||||
|
@ -0,0 +1,354 @@ |
||||
.DEVICE ATtiny13 |
||||
.LIST |
||||
.LISTMAC |
||||
;běží na 9.6MHz, ckdiv8=0 (zapnuto) |
||||
;avrdude příkaz pro FUSEs: -U lfuse:w:0x6a:m -U hfuse:w:0xff:m |
||||
;LFUSE: 0x6A |
||||
;HFUSE: 0xFF |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
|
||||
.def ARG = r20 ;registr pro předání hodnoty rutinám |
||||
|
||||
;počátek paměti SRAM pro uložení přečtené teploty (9 bajtů) |
||||
.equ SRAM_t_H = 0x00 |
||||
.equ SRAM_t_L = 0x00 |
||||
|
||||
;komunikační kanál pro ds1820 |
||||
.equ PORTn = PORTB |
||||
.equ PINn = PINB |
||||
.equ DDRn = DDRB |
||||
.equ n = 0 ;pin pro komunikaci s DS1820 |
||||
|
||||
; Č A S O V Á N Í |
||||
;délka 1 cyklu = T = 1/f |
||||
; tXXXu = [XXX / (4*T)] - 2 |
||||
; (ldi, rcall a ret zabere 8 cyklů) |
||||
; nejnižší hodnota je 1 ... 12T čekání |
||||
; attiny13@9.6MHz+CKDIV8...T=0.83333us |
||||
.equ t480u = 142 |
||||
.equ t410u = 120 |
||||
.equ t70u = 19 |
||||
.equ t64u = 17 |
||||
.equ t60u = 16 |
||||
.equ t54u = 14 |
||||
.equ t10u = 1 |
||||
|
||||
;registry pro CRC rutinu |
||||
.def rChar = r19 |
||||
.def rCount = r18 ;počet bajtů |
||||
.def rBitCount = r17 |
||||
.def rTemp = r16 |
||||
.def rCRC8 = r21 ;výsledek |
||||
|
||||
;6us je obvykle moc málo pro volání DELAY |
||||
.MACRO t6uDELAY |
||||
ldi r16,2 ;pro attiny13@9.6MHz+CKDIV8 je to 2 x 4T = 8T = 8 x 0.83333us = 6us čekání |
||||
t6u: nop ;pozor! některé překladače labely v makrech nepodporují! |
||||
dec r16 |
||||
brne t6u |
||||
.ENDMACRO |
||||
|
||||
;ovládání sběrnice |
||||
.MACRO BUS_L |
||||
cbi PORTn,n |
||||
sbi DDRn,n ;pin n výstupní, výstup 0 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BUS_H |
||||
sbi PORTn,n |
||||
cbi DDRn,n ;pin n vstupní, pullup zapnutý (+ doporučeno 4.7k externí pullup) |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
|
||||
; začátek kódu |
||||
.org 0x0010 |
||||
RESET: ldi r16,low(RAMEND) ;nastaví stack pointer |
||||
out SPL,r16 |
||||
|
||||
|
||||
;tělo programu |
||||
rcall GET_T ;teplota do SRAM 0x00-0x08 |
||||
|
||||
;uložit status testu teploty z ARG do eeprom na pozici 11 (12. bajt) |
||||
mov r16,ARG |
||||
ldi r17,11 |
||||
rcall EEwrite |
||||
|
||||
;důkaz, že to funguje |
||||
;uložit SRAM SRAM_t_H:SRAM_t_L až SRAM_t_H:SRAM_t_L + 9 do EEPROM na tutéž adresu |
||||
ldi ZH, SRAM_t_H |
||||
ldi ZL, SRAM_t_L |
||||
NextEE: ld r16,Z |
||||
mov r17, ZL |
||||
rcall EEwrite |
||||
inc ZL |
||||
cpi ZL,9 |
||||
brlo NextEE |
||||
|
||||
|
||||
|
||||
;věčná smyčka |
||||
F_LOOP: rjmp F_LOOP |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;G E T T E M P E R A T U R E |
||||
;Přečte 9 bajtů z teplotního čidla na pinu n (PINn, PORTn, DDRn) a uloží je do SRAM na adresu 0x00 až 0x08. |
||||
;status je uložen do ARG (ARG == 0 -> CRC se shoduje, OK; ARG != 0 -> CRC se neshoduje, chyba přenosu) |
||||
; |
||||
;SRAM po vykonání procedury GET_T: |
||||
; 0x00 temperature low byte - unit: 0.5°C |
||||
; 0x01 temperature high byte (sign, 0x00 = positive, 0xff = negative) |
||||
; 0x02 "user byte 1" |
||||
; 0x03 "user byte 2" |
||||
; 0x04 reserved, 0xFF |
||||
; 0x05 reserved, 0xFF |
||||
; 0x06 count remain (default 0x0C) |
||||
; 0x07 count per °C (fixed to 0x10) |
||||
; 0x08 CRC |
||||
;celá čtecí rutina trvá obvykle asi 550ms, max je asi 750ms. Během rutiny "W4C" může být prováděno něco jiného s pevnou délkou 700ms. |
||||
GET_T: |
||||
push r17 ;ulož používané registry do STACKu |
||||
cli ;zakázat přerušení |
||||
|
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0x44 ;CONVERT_T |
||||
rcall TxBYTE |
||||
rcall W4C ;čekej na konverzi teploty |
||||
rcall TxRESET ;RESET |
||||
ldi ARG,0xCC ;SKIP_ROM |
||||
rcall TxBYTE |
||||
ldi ARG,0xBE ;READ_SCRATCHPAD |
||||
rcall TxBYTE |
||||
|
||||
;přijmout 9 bajtů, uložit na 0x00 až 0x09 v SRAM |
||||
ldi ZH, SRAM_t_H |
||||
ldi ZL, SRAM_t_L |
||||
NEXT_B: rcall RxBYTE ;přijmi 1 bajt -> ARG |
||||
|
||||
N_B3: st Z+,ARG ;do SRAM na adresu Z ulož výsledek. Z++ |
||||
cpi ZL,9 ;je Z == 9? |
||||
brlo NEXT_B ;je-li menší, čti další bajt |
||||
|
||||
;vypočítat CRC, pokud se shoduje s přečtenou hodnotou, r16=1, jinak r16=0 |
||||
ldi XH, SRAM_t_H ;do Z pointer na uložená data |
||||
ldi XL, SRAM_t_L |
||||
ldi rCount,9 ;9 bajtů, včetně CRC |
||||
rcall CRC8 |
||||
mov ARG,rCRC8 ;pokud je nový CRC == 0, byl přenos v pořádku. CRC --> ARG |
||||
|
||||
sei ;povolit přerušení |
||||
pop r17 |
||||
ret ;návrat, ARG==0 .. ok, ARG!=0 .. error |
||||
|
||||
|
||||
;D E L A Y |
||||
; r16 = d = poček čtyřkloků zmenšený o 2 (dva čtyřkloly se vykonají při nastavení r16 pomocí LDI (1T), RCALL (3T) a RET (4T)) |
||||
DELAY: nop |
||||
dec r16 |
||||
brne DELAY |
||||
nop |
||||
ret ; po návratu je r16 = 0 |
||||
|
||||
|
||||
|
||||
;R E S E T P U L S E |
||||
TxRESET: |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
ldi r16,t480u |
||||
rcall DELAY ;480us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t70u |
||||
rcall DELAY ;70us čekání |
||||
|
||||
sbic PINn,n |
||||
rjmp TxRESET ;není-li presence pulse, zopakuj TxRESET |
||||
|
||||
ldi r16,t410u |
||||
rcall DELAY ;410T čekání |
||||
ret ;návrat |
||||
|
||||
|
||||
;T R A N S M I T B Y T E |
||||
; odešlou se data z ARG |
||||
TxBYTE: ldi r17,8 ;čítač bytů = 8 |
||||
;nový bit |
||||
TxNB: lsr ARG ;nový bit; rotovat ARG: ARG.0 -> C |
||||
brcs Tx1 ;jednička - skok na Tx1, jinak pokračuj |
||||
|
||||
;-- Odeslání 0 -- |
||||
BUS_L ;stáhni sběrnici |
||||
|
||||
ldi r16,t60u |
||||
rcall DELAY ;60us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
rjmp TxLOOP ;skok na konec rutiny |
||||
|
||||
;-- Odeslání 1 -- |
||||
Tx1: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t64u |
||||
rcall DELAY ;64us čekání |
||||
|
||||
TxLOOP: dec r17 ;odečti 1 od čítače bitů |
||||
brne TxNB ;zbývají bity? ano -> TxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E B Y T E |
||||
; do ARG se uloží přečtený byte |
||||
RxBYTE: ldi r17,8 ;čítač bitů |
||||
clr ARG ;vymaž ARG |
||||
;nový bit |
||||
RxNB: rcall RxBIT |
||||
|
||||
ror ARG ;rotuj ARG C[=PINB.n] -> ARG.7, ARG.0 -> C |
||||
dec r17 ;odečti 1 od čítače bitů |
||||
brne RxNB ;zbývají bity? ano -> RxNB |
||||
ret ;návrat |
||||
|
||||
|
||||
;R E C E I V E S I N G L E B I T |
||||
RxBIT: BUS_L ;stáhni sběrnici |
||||
|
||||
t6uDELAY ;6us čekání |
||||
|
||||
BUS_H ;uvolni sběrnici |
||||
|
||||
ldi r16,t10u |
||||
rcall DELAY ;10us čekání |
||||
|
||||
sbic PINn,n ;PINB.n -> C |
||||
sec |
||||
sbis PINn,n |
||||
clc |
||||
|
||||
ldi r16,t54u |
||||
rcall DELAY ;54us čekání |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;Č E K Á N Í N A D O K O N Č E N Í K O N V E R Z E |
||||
;čekání na dokončení konverze teploty (nelze použít v parazitním režimu, v tom je třeba čekat 700ms.) |
||||
W4C: BUS_H |
||||
;až 700ms dlouhá čekací smyčka |
||||
W4C1: rcall RxBIT ;přijmi bit do C. |
||||
brcc W4C1 ;C=0 -> čekej dál |
||||
|
||||
ret ;návrat |
||||
|
||||
|
||||
;V Ý P O Č E T C R C |
||||
;XH,XL,rCount --> rCRC8 |
||||
CRC8: push XH ;save XH |
||||
push XL ;save XL |
||||
push rChar ;save rChar |
||||
push rCount ;save rCount |
||||
push rBitCount ;save rBitCount |
||||
push rTemp ;save rTemp |
||||
|
||||
clr rCRC8 ;start with a zero CRC-8 |
||||
|
||||
;begin loop to do each byte in the string |
||||
CRC8BYT: |
||||
ld rChar,X+ ;fetch next string byte and bump pointer |
||||
ldi rBitCount,8 ;load the bit-counter for this byte |
||||
|
||||
;begin loop to do each bit in the byte |
||||
CRC8BIT: |
||||
mov rTemp,rChar ;get a temporary copy of current data |
||||
eor rTemp,rCRC8 ;XOR the data byte with the current CRC |
||||
lsr rCRC8 ;position to the new CRC |
||||
lsr rChar ;position to next bit of this byte |
||||
lsr rTemp ;get low bit of old result into c-bit |
||||
brcc CRC8NA ;br if low bit was clear (no adjustment) |
||||
ldi rTemp,$8C ;magical value needed for CRC-8s |
||||
eor rCRC8,rTemp ;fold in the magic CRC8 value |
||||
CRC8NA: |
||||
dec rBitCount ;count the previous bit done |
||||
brne CRC8BIT ;br if not done all bits in this byte |
||||
;end loop to do each bit in the byte |
||||
|
||||
dec rCount ;count this byte done |
||||
brne CRC8BYT ;br if not done all bytes in the string |
||||
;end loop to do each byte in the string |
||||
|
||||
pop rTemp ;restore rTemp |
||||
pop rBitCount ;restore rBitCount |
||||
pop rCount ;restore rCount |
||||
pop rChar ;restore rChar |
||||
pop XL ;restore XL |
||||
pop XH ;restore XH |
||||
ret ;return to caller |
||||
; |
||||
;END OF SUBROUTINE CRC8 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;cteni z EEPROM, v [r17 je ADRESA], v (r16 se objeví DATA) |
||||
;EEread: |
||||
; sbic EECR,1 |
||||
; rjmp EEread ;cekani dokud neni EEPROM ready |
||||
; |
||||
; out EEARL, r17 ;ulozit adresu z r17 |
||||
; sbi EECR,0 ;nastavenim EERE zacina cteni |
||||
; in r16,EEDR ;cteni dat z EEDR do r16 |
||||
; |
||||
; ret |
||||
|
||||
|
||||
;zapis do EEPROM, v [R17 je ADRESA], v [R16 jsou DATA] |
||||
EEwrite: |
||||
sbic EECR,EEPE |
||||
rjmp EEwrite ;cekani dokud neni EEPROM ready |
||||
|
||||
cbi EECR,EEPM1 ;nastavit programovaci mod |
||||
cbi EECR,EEPM0 |
||||
|
||||
out EEARL, r17 ;dej adresu z r17 do EEARL |
||||
out EEDR, r16 ;dej data z r16 do EEDR |
||||
sbi EECR,EEMPE ;master program enable |
||||
sbi EECR,EEPE ;program enable |
||||
|
||||
ret |
||||
|
||||
|
||||
|
After Width: | Height: | Size: 604 KiB |
After Width: | Height: | Size: 565 KiB |
After Width: | Height: | Size: 589 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 23 KiB |
@ -0,0 +1,94 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def cnt=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b11111111 ;smer pinu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0b00000000 ;PullUpy |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
in r16, MCUCR |
||||
ori r16, (1<<PUD) |
||||
out MCUCR, r16 ;pull-ups disabled |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
rjmp LOOP |
||||
|
||||
CASOVAC: |
||||
inc i |
||||
cpi i,100 ;je i=100? ne->ceka se na dalsi interrupt |
||||
brne CASEND |
||||
clr i |
||||
inc j |
||||
cpi j,10 |
||||
brne CASEND ;je j=10 (delay=1s)? ne -> ceka se dal |
||||
clr cnt |
||||
clr i |
||||
clr j |
||||
|
||||
ldi r16,0b00000011 ;outputy |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0b00000010 ;obracene pripojeni led |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000001 ;input na PB1 |
||||
out DDRB,r16 |
||||
|
||||
cekani: in r16,PINB ;kdyz je pinb1 zapnuty dele nez 150 cyklu tak je svetlo |
||||
sbrs r16,1 |
||||
rjmp tma |
||||
inc cnt |
||||
cpi cnt, 250 |
||||
brne cekani |
||||
|
||||
ldi r16,0b00000011 ;svetlo -> zhasiname |
||||
out DDRB,r16 |
||||
ldi r16,0b00000000 ;led nesviti |
||||
out PORTB,r16 |
||||
rjmp casend |
||||
|
||||
tma: ldi r16,0b00000011 ;tma -> sekundu bude svitit |
||||
out DDRB,r16 |
||||
ldi r16,0b00000001 ;led sviti |
||||
out PORTB,r16 |
||||
|
||||
|
||||
CASEND: |
||||
reti |
||||
|
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.hex" -d "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.obj" -e "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.eep" -m "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.map" "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><ProjectName>EEPROM_nahoda</ProjectName><Created>14-Sep-2007 21:26:15</Created><LastEdit>14-Sep-2007 21:30:30</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>14-Sep-2007 21:26:15</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>EEPROM_nahoda.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm</EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATtiny13.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\</Folder><RelPath>EEPROM_nahoda.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>EEPROM_nahoda</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\EEPROM_nahoda.asm</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>EEPROM_nahoda.asm</FileName><Status>1</Status></File00000></Files><Workspace><File00000><Position>197 71 1026 566</Position><LineCol>108 0</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,108 @@ |
||||
;EEPROM_nahoda |
||||
;pokud je stisknuto tlacitko PB0, |
||||
;hrozne rychle se z EEPROM ctou hodnoty na adresach 0-3 |
||||
;a davaji se na PORTB |
||||
;Vypada to pak, jako by se pri drzeni tlacitka rozsvitily obe ledky PB1 a PB2, |
||||
;ale po pusteni tlacitka na nich zustane 'nahodna' kombinace 1 a 0. |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.def CNT=r20 |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
LDI r16,0b00000110 ;nastavi I/O nohy |
||||
OUT DDRB,r16 |
||||
|
||||
LOOP: |
||||
RCALL cekani ;zavolej cekani pro zpomaleni celeho programu |
||||
IN r16,PINB ;Porovnej stav PB0 s 1 a pokud neni rovno, jdi na LOOP |
||||
ANDI r16,0b00000001 |
||||
CPI r16,0b00000001 |
||||
BRNE LOOP |
||||
|
||||
MOV r17,CNT ;do r17 (adresovy registr) dej CNT |
||||
RCALL EEread ;zavolej cteni z EEPROM - adresa je r17, do r16 se ulozi data. |
||||
OUT PORTB,r16 ;posli data z r16 ven |
||||
|
||||
INC CNT ;inkrementuj CNT |
||||
CPI CNT,4 ;pokud je mensi nez 4, jdi na loop |
||||
BRLT LOOP |
||||
CLR CNT ;jinak vynuluj CNT |
||||
RJMP LOOP ;a jdi na LOOP |
||||
|
||||
; |
||||
;EEread je funkce pro cteni z EEPROM |
||||
;do r17 se ulozi adresa, |
||||
;zavola se EEread |
||||
;a v r16 se objevi hodnota, ktera je na adrese. |
||||
EEread: |
||||
SBIC EECR,1 |
||||
RJMP EEread ;cekani dokud neni EEPROM ready |
||||
|
||||
OUT EEARL, r17 ;ulozit adresu z r17 |
||||
SBI EECR,0 ;nastavenim EERE zacina cteni |
||||
IN r16,EEDR ;cteni dat z EEDR do r16 |
||||
|
||||
RET |
||||
;zapis do EEPROM, v R17 je ADRESA, v R16 jsou DATA |
||||
EEwrite: |
||||
SBIC EECR,EEPE |
||||
RJMP EEwrite ;cekani dokud neni EEPROM ready |
||||
|
||||
LDI r16, 0 ;nastavit programovaci mod |
||||
OUT EECR, r16 |
||||
|
||||
OUT EEARL, r17 ;dej adresu z r17 do EEARL |
||||
OUT EEDR, r16 ;dej data z r16 do EEDR |
||||
SBI EECR,EEMPE ;master program enable |
||||
SBI EECR,EEPE ;program enable |
||||
|
||||
RET |
||||
|
||||
;cekaci cyklus |
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 3 |
||||
L1: DEC r16 ;cekaci smycka vnejsi - zacatek |
||||
LDI r17, 3 |
||||
L2: DEC r17 ; cekaci smycka stredni - zacatek |
||||
LDI r18, 3 |
||||
L3: DEC r18 ; cekaci smycka vnitrni - zacatek |
||||
CPI r18, 0 |
||||
BRNE L3 ; cekaci smycka vnitrni - konec |
||||
CPI r17, 0 |
||||
BRNE L2 ; cekaci smycka stredni - konec |
||||
CPI r16, 0 |
||||
BRNE L1 ;cekaci smycka vnejsi - konec |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
.eseg ;zacatek ESEGu |
||||
.org 0x00 ;adresa 0 |
||||
.DB 0b00000000 ;tady se definujou byty postupne podle adres. |
||||
.DB 0b00000010 |
||||
.DB 0b00000100 |
||||
.DB 0b00000110 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,2 @@ |
||||
:0400000000020406F0 |
||||
:00000001FF |
@ -0,0 +1,289 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm Fri Sep 14 21:26:55 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
DEF CNT r20 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG cekani 00000030 |
||||
CSEG EEread 00000021 |
||||
CSEG EEwrite 00000027 |
||||
CSEG L1 00000034 |
||||
CSEG L2 00000036 |
||||
CSEG L3 00000038 |
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATTINY13"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm" Position="197 71 1026 566" LineCol="48 12" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,32 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATtiny13</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.hex</FILE> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.eep</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>19</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>26</LINE></LOOP> |
||||
<cekani><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>73</LINE></cekani> |
||||
<EEread><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>48</LINE></EEread> |
||||
<EEwrite><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>58</LINE></EEwrite> |
||||
<L1><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>79</LINE></L1> |
||||
<L2><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>81</LINE></L2> |
||||
<L3><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>83</LINE></L3> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.hex" -d "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.obj" -e "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.eep" -m "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.map" "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><Created>06-Sep-2007 20:57:13</Created><LastEdit>13-Sep-2007 21:45:27</LastEdit><ProjectType>0</ProjectType><Created>06-Sep-2007 20:57:13</Created><Version>4</Version><Build>4, 13, 0, 528</Build><Created>08-Sep-2007 21:57:32</Created><LastEdit>08-Sep-2007 21:57:32</LastEdit><ProjectType>0</ProjectType><Created>08-Sep-2007 21:57:32</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName><ICON>208</ICON><ProjectName>EEPROM_access</ProjectName><Created>10-Sep-2007 21:52:01</Created><LastEdit>10-Sep-2007 21:52:01</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>10-Sep-2007 21:52:01</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>EEPROM_access.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</EntryFile><ObjectFile></ObjectFile><EntryFile></EntryFile><ObjectFile></ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_PART>ATtiny13</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><CURRENT_PART>ATmega16.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND></IO_EXPAND><REGISTERNAMES></REGISTERNAMES><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATtiny13.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND></IO_EXPAND><REGISTERNAMES></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\</Folder><RelPath>EEPROM_access.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>EEPROM_access</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\EEPROM_access.asm</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>EEPROM_access.asm</FileName><Status>257</Status></File00000></Files><Workspace><File00000><Position>197 71 1026 566</Position><LineCol>100 0</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,49 @@ |
||||
;program cyklicky nacita z EEPROM adresy:0x00 hodnotu (0b00000101) a dava ji do PORTB. |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
LDI r16,0b00000111 |
||||
OUT DDRB,r16 |
||||
|
||||
LOOP: |
||||
LDI r17,0 |
||||
RCALL EEread |
||||
OUT PORTB,r16 |
||||
RJMP LOOP |
||||
|
||||
; |
||||
;EEread je funkce pro cteni z EEPROM |
||||
;do r17 se ulozi adresa, |
||||
;zavola se EEread |
||||
;a v r16 se objevi hodnota, ktera je na adrese. |
||||
EEread: |
||||
SBIC EECR,1 |
||||
RJMP EEread ;cekani dokud neni EEPROM ready |
||||
|
||||
OUT EEARL, r17 ;ulozit adresu z r17 |
||||
SBI EECR,0 ;nastavenim EERE zacina cteni |
||||
IN r16,EEDR ;cteni dat z EEDR do r16 |
||||
|
||||
RET |
||||
|
||||
|
||||
.eseg |
||||
.org 0x00 |
||||
.DB 0b00000101 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,2 @@ |
||||
:0100000005FA |
||||
:00000001FF |
@ -0,0 +1,283 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm Thu Sep 13 21:48:45 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG EEread 00000018 |
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATTINY13"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm" Position="197 71 1026 566" LineCol="28 47" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,27 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATtiny13</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.hex</FILE> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.eep</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>12</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>19</LINE></LOOP> |
||||
<EEread><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>30</LINE></EEread> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1,351 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (clock, active falling edge) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 -U lfuse:w:0xE2:m |
||||
;HFUSE: 0xDF -U hfuse:w:0xDF:m |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001101 |
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111 |
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000 |
||||
.equ LCD_CURSOR_RIGHT = 0b00010100 |
||||
.equ LCD_SHIFT_LEFT = 0b00011000 |
||||
.equ LCD_SHIFT_RIGHT = 0b00011100 |
||||
|
||||
|
||||
;5x7 font, 1-line |
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000 |
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000 |
||||
;5x7 font, 2-line |
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000 |
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
.equ ROW3_ADDR = 0x14 |
||||
.equ ROW4_ADDR = 0x54 |
||||
|
||||
|
||||
|
||||
;aliases |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "HD44780 INTERFACE" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
; == display init == |
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
; == load user-defined characters to CGRAM == (default, array label named MYCHARS, end-mark=0xFE) |
||||
ldi r17,0 |
||||
rcall CGRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYCHARS*2) |
||||
ldi ZL,low(MYCHARS*2) |
||||
CGRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq CGRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp CGRAM_loop |
||||
CGRAM_loop_end: |
||||
|
||||
|
||||
; == pgm body == |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT1*2) |
||||
ldi ZL,low(MYTEXT1*2) |
||||
DDRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop |
||||
DDRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT2*2) |
||||
ldi ZL,low(MYTEXT2*2) |
||||
DDRAM2_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM2_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM2_loop |
||||
DDRAM2_loop_end: |
||||
|
||||
;direct write to X,Y - example |
||||
ldi r16,3 ;Y, zacina 0 a roste smerem dolu |
||||
ldi r17,5 ;X, zacina nulou a roste smerem doprava |
||||
rcall LCD_CURSOR_XY |
||||
ldi r17,"%" |
||||
rcall TX_DATA |
||||
ldi r17,"%" |
||||
rcall TX_DATA |
||||
ldi r17,"%" |
||||
rcall TX_DATA |
||||
;infinite loop |
||||
loop: rjmp loop |
||||
|
||||
|
||||
MYTEXT1: |
||||
.DB 0,0,0," POKUSNY TEXT ",0,0,0,0xFE |
||||
MYTEXT2: |
||||
.DB "Opravdu pekny text!",0xFE |
||||
|
||||
|
||||
|
||||
; == USER-DEFINED CHARS == |
||||
MYCHARS: |
||||
; 5x8, first 3 bits are not used |
||||
;end of mychars |
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik |
||||
|
||||
;konec |
||||
.DB 0xFE |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=Y |
||||
;r17=X |
||||
LCD_CURSOR_XY: |
||||
cpi r16,0 |
||||
brne test1 |
||||
fail: ldi r16,ROW1_ADDR |
||||
rjmp addrdone |
||||
test1: |
||||
cpi r16,1 |
||||
brne test2 |
||||
ldi r16,ROW2_ADDR |
||||
rjmp addrdone |
||||
test2: |
||||
cpi r16,2 |
||||
brne test3 |
||||
ldi r16,ROW3_ADDR |
||||
rjmp addrdone |
||||
test3: |
||||
cpi r16,3 |
||||
brne fail |
||||
ldi r16,ROW4_ADDR |
||||
addrdone: |
||||
add r17,r16 |
||||
rcall DDRAM_SET_ADDR |
||||
ret |
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 disabled to reduce code size |
||||
;RX_DATA: |
||||
; ;input |
||||
; ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input |
||||
; out LCDDDR,r16 |
||||
; ldi r16,0b00001111 ;pullups to data pins enabled |
||||
; out LCDPORT,r16 |
||||
; |
||||
; clr r17 |
||||
; ldi r16,(1<<RW)|(1<<RS) |
||||
; out LCDPORT,r16 ;set LCD to read mode, for data |
||||
; |
||||
; rcall LCD_CLK ;receive high nibble |
||||
; in r16,LCDPIN |
||||
; andi r16,0b00001111 |
||||
; or r17,r16 |
||||
; swap r17 ;store high nibble |
||||
; |
||||
; rcall LCD_CLK ;receive low nibble |
||||
; in r16,LCDPIN |
||||
; andi r16,0b00001111 |
||||
; or r17,r16 ;store low nibble |
||||
; |
||||
; ;output |
||||
; ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4) |
||||
; out LCDDDR,r16 |
||||
; ldi r16,0b00000000 ;LCDPORT off |
||||
; out LCDPORT,r16 |
||||
; |
||||
; ;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0) |
||||
; ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E ;EXECUTE on |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E ;EXECUTE off |
||||
ldi r16,150 ;pause: 100 for 4MHZ |
||||
clkw: |
||||
dec r16 |
||||
brne clkw |
||||
ret |
||||
|
||||
;r17 |
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
@ -0,0 +1,215 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (strobe) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTB |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_BLINK = 0b00001101 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001111 |
||||
;4bit,5x7,2line |
||||
.equ LCD_MODE_4BIT = 0b00101000 |
||||
.equ LCD_MODE_8BIT = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
|
||||
|
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "DMC-50399 TEST" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_SHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,20 |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
colastart: |
||||
ldi ZH,high(ROW1*2) |
||||
ldi ZL,low(ROW1*2) |
||||
read1: lpm r17,Z+ |
||||
cpi r17,0 |
||||
breq colastart |
||||
rcall TX_DATA |
||||
ldi r16,60 |
||||
rcall delay |
||||
rjmp read1 |
||||
|
||||
loop: rjmp loop |
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,0b10000000 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,0b10000000 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E |
||||
ldi r16,100 ;100 funguje na 4MHZ |
||||
clkw1: |
||||
dec r16 |
||||
brne clkw1 |
||||
; ldi r16,1 |
||||
; rcall delay |
||||
ret |
||||
|
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
ROW1: |
||||
.DB "*** Ice cold CocaCola sold here! *** ",0 |
@ -0,0 +1,305 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (clock, active falling edge) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001101 |
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111 |
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000 |
||||
.equ LCD_CURSOR_RIGHT = 0b00010100 |
||||
.equ LCD_SHIFT_LEFT = 0b00011000 |
||||
.equ LCD_SHIFT_RIGHT = 0b00011100 |
||||
|
||||
|
||||
;5x7 font, 1-line |
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000 |
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000 |
||||
;5x7 font, 2-line |
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000 |
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
|
||||
|
||||
|
||||
;aliases |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "HD44780 INTERFACE" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
;load user-defined characters to CGRAM |
||||
ldi r17,0 |
||||
rcall CGRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYCHARS*2) |
||||
ldi ZL,low(MYCHARS*2) |
||||
CGRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq CGRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp CGRAM_loop |
||||
CGRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT1*2) |
||||
ldi ZL,low(MYTEXT1*2) |
||||
DDRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop |
||||
DDRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT2*2) |
||||
ldi ZL,low(MYTEXT2*2) |
||||
DDRAM_loop2: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop2_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop2 |
||||
DDRAM_loop2_end: |
||||
|
||||
loop: rjmp loop |
||||
|
||||
MYTEXT1: |
||||
.DB 0,3," This is GEOCACHE",0xFE |
||||
MYTEXT2: |
||||
.DB 1,2," ", 4, " geocaching.com",0xFE |
||||
|
||||
MYCHARS: |
||||
; 5x8, first 3 bits are not used |
||||
;end of mychars |
||||
.DB 0x0,0x15,0xe,0x6,0xe,0x1b,0x18 |
||||
.DB 0x18,0x1c,0xa,0x7,0x3,0x0,0x0 |
||||
.DB 0x8,0xc,0xe,0xc,0x8,0x8,0x8 ;0x8,0xe,0xf,0x4,0x4,0x2,0x0 |
||||
.DB 0x0,0x0,0x18,0x1c,0xa,0x7,0x3 |
||||
.DB 0x0,0x4,0x2,0x1f,0x2,0x4,0x0 |
||||
.DB 0xFE |
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
RX_DATA: |
||||
;input |
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00001111 ;pullups to data pins enabled |
||||
out LCDPORT,r16 |
||||
|
||||
clr r17 |
||||
ldi r16,(1<<RW)|(1<<RS) |
||||
out LCDPORT,r16 ;set LCD to read mode, for data |
||||
|
||||
rcall LCD_CLK ;receive high nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 |
||||
swap r17 ;store high nibble |
||||
|
||||
rcall LCD_CLK ;receive low nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 ;store low nibble |
||||
|
||||
;output |
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4) |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;LCDPORT off |
||||
out LCDPORT,r16 |
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0) |
||||
ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E ;EXECUTE on |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E ;EXECUTE off |
||||
ldi r16,100 ;pause: 100 for 4MHZ |
||||
clkw: |
||||
dec r16 |
||||
brne clkw |
||||
ret |
||||
|
||||
;r17 |
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
@ -0,0 +1,305 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (clock, active falling edge) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001101 |
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111 |
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000 |
||||
.equ LCD_CURSOR_RIGHT = 0b00010100 |
||||
.equ LCD_SHIFT_LEFT = 0b00011000 |
||||
.equ LCD_SHIFT_RIGHT = 0b00011100 |
||||
|
||||
|
||||
;5x7 font, 1-line |
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000 |
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000 |
||||
;5x7 font, 2-line |
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000 |
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
|
||||
|
||||
|
||||
;aliases |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "HD44780 INTERFACE" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
;load user-defined characters to CGRAM |
||||
ldi r17,0 |
||||
rcall CGRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYCHARS*2) |
||||
ldi ZL,low(MYCHARS*2) |
||||
CGRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq CGRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp CGRAM_loop |
||||
CGRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT1*2) |
||||
ldi ZL,low(MYTEXT1*2) |
||||
DDRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop |
||||
DDRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT2*2) |
||||
ldi ZL,low(MYTEXT2*2) |
||||
DDRAM_loop2: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop2_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop2 |
||||
DDRAM_loop2_end: |
||||
|
||||
loop: rjmp loop |
||||
|
||||
MYTEXT1: |
||||
.DB 0,3," This is GEOCACHE",0xFE |
||||
MYTEXT2: |
||||
.DB 1,2, 4, "geocaching.com",0xFE |
||||
|
||||
MYCHARS: |
||||
; 5x8, first 3 bits are not used |
||||
;end of mychars |
||||
.DB 0x0,0x15,0xe,0x6,0xe,0x1b,0x18 |
||||
.DB 0x18,0x1c,0xa,0x7,0x3,0x0,0x0 |
||||
.DB 0x8,0xe,0xf,0x4,0x4,0x2,0x0 |
||||
.DB 0x0,0x0,0x18,0x1c,0xa,0x7,0x3 |
||||
.DB 0x0,0x4,0x2,0x1f,0x2,0x4,0x0 |
||||
.DB 0xFE |
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
RX_DATA: |
||||
;input |
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00001111 ;pullups to data pins enabled |
||||
out LCDPORT,r16 |
||||
|
||||
clr r17 |
||||
ldi r16,(1<<RW)|(1<<RS) |
||||
out LCDPORT,r16 ;set LCD to read mode, for data |
||||
|
||||
rcall LCD_CLK ;receive high nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 |
||||
swap r17 ;store high nibble |
||||
|
||||
rcall LCD_CLK ;receive low nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 ;store low nibble |
||||
|
||||
;output |
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4) |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;LCDPORT off |
||||
out LCDPORT,r16 |
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0) |
||||
ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E ;EXECUTE on |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E ;EXECUTE off |
||||
ldi r16,100 ;pause: 100 for 4MHZ |
||||
clkw: |
||||
dec r16 |
||||
brne clkw |
||||
ret |
||||
|
||||
;r17 |
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
@ -0,0 +1,311 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (clock, active falling edge) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001101 |
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111 |
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000 |
||||
.equ LCD_CURSOR_RIGHT = 0b00010100 |
||||
.equ LCD_SHIFT_LEFT = 0b00011000 |
||||
.equ LCD_SHIFT_RIGHT = 0b00011100 |
||||
|
||||
|
||||
;5x7 font, 1-line |
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000 |
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000 |
||||
;5x7 font, 2-line |
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000 |
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
|
||||
|
||||
|
||||
;aliases |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "HD44780 INTERFACE" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
;load user-defined characters to CGRAM |
||||
ldi r17,0 |
||||
rcall CGRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYCHARS*2) |
||||
ldi ZL,low(MYCHARS*2) |
||||
CGRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq CGRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp CGRAM_loop |
||||
CGRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT1*2) |
||||
ldi ZL,low(MYTEXT1*2) |
||||
DDRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop |
||||
DDRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT2*2) |
||||
ldi ZL,low(MYTEXT2*2) |
||||
DDRAM_loop2: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop2_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop2 |
||||
DDRAM_loop2_end: |
||||
|
||||
loop: rjmp loop |
||||
|
||||
MYTEXT1: |
||||
.DB " ",0,1,1,1,1,1,2,4,4,4,4,5,6,6,6,6,6,7," ",0xFE |
||||
MYTEXT2: |
||||
.DB "Straslivy krokodyl!",0xFE |
||||
|
||||
MYCHARS: |
||||
; 5x8, first 3 bits are not used |
||||
;end of mychars |
||||
.DB 0x0,0x3,0x0,0x0,0x0,0x1,0x3 ;konec huby 0 |
||||
.DB 0x0,0x1f,0xe,0x4,0x10,0x19,0x1f ;zuby1 |
||||
.DB 0x2,0x15,0x1f,0x1f,0x1f,0x1f,0x10 ;hlava 2 |
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik 3 |
||||
.DB 0x0,0x1f,0x1f,0x1f,0x1f,0x1,0x3 ;noha4 |
||||
.DB 0x0,0x10,0x1c,0x1f,0x1f,0x0,0x0 ;do ocasu5 |
||||
.DB 0x0,0x4,0xe,0x1f,0x1f,0x0,0x0 |
||||
.DB 0x0,0x0,0x0,0x0,0x10,0x0,0x0 ;konec ocasu7 |
||||
|
||||
|
||||
|
||||
.DB 0xFE |
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
RX_DATA: |
||||
;input |
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00001111 ;pullups to data pins enabled |
||||
out LCDPORT,r16 |
||||
|
||||
clr r17 |
||||
ldi r16,(1<<RW)|(1<<RS) |
||||
out LCDPORT,r16 ;set LCD to read mode, for data |
||||
|
||||
rcall LCD_CLK ;receive high nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 |
||||
swap r17 ;store high nibble |
||||
|
||||
rcall LCD_CLK ;receive low nibble |
||||
in r16,LCDPIN |
||||
andi r16,0b00001111 |
||||
or r17,r16 ;store low nibble |
||||
|
||||
;output |
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4) |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;LCDPORT off |
||||
out LCDPORT,r16 |
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0) |
||||
ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E ;EXECUTE on |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E ;EXECUTE off |
||||
ldi r16,100 ;pause: 100 for 4MHZ |
||||
clkw: |
||||
dec r16 |
||||
brne clkw |
||||
ret |
||||
|
||||
;r17 |
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
@ -0,0 +1,228 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (strobe) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTB |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
.equ LCD_MODE_INC_NOSH = 0b00000110 |
||||
.equ LCD_MODE_INC_SH = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSH = 0b00000100 |
||||
.equ LCD_MODE_DEC_SH = 0b00000101 |
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_BLINK = 0b00001101 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001111 |
||||
;4bit,5x7,2line |
||||
.equ LCD_MODE_4BIT = 0b00101000 |
||||
.equ LCD_MODE_8BIT = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
|
||||
|
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "DMC-50399 TEST" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_DISPLAY_DISABLED |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(ROW1*2) |
||||
ldi ZL,low(ROW1*2) |
||||
read1: lpm r17,Z+ |
||||
cpi r17,0 |
||||
breq text2 |
||||
rcall TX_DATA |
||||
rjmp read1 |
||||
|
||||
text2: |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(ROW2*2) |
||||
ldi ZL,low(ROW2*2) |
||||
read2: lpm r17,Z+ |
||||
cpi r17,0 |
||||
breq loop |
||||
rcall TX_DATA |
||||
rjmp read2 |
||||
|
||||
ldi r17,LCD_DISPLAY_CURSOR |
||||
rcall TX_INSTR |
||||
|
||||
loop: rjmp loop |
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT |
||||
rcall TX_INSTR |
||||
ldi r17,LCD_MODE_INC_NOSH |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,0b10000000 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
swap r17 |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,0b10000000 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E |
||||
ldi r16,100 ;100 funguje na 4MHZ |
||||
clkw1: |
||||
dec r16 |
||||
brne clkw1 |
||||
; ldi r16,1 |
||||
; rcall delay |
||||
ret |
||||
|
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
ROW1: |
||||
.DB "ATTINY2313 & HD44780",0 |
||||
ROW2: |
||||
.DB "* www.ondrovo.com *",0 |
@ -0,0 +1,380 @@ |
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu): |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R) |
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write) |
||||
; --+ PA1 PB5 +-- E (clock, active falling edge) |
||||
; --+ PA0 PB4 +-- |
||||
; --+ PD2 PB3 +-- DATA 7 |
||||
; --+ PD3 PB2 +-- DATA 6 |
||||
; --+ PD4 PB1 +-- DATA 5 |
||||
; --+ PD5 PB0 +-- DATA 4 |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
;DMC-50399: |
||||
; 1 - GND |
||||
; 2 - +5V |
||||
; 3 - 0V (lcd driver) |
||||
; 4 - RS |
||||
; 5 - R/W |
||||
; 6 - E |
||||
; 7 - DATA 0 |
||||
; 8 - DATA 1 |
||||
;... |
||||
;14 - DATA 7 |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
;250x16=1ms=1000us |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U |
||||
.equ LCDPORT = PORTB |
||||
.equ LCDPIN = PINB |
||||
.equ LCDDDR = DDRB |
||||
|
||||
.equ RS = 7 |
||||
.equ RW = 6 |
||||
.equ E = 5 |
||||
|
||||
.equ LCD_CLEAR = 0b00000001 |
||||
.equ LCD_HOME = 0b00000010 |
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110 |
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111 |
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100 |
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101 |
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000 |
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100 |
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110 |
||||
.equ LCD_DISPLAY_ALTER = 0b00001101 |
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111 |
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000 |
||||
.equ LCD_CURSOR_RIGHT = 0b00010100 |
||||
.equ LCD_SHIFT_LEFT = 0b00011000 |
||||
.equ LCD_SHIFT_RIGHT = 0b00011100 |
||||
|
||||
|
||||
;5x7 font, 1-line |
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000 |
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000 |
||||
;5x7 font, 2-line |
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000 |
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000 |
||||
|
||||
.equ ROW1_ADDR = 0x00 |
||||
.equ ROW2_ADDR = 0x40 |
||||
.equ ROW3_ADDR = 0x14 |
||||
.equ ROW4_ADDR = 0x54 |
||||
|
||||
|
||||
|
||||
;aliases |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "HD44780 INTERFACE" ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
;PORTB = LCDPORT |
||||
ldi r16,0b11111111 ;smer portu B |
||||
out LCDDDR,r16 |
||||
ldi r16,0b00000000 ;vypnout B |
||||
out LCDPORT,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
rcall LCD_INIT |
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT |
||||
rcall TX_INSTR |
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR |
||||
rcall TX_INSTR |
||||
|
||||
;load user-defined characters to CGRAM |
||||
ldi r17,0 |
||||
rcall CGRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYCHARS*2) |
||||
ldi ZL,low(MYCHARS*2) |
||||
CGRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq CGRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp CGRAM_loop |
||||
CGRAM_loop_end: |
||||
|
||||
|
||||
|
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW1_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT1*2) |
||||
ldi ZL,low(MYTEXT1*2) |
||||
DDRAM_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM_loop |
||||
DDRAM_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW2_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT2*2) |
||||
ldi ZL,low(MYTEXT2*2) |
||||
DDRAM2_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM2_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM2_loop |
||||
DDRAM2_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW3_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT3*2) |
||||
ldi ZL,low(MYTEXT3*2) |
||||
DDRAM3_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM3_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM3_loop |
||||
DDRAM3_loop_end: |
||||
|
||||
;load text to DDRAM |
||||
ldi r17,ROW4_ADDR |
||||
rcall DDRAM_SET_ADDR |
||||
|
||||
ldi ZH,high(MYTEXT4*2) |
||||
ldi ZL,low(MYTEXT4*2) |
||||
DDRAM4_loop: |
||||
lpm r17,Z+ |
||||
cpi r17,0xFE |
||||
breq DDRAM4_loop_end |
||||
rcall TX_DATA |
||||
rjmp DDRAM4_loop |
||||
DDRAM4_loop_end: |
||||
|
||||
ldi r16,2 ;Y (0,1,2,3) |
||||
ldi r17,7 ;X (0,1,2,...19,20,....) |
||||
rcall LCD_CURSOR_XY |
||||
ldi r17,255 |
||||
rcall TX_DATA |
||||
|
||||
loop: rjmp loop |
||||
|
||||
MYTEXT1: |
||||
.DB 0,"PRVNI RADEK=======*",0xFE |
||||
MYTEXT2: |
||||
.DB 0,0,"DRUHY RADEK======*",0xFE |
||||
MYTEXT3: |
||||
.DB 0,0,0,"TRETI RADEK=====*",0xFE |
||||
MYTEXT4: |
||||
.DB 0,0,0,0,"CTVRTY RADEK===*",0xFE |
||||
|
||||
MYCHARS: |
||||
; 5x8, first 3 bits are not used |
||||
;end of mychars |
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik |
||||
|
||||
;konec |
||||
.DB 0xFE |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca) |
||||
delay: |
||||
push r17 ;2 |
||||
push r18 ;2 |
||||
d1: |
||||
ldi r17,250 ;1 |
||||
d2: |
||||
ldi r18,14 ;1 |
||||
d3: |
||||
dec r18 ;1 |
||||
nop |
||||
brne d3 ;2 (1 |
||||
dec r17 ; +1) |
||||
brne d2 ;2 (1 |
||||
dec r16 ; +1) |
||||
brne d1 ;2 (1) |
||||
|
||||
pop r18 ;2 |
||||
pop r17 ;2 |
||||
ret |
||||
|
||||
;r16=Y |
||||
;r17=X |
||||
LCD_CURSOR_XY: |
||||
cpi r16,0 |
||||
brne test1 |
||||
fail: ldi r16,ROW1_ADDR |
||||
rjmp addrdone |
||||
test1: |
||||
cpi r16,1 |
||||
brne test2 |
||||
ldi r16,ROW2_ADDR |
||||
rjmp addrdone |
||||
test2: |
||||
cpi r16,2 |
||||
brne test3 |
||||
ldi r16,ROW3_ADDR |
||||
rjmp addrdone |
||||
test3: |
||||
cpi r16,3 |
||||
brne fail |
||||
ldi r16,ROW4_ADDR |
||||
addrdone: |
||||
add r17,r16 |
||||
rcall DDRAM_SET_ADDR |
||||
ret |
||||
|
||||
LCD_INIT: |
||||
ldi r16,16 |
||||
rcall delay |
||||
ldi r16,0b00000010 ;4bit |
||||
out PORTB,r16 |
||||
rcall LCD_CLK |
||||
ldi r16,5 |
||||
rcall delay |
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
TX_INSTR: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
TX_DATA: |
||||
swap r17 ;send high nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
swap r17 ;send low nibble |
||||
mov r16,r17 |
||||
andi r16,0b00001111 |
||||
sbr r16,(1<<RS) |
||||
out LCDPORT,r16 |
||||
rcall LCD_CLK |
||||
|
||||
ret |
||||
|
||||
;r17 |
||||
;RX_DATA: |
||||
; ;input |
||||
; ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input |
||||
; out LCDDDR,r16 |
||||
; ldi r16,0b00001111 ;pullups to data pins enabled |
||||
; out LCDPORT,r16 |
||||
; |
||||
; clr r17 |
||||
; ldi r16,(1<<RW)|(1<<RS) |
||||
; out LCDPORT,r16 ;set LCD to read mode, for data |
||||
; |
||||
; rcall LCD_CLK ;receive high nibble |
||||
; in r16,LCDPIN |
||||
; andi r16,0b00001111 |
||||
; or r17,r16 |
||||
; swap r17 ;store high nibble |
||||
; |
||||
; rcall LCD_CLK ;receive low nibble |
||||
; in r16,LCDPIN |
||||
; andi r16,0b00001111 |
||||
; or r17,r16 ;store low nibble |
||||
; |
||||
; ;output |
||||
; ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4) |
||||
; out LCDDDR,r16 |
||||
; ldi r16,0b00000000 ;LCDPORT off |
||||
; out LCDPORT,r16 |
||||
; |
||||
; ;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0) |
||||
; ret |
||||
|
||||
LCD_CLK: |
||||
sbi LCDPORT,E ;EXECUTE on |
||||
nop |
||||
nop |
||||
nop |
||||
cbi LCDPORT,E ;EXECUTE off |
||||
ldi r16,150 ;pause: 100 for 4MHZ |
||||
clkw: |
||||
dec r16 |
||||
brne clkw |
||||
ret |
||||
|
||||
;r17 |
||||
;7 bitu (1.radek zacina 00,druhej 40) |
||||
DDRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b10000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
||||
|
||||
;r17 |
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora) |
||||
CGRAM_SET_ADDR: |
||||
clr r16 |
||||
sbr r16,0b01000000 |
||||
or r17,r16 |
||||
rcall TX_INSTR |
||||
ret |
@ -0,0 +1,89 @@ |
||||
.device attiny13 |
||||
.def cnt=r22 |
||||
.def i=r18 |
||||
.def j=r19 |
||||
.def pom=r16 |
||||
.def dat=r20 |
||||
.equ clks=200 ;100 kloknuti (36kHz) na 1 bit (200 preklopeni) |
||||
.equ clksh=100 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazeme preruseni |
||||
|
||||
ldi r16,0b00011110 ;smer portu |
||||
out DDRB,r16 |
||||
|
||||
clr pom |
||||
clr i |
||||
clr j |
||||
clr cnt |
||||
|
||||
sei ;povolime preruseni |
||||
|
||||
NIC: clr i |
||||
clr dat |
||||
W0: in pom,PINB ;1 [10+56 =66 cyklu *clksh celkani] |
||||
sbrc pom,0 ;2 / |
||||
rjmp NIC ;(1) |
||||
rcall sclk ;3 |
||||
inc i ;1 |
||||
cpi i,clksh ;1 |
||||
brne W0 ;2 10 kloku + 56 kloku z sclk = 66 kloku |
||||
;bylo 100 kloku 0 |
||||
|
||||
|
||||
ldi j,8 ;1 -> bude se cist osm bitu |
||||
BREAD: dec j ;1 |
||||
breq ENDB ;1 |
||||
clr i ;1 |
||||
|
||||
W1: nop ;1 -> cekaci smycka 1klok |
||||
nop ;1 |
||||
nop ;1 |
||||
rcall sclk ;3 |
||||
inc i ;1 |
||||
cpi i,clks ;1 |
||||
brne W1 ;2 |
||||
|
||||
in pom,PINB ;1 zanedbatelne zpozdeni - netreba zohlednovat |
||||
sbrs pom,0 ;2 (1) precte se PINB0 a invertovany se zapise do bufferu |
||||
sbr dat,0 ;(+1) |
||||
lsl dat ;1 |
||||
rjmp BREAD ;2 |
||||
|
||||
ENDB: |
||||
;skoncil byte, ted bude stopbit - netreba cist |
||||
cpi dat,0b00111100 |
||||
breq toogle |
||||
clr dat |
||||
clr cnt |
||||
clr i |
||||
clr j |
||||
rjmp NIC |
||||
|
||||
toogle: sbi PORTB,1 |
||||
;sbi pinb,1 |
||||
rjmp NIC |
||||
|
||||
sclk: ;presne nastavena doba jednoho kloku - 200 kloku == 1bit |
||||
ldi r16,6 ;1 |
||||
cB: |
||||
nop ; [48 |
||||
nop ; - |
||||
nop ; - |
||||
nop ; - |
||||
nop ; - |
||||
dec r16 ; - |
||||
brne cB ; - |
||||
nop ; ] |
||||
nop ;3 |
||||
nop ; |
||||
nop ; |
||||
ret ;4 celkem: 56 |
@ -0,0 +1,66 @@ |
||||
;tohle ceka az bude na PB0 dlouho jednicka a pak invertuje PB1 a ceka na nulu na PB0 |
||||
.device attiny13 |
||||
.def cnt=r19 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011110 ;smer portu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 |
||||
out PORTB,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr cnt |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: ;cekam na 0 |
||||
in r16,PINB |
||||
sbrs r16,0 |
||||
rjmp pinset |
||||
rjmp LOOP |
||||
pinset: ;cekej, az bude hodne cyklu po sobe 0 na PB0 |
||||
clr cnt |
||||
pinset2: |
||||
clr r20 |
||||
pinset2b: |
||||
clr r21 |
||||
pinset2c: |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp loop |
||||
inc r21 |
||||
cpi r21,2 |
||||
brne pinset2c |
||||
inc r20 |
||||
cpi r20,255 |
||||
brne pinset2b |
||||
inc cnt |
||||
cpi cnt,255 |
||||
brne pinset2 |
||||
|
||||
sbi PINB,1 ;invertuj to co je na PB1 |
||||
|
||||
odrus0: ;cekam na 1 |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp w2 |
||||
rjmp odrus0 |
||||
|
||||
w2: ;cekani pro odruseni zakmitu |
||||
inc cnt |
||||
cpi cnt,255 |
||||
brne w2 |
||||
|
||||
rjmp LOOP ;skok na loop |
@ -0,0 +1,63 @@ |
||||
;tohle ceka az bude na PB0 dlouho jednicka a pak invertuje PB1 a ceka na nulu na PB0 |
||||
.device attiny13 |
||||
.def cnt=r19 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011110 ;smer portu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 |
||||
out PORTB,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr cnt |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: ;cekam na nulu |
||||
in r16,PINB |
||||
sbrs r16,0 |
||||
rjmp pinset |
||||
rjmp LOOP |
||||
pinset: ;cekej, az bude hodne cyklu po sobe 0 na PB0 |
||||
clr cnt |
||||
pinset2: |
||||
clr r20 |
||||
pinset2b: |
||||
inc r20 |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp loop |
||||
cpi r20,255 |
||||
brne pinset2b |
||||
inc cnt |
||||
cpi cnt,255 |
||||
brne pinset2 |
||||
|
||||
sbi PORTB,1 ;zapni pb1 |
||||
|
||||
odrus0: ;cekam na 1 |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp w2 |
||||
rjmp odrus0 |
||||
|
||||
w2: ;cekani pro odruseni zakmitu |
||||
inc cnt |
||||
cpi cnt,255 |
||||
brne w2 |
||||
|
||||
cbi PORTB,1 |
||||
|
||||
rjmp LOOP ;skok na loop |
@ -0,0 +1,252 @@ |
||||
.device attiny13 |
||||
.def a=r16 |
||||
.def b=r17 |
||||
.def i=r18 |
||||
.def j=r19 |
||||
.def k=r20 |
||||
.def secs=r21 |
||||
.DEF mins=r22 |
||||
|
||||
;běží na 4.8MHz |
||||
|
||||
.MACRO cvrk1 |
||||
sbi portb,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO cvrk0 |
||||
cbi portb,3 |
||||
.ENDMACRO |
||||
|
||||
.MACRO osc1 |
||||
in a, TIMSK0 |
||||
ORI a, 0b00000100 |
||||
out timsk0,a |
||||
.ENDMACRO |
||||
|
||||
.MACRO osc0 |
||||
clr a |
||||
out timsk0,a |
||||
.ENDMACRO |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP TIMER |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi a,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,a |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi a,0b00001000 ;smer portu |
||||
out DDRB,a |
||||
|
||||
ldi a,0 ;vymazat port |
||||
out PORTB,a |
||||
|
||||
clr a |
||||
clr b |
||||
clr i |
||||
clr j |
||||
clr k |
||||
clr secs |
||||
clr mins |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
osc0 ;zakazeme interrupt |
||||
|
||||
in a,MCUCR ;zapne se vnitrni pullup |
||||
ori a,0b01000000 |
||||
out MCUCR,a |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
in a,PINB |
||||
andi a,0b00000111 |
||||
|
||||
;volba programu podle nastaveni prepinacu |
||||
cpi a,0 |
||||
breq prog0 |
||||
cpi a,1 |
||||
breq prog1 |
||||
cpi a,2 |
||||
breq prog2 |
||||
cpi a,3 |
||||
breq prog3 |
||||
cpi a,4 |
||||
breq prog4 |
||||
cpi a,5 |
||||
breq prog5 |
||||
cpi a,6 |
||||
breq prog6 |
||||
rjmp prog7 |
||||
|
||||
|
||||
prog0: ;5 min, (3 cvrky / 1 min pauza) x5, sleep |
||||
ldi mins,5 ;pauza úvod |
||||
rcall minuty |
||||
ldi k,5 ;počet opakování |
||||
pd00: |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi mins,1 ;minuty pauza |
||||
rcall minuty |
||||
dec k |
||||
brne pd00 |
||||
|
||||
rjmp usni |
||||
|
||||
|
||||
prog1: ;2 min, (2 cvrk / 2 min pauza) x5, sleep |
||||
ldi mins,2 ;pauza úvod |
||||
rcall minuty |
||||
|
||||
ldi k,6 ;počet opakování |
||||
pd01: |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi mins,2 ;minuty pauza |
||||
rcall minuty |
||||
dec k |
||||
brne pd01 |
||||
|
||||
rjmp usni |
||||
|
||||
|
||||
prog2: ;40 min, (2 cvrky / 20 sec pauza) x13, sleep |
||||
ldi mins,40 ;pauza úvod |
||||
rcall minuty |
||||
|
||||
ldi k,13 ;počet opakování |
||||
pd02: |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi secs,20 ;sekundy pauza |
||||
rcall sekundy |
||||
dec k |
||||
brne pd02 |
||||
|
||||
rjmp usni |
||||
|
||||
prog3: ;5 min, (2 cvrk / 5 min pauza) x8, sleep |
||||
ldi mins,5 ;pauza úvod |
||||
rcall minuty |
||||
|
||||
ldi k,9 ;počet opakování |
||||
pd03: |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi mins,5 ;minuty pauza |
||||
rcall minuty |
||||
dec k |
||||
brne pd03 |
||||
|
||||
rjmp usni |
||||
|
||||
prog4: ;10 min, (4 cvrk / 10 min pauza) x5, sleep |
||||
ldi mins,10 ;pauza úvod |
||||
rcall minuty |
||||
|
||||
ldi k,5 ;počet opakování |
||||
pd04: |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi mins,10 ;minuty pauza |
||||
rcall minuty |
||||
dec k |
||||
brne pd04 |
||||
|
||||
rjmp usni |
||||
|
||||
prog5: ;20 min, (4 cvrk / 10 min pauza) x1, sleep |
||||
ldi mins,20 ;pauza úvod |
||||
rcall minuty |
||||
|
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
rcall scvrk |
||||
|
||||
rjmp usni |
||||
|
||||
prog6: ;0, (2 cvrk / 10s) x inf |
||||
rcall scvrk |
||||
rcall scvrk |
||||
ldi secs,10 ;minuty pauza |
||||
rcall sekundy |
||||
rjmp prog6 |
||||
|
||||
prog7: ;trvale |
||||
cvrk1 |
||||
infloop: |
||||
rjmp infloop |
||||
|
||||
usni: |
||||
in a,MCUCR |
||||
ori a,0b00110000 |
||||
andi a,0b01110111 |
||||
out MCUCR,a |
||||
sleep |
||||
rjmp usni ;kdyby se probudil tak zase usne |
||||
|
||||
TIMER: ;pracuje se s prerusenim 1000x za sekundu |
||||
inc i |
||||
cpi i,100 |
||||
brne endcas |
||||
clr i |
||||
inc j |
||||
endcas: |
||||
reti |
||||
|
||||
scvrk: |
||||
clr i |
||||
clr j |
||||
cvrk1 |
||||
osc1 |
||||
del01: cpi j,20 ;konstanta pro dobu jednoho cvrku v desetinach sekundy |
||||
brne del01 |
||||
osc0 |
||||
cvrk0 |
||||
ret |
||||
|
||||
sekundy: |
||||
clr i |
||||
clr j |
||||
osc1 |
||||
del02: cpi j,10 ;konstanta pro dobu 1 sekundy |
||||
brne del02 |
||||
dec secs |
||||
breq endsecs |
||||
clr i |
||||
clr j |
||||
rjmp del02 |
||||
endsecs: |
||||
osc0 |
||||
ret |
||||
|
||||
minuty: |
||||
ldi secs,60 ;minuta ma 60 sekund -> secs=60 |
||||
rcall sekundy ;a vykoname cekani secs sekund |
||||
dec mins |
||||
breq endmins |
||||
rjmp minuty |
||||
endmins: |
||||
ret |
||||
|
||||
|
@ -0,0 +1,124 @@ |
||||
.device attiny13 |
||||
.def cnt=r19 |
||||
.equ clks=200 ;100 kloknuti (36kHz) na 1 bit (200 preklopeni) |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011110 ;smer portu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr cnt |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp pinset |
||||
rjmp LOOP |
||||
pinset: ;cekej, az bude 200 cyklu po sobe 1 na PB0 |
||||
clr cnt |
||||
pinset2: |
||||
in r16,PINB |
||||
sbrs r16,0 |
||||
rjmp loop |
||||
inc cnt |
||||
cpi cnt,200 |
||||
brne pinset2 |
||||
|
||||
rcall blik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall blik |
||||
rcall blik |
||||
rcall blik |
||||
rcall blik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall blik |
||||
|
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
rcall nblik |
||||
|
||||
pinset0: ;cekej, az bude 200 cyklu po sobe 0 na PB0 |
||||
;clr cnt |
||||
pinset3: |
||||
;in r16,PINB |
||||
;sbrc r16,0 |
||||
;rjmp pinset0 |
||||
;inc cnt |
||||
;cpi cnt,200 |
||||
;brne pinset3 |
||||
|
||||
rjmp LOOP ;skok na loop |
||||
|
||||
blik: |
||||
ldi r17,clks |
||||
A: |
||||
ldi r16,7 ;1 |
||||
B: |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
dec r16 ;1 |
||||
brne B ;2 (1 + |
||||
nop ;1) |
||||
sbi PINB,1 ;2 -> toogle portb1 |
||||
nop ;1 |
||||
nop ;1 |
||||
dec r17 ;1 |
||||
breq endblik ;1 (2 -> preruseno, nedulezite) |
||||
rjmp A ;2 |
||||
endblik: |
||||
cbi PORTB,1 ;2 |
||||
ret ;4 |
||||
|
||||
nblik: |
||||
ldi r17,clks |
||||
nA: |
||||
ldi r16,7 ;1 |
||||
|
||||
nB: |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
dec r16 ;1 |
||||
brne nB ;2 (1 + |
||||
nop ;1) |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
dec r17 ;1 |
||||
breq endnblik ;1 (2 -> preruseno, nedulezite) |
||||
rjmp nA ;2 |
||||
endnblik: |
||||
cbi PORTB,1 ;2 |
||||
ret ;4 |
||||
|
||||
|
@ -0,0 +1,70 @@ |
||||
.device attiny13 |
||||
.def cnt=r19 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011110 ;smer portu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr cnt |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
in r16,PINB |
||||
sbrc r16,0 |
||||
rjmp pinset |
||||
rjmp LOOP |
||||
pinset: ;cekej, az bude 100 cyklu po sobe 1 na PB0 |
||||
clr cnt |
||||
pinset2: |
||||
in r16,PINB |
||||
sbrs r16,0 |
||||
rjmp loop |
||||
inc cnt |
||||
cpi cnt,200 |
||||
brne pinset2 |
||||
|
||||
rcall blik |
||||
|
||||
w2: ;cekani pro odruseni zakmitu - 40 cyklu |
||||
inc cnt |
||||
cpi cnt,200 |
||||
brne w2 |
||||
|
||||
rjmp LOOP ;skok na loop |
||||
|
||||
blik: |
||||
A: |
||||
ldi r16,7 ;1 |
||||
B: |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
nop ;1 |
||||
dec r16 ;1 |
||||
brne B ;2 (1 + |
||||
nop ;1) |
||||
sbi PINB,1 ;2 -> toogle portb1 |
||||
nop ;1 |
||||
nop ;1 |
||||
in r17,pinb ;1 |
||||
sbrc r17,0 ;1 (2 -> preruseno, nedulezite) |
||||
rjmp A ;2 |
||||
cbi PORTB,1 ;2 |
||||
ret ;4 |
@ -0,0 +1,131 @@ |
||||
;Kostka pro attiny13 |
||||
;sestupna hrana impulzu na PB0 spousti kostku, vzestupna hrana spousti zpomalovani |
||||
;kostka se zastavi na nahodnem cisle. |
||||
;segmenty: |
||||
|
||||
; PB2 PB3 |
||||
; PB4 PB1 PB4 |
||||
; PB3 PB2 |
||||
|
||||
; diody na spolecne noze maji kazda svuj odpor. muze byt pole odporu |
||||
|
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def top=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
.def faze=r23 ;faze kostky. jsou zde cisla 0-5 |
||||
.def plus=r24 ;prirustek v dobe cekani na timer overflow - vzdy se inkrementuje |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b11111110 ;smer pinu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,1 ;PullUpy |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
ldi top,2 |
||||
ldi faze,0 |
||||
ldi plus,1 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
in r16,PINB ;kontrola jestli je PINB0 vypnutej (stisknuto) |
||||
andi r16, 1 |
||||
sbrc r16, 0 |
||||
rjmp LOOP ;NE -> jdi na loop |
||||
ldi top,1 ;ANO -> nastavit top na 1 a vymazat citace |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
CEKANI: |
||||
ldi top,3 ;cekame na uvolneni, zatim se prepina s top=2 |
||||
ldi plus,1 |
||||
in r16,PINB ;kontrola jestli je PINB0 zapnutej (pusteny tlacitko) |
||||
andi r16, 1 |
||||
sbrs r16, 0 |
||||
rjmp CEKANI |
||||
ldi top,1 |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
cpi top,50 ;porovnam top s 50, kdyz vetsi nebo rovno |
||||
brge CASEND ;tak se dal nepocita - preskok na konec |
||||
inc i ;i++ |
||||
cpi i,8 ;je i == 8 ? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
clr i ;i=0 |
||||
inc j ;j++ |
||||
cp j,top ;je j == top? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
add top,plus ;k top prictu plus |
||||
inc plus ;a plus zvysim o 1 |
||||
clr i ;vymazu pomocne |
||||
clr j |
||||
inc faze ;dalsi faze kostky |
||||
cpi faze,6 ;je faze 6? |
||||
brne VYBER ; neni -> skok na VYBER |
||||
ldi faze,0 ; je -> nuluju fazi |
||||
VYBER: cpi faze,0 ;podminene se vybere, co se ma zobrazit |
||||
breq F0 |
||||
cpi faze,1 |
||||
breq F1 |
||||
cpi faze,2 |
||||
breq F2 |
||||
cpi faze,3 |
||||
breq F3 |
||||
cpi faze,4 |
||||
breq F4 |
||||
cpi faze,5 |
||||
breq F5 |
||||
|
||||
F0: ldi r16,0b00000011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F1: ldi r16,0b00000101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F2: ldi r16,0b00001011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F3: ldi r16,0b00001101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F4: ldi r16,0b00001111 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F5: ldi r16,0b00011101 |
||||
out PORTB,r16 |
||||
CASEND: ;navrat z preruseni |
||||
reti |
||||
|
@ -0,0 +1,146 @@ |
||||
;Kostka pro attiny13 |
||||
;sestupna hrana impulzu na PB0 spousti kostku, vzestupna hrana spousti zpomalovani |
||||
;kostka se zastavi na nahodnem cisle. |
||||
;segmenty: |
||||
|
||||
; PB2 PB3 |
||||
; PB4 PB1 PB4 |
||||
; PB3 PB2 |
||||
|
||||
; diody na spolecne noze maji kazda svuj odpor. muze byt pole odporu |
||||
|
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def top=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
.def faze=r23 ;faze kostky. jsou zde cisla 0-5 |
||||
.def plus=r24 ;prirustek v dobe cekani na timer overflow - vzdy se inkrementuje |
||||
.def fx=r25 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b11111110 ;smer pinu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,1 ;PullUpy |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
ldi top,2 |
||||
ldi fx,5 |
||||
ldi faze,0 |
||||
ldi plus,1 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
inc fx |
||||
cpi fx,6 |
||||
brne fxok |
||||
ldi fx, 0 |
||||
fxok: |
||||
in r16,PINB ;kontrola jestli je PINB0 vypnutej (stisknuto) |
||||
andi r16, 1 |
||||
sbrc r16, 0 |
||||
rjmp LOOP ;NE -> jdi na loop |
||||
mov faze, fx |
||||
ldi top,1 ;ANO -> nastavit top na 1 a vymazat citace |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
CEKANI: |
||||
ldi top,2 ;cekame na uvolneni, zatim se prepina s top=2 |
||||
ldi plus,1 |
||||
|
||||
inc fx |
||||
cpi fx,6 |
||||
brne fxok2 |
||||
ldi fx, 0 |
||||
fxok2: |
||||
in r16,PINB ;kontrola jestli je PINB0 zapnutej (pusteny tlacitko) |
||||
andi r16, 1 |
||||
sbrs r16, 0 |
||||
rjmp CEKANI |
||||
mov faze, fx |
||||
ldi top,1 |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
cpi top,50 ;porovnam top s 50, kdyz vetsi nebo rovno |
||||
brge CASEND ;tak se dal nepocita - preskok na konec |
||||
inc i ;i++ |
||||
cpi i,8 ;je i == 8 ? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
clr i ;i=0 |
||||
inc j ;j++ |
||||
cp j,top ;je j == top? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
add top,plus ;k top prictu plus |
||||
inc plus ;a plus zvysim o 1 |
||||
clr i ;vymazu pomocne |
||||
clr j |
||||
inc faze ;dalsi faze kostky |
||||
cpi faze,6 ;je faze 6? |
||||
brne VYBER ; neni -> skok na VYBER |
||||
ldi faze,0 ; je -> nuluju fazi |
||||
VYBER: cpi faze,0 ;podminene se vybere, co se ma zobrazit |
||||
breq F0 |
||||
cpi faze,1 |
||||
breq F1 |
||||
cpi faze,2 |
||||
breq F2 |
||||
cpi faze,3 |
||||
breq F3 |
||||
cpi faze,4 |
||||
breq F4 |
||||
cpi faze,5 |
||||
breq F5 |
||||
|
||||
F0: ldi r16,0b00000011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F1: ldi r16,0b00000101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F2: ldi r16,0b00001011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F3: ldi r16,0b00001101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F4: ldi r16,0b00001111 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F5: ldi r16,0b00011101 |
||||
out PORTB,r16 |
||||
CASEND: ;navrat z preruseni |
||||
reti |
||||
|
@ -0,0 +1,150 @@ |
||||
;Kostka pro attiny13 |
||||
;sestupna hrana impulzu na PB0 spousti kostku, vzestupna hrana spousti zpomalovani |
||||
;kostka se zastavi na nahodnem cisle. |
||||
;segmenty: |
||||
|
||||
; PB2 PB3 |
||||
; PB4 PB1 PB4 |
||||
; PB3 PB2 |
||||
|
||||
; diody na spolecne noze maji kazda svuj odpor. muze byt pole odporu |
||||
|
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def top=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
.def faze=r23 ;faze kostky. jsou zde cisla 0-5 |
||||
.def plus=r24 ;prirustek v dobe cekani na timer overflow - vzdy se inkrementuje |
||||
.def fx=r25 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b11111110 ;smer pinu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,1 ;PullUpy |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
ldi top,2 |
||||
ldi fx,5 |
||||
ldi faze,0 |
||||
ldi plus,1 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
inc fx |
||||
cpi fx,6 |
||||
brne fxok |
||||
ldi fx, 0 |
||||
fxok: |
||||
in r16,PINB ;kontrola jestli je PINB0 vypnutej (stisknuto) |
||||
andi r16, 1 |
||||
sbrc r16, 0 |
||||
rjmp LOOP ;NE -> jdi na loop |
||||
mov faze, fx |
||||
cli |
||||
ldi top,1 ;ANO -> nastavit top na 1 a vymazat citace |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
sei |
||||
CEKANI: |
||||
ldi top,2 ;cekame na uvolneni, zatim se prepina s top=2 |
||||
ldi plus,1 |
||||
|
||||
inc fx |
||||
cpi fx,6 |
||||
brne fxok2 |
||||
ldi fx, 0 |
||||
fxok2: |
||||
in r16,PINB ;kontrola jestli je PINB0 zapnutej (pusteny tlacitko) |
||||
andi r16, 1 |
||||
sbrs r16, 0 |
||||
rjmp CEKANI |
||||
cli |
||||
mov faze, fx |
||||
ldi top,1 |
||||
ldi plus,1 |
||||
clr i |
||||
clr j |
||||
sei |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
cpi top,50 ;porovnam top s 50, kdyz vetsi nebo rovno |
||||
brge CASEND ;tak se dal nepocita - preskok na konec |
||||
inc i ;i++ |
||||
cpi i,8 ;je i == 8 ? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
clr i ;i=0 |
||||
inc j ;j++ |
||||
cp j,top ;je j == top? |
||||
brne CASEND ; ne -> konec, citam dal |
||||
add top,plus ;k top prictu plus |
||||
inc plus ;a plus zvysim o 1 |
||||
clr i ;vymazu pomocne |
||||
clr j |
||||
inc faze ;dalsi faze kostky |
||||
cpi faze,6 ;je faze 6? |
||||
brne VYBER ; neni -> skok na VYBER |
||||
ldi faze,0 ; je -> nuluju fazi |
||||
VYBER: cpi faze,0 ;podminene se vybere, co se ma zobrazit |
||||
breq F0 |
||||
cpi faze,1 |
||||
breq F1 |
||||
cpi faze,2 |
||||
breq F2 |
||||
cpi faze,3 |
||||
breq F3 |
||||
cpi faze,4 |
||||
breq F4 |
||||
cpi faze,5 |
||||
breq F5 |
||||
|
||||
F0: ldi r16,0b00000011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F1: ldi r16,0b00000101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F2: ldi r16,0b00001011 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F3: ldi r16,0b00001101 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F4: ldi r16,0b00001111 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F5: ldi r16,0b00011101 |
||||
out PORTB,r16 |
||||
CASEND: ;navrat z preruseni |
||||
reti |
||||
|
@ -0,0 +1,111 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def top=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
.def faze=r23 |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b11111110 ;smer pinu |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;PullUpy |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
ldi top,2 |
||||
ldi faze,0 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
in r16,PINB ;kontrola jestli je PINB0 zapnutej |
||||
sbrs r16, 0 |
||||
rjmp LOOP ;NE -> jdi na loop |
||||
ldi top,1 ;ANO -> nastavit top na 1 a vymazat citace |
||||
clr i |
||||
clr j |
||||
CEKANI: |
||||
ldi top,2 ;cekame na uvolneni, zatim se prepina s top=2 |
||||
in r16,PINB ;kontrola jestli je PINB0 vypnutej |
||||
sbrc r16, 0 |
||||
rjmp CEKANI |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
cpi top,40 |
||||
breq CASEND |
||||
inc i |
||||
cpi i,10 |
||||
brne CASEND |
||||
clr i |
||||
inc j |
||||
cp j,top |
||||
brne CASEND |
||||
inc top |
||||
clr i |
||||
clr j |
||||
inc faze ;PODMINENY VYBER VYSTUPNIHO SYMBOLU |
||||
cpi faze,6 |
||||
brne VYBER |
||||
ldi faze,0 |
||||
VYBER: cpi faze,0 |
||||
breq F0 |
||||
cpi faze,1 |
||||
breq F1 |
||||
cpi faze,2 |
||||
breq F2 |
||||
cpi faze,3 |
||||
breq F3 |
||||
cpi faze,4 |
||||
breq F4 |
||||
cpi faze,5 |
||||
breq F5 |
||||
|
||||
F0: ldi r16,0b00000010 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F1: ldi r16,0b00000100 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F2: ldi r16,0b00001010 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F3: ldi r16,0b00001100 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F4: ldi r16,0b00001110 |
||||
out PORTB,r16 |
||||
rjmp CASEND |
||||
F5: ldi r16,0b00011100 |
||||
out PORTB,r16 |
||||
CASEND: |
||||
reti |
||||
|
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.hex" -d "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.obj" -e "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.eep" -m "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.map" "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><ProjectName>efekty_LED</ProjectName><Created>06-Sep-2007 20:57:13</Created><LastEdit>08-Sep-2007 21:56:18</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>06-Sep-2007 20:57:13</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>efekty_LED.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega16</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\</Folder><RelPath>efekty_LED.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>efekty_LED</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\efekty_LED.asm</Name><Name>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.inc</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>efekty_LED2</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.inc</FileName><Status>257</Status></File00003><File00004><FileId>00004</FileId><FileName>efekty_LED.asm</FileName><Status>257</Status></File00004><File00005><FileId>00005</FileId><FileName>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\_cekani.inc</FileName><Status>259</Status></File00005></Files><Workspace><File00000><Position>193 71 1022 718</Position><LineCol>0 0</LineCol></File00000><File00001><Position>14 146 677 456</Position><LineCol>0 0</LineCol></File00001><File00002><Position>235 132 898 442</Position><LineCol>0 0</LineCol></File00002><File00003><Position>191 67 1020 722</Position><LineCol>0 0</LineCol></File00003><File00004><Position>197 71 1026 566</Position><LineCol>78 6</LineCol><State>Maximized</State></File00004><File00005><Position>311 204 978 518</Position><LineCol>12 15</LineCol></File00005></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,87 @@ |
||||
;pokus |
||||
|
||||
.include "m16def.inc" |
||||
|
||||
.def POM=r16 |
||||
.def A=r17 |
||||
.def B=r18 |
||||
.def C=r19 |
||||
.def D=r20 |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI R16,0x5F ;nastavi stack pointer na 0x045F |
||||
OUT SPL,R16 ;coz je konec SRAM u ATmegy16 |
||||
LDI R16,0x04 |
||||
OUT SPH,R16 |
||||
|
||||
LDI POM,0xFF ;nastavi vsechny porty jako vystupni |
||||
OUT DDRA,POM |
||||
OUT DDRB,POM |
||||
OUT DDRC,POM |
||||
OUT DDRD,POM |
||||
|
||||
LDI A,0b01110000 ;hodnoty portu A az D |
||||
LDI B,0b10001000 |
||||
LDI C,0b10001000 |
||||
LDI D,0b00000111 |
||||
|
||||
|
||||
LOOP: |
||||
CLC |
||||
ROL A ;preroluj A registr |
||||
BRCC ACC ;pokud je C=0, skoc na ACC (A Carry Clear) |
||||
SBR A,0b00000001 ;nastav prvni bit v A na 1 |
||||
ACC: OUT PORTA,A ;output A do PORTA |
||||
|
||||
CLC |
||||
ROL B ;preroluj B registr - totez co u A reg. |
||||
BRCC BCC |
||||
SBR B,0b00000001 |
||||
BCC: OUT PORTB,B |
||||
|
||||
CLC |
||||
ROL C ;preroluj C registr - totez co u A reg. |
||||
BRCC CCC |
||||
SBR C,0b00000001 |
||||
CCC: OUT PORTC,C |
||||
|
||||
CLC |
||||
ROL D ;preroluj D registr - totez co u A reg. |
||||
BRCC DCC |
||||
SBR D,0b00000001 |
||||
DCC: OUT PORTD,D |
||||
RCALL CEKANI |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 40 |
||||
L1: DEC r16 |
||||
LDI r17, 40 |
||||
L2: DEC r17 |
||||
LDI r18, 40 |
||||
L3: DEC r18 |
||||
CPI r18, 0 |
||||
BRNE L3 |
||||
CPI r17, 0 |
||||
BRNE L2 |
||||
CPI r16, 0 |
||||
BRNE L1 |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
|
@ -0,0 +1,621 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm Sat Sep 08 21:56:17 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000094 |
||||
EQU SIGNATURE_002 00000003 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU SPH 0000003e |
||||
EQU OCR0 0000003c |
||||
EQU GICR 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK 00000039 |
||||
EQU TIFR 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU TWCR 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUCSR 00000034 |
||||
EQU TCCR0 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU OCDR 00000031 |
||||
EQU SFIOR 00000030 |
||||
EQU TCCR1A 0000002f |
||||
EQU TCCR1B 0000002e |
||||
EQU TCNT1L 0000002c |
||||
EQU TCNT1H 0000002d |
||||
EQU OCR1AL 0000002a |
||||
EQU OCR1AH 0000002b |
||||
EQU OCR1BL 00000028 |
||||
EQU OCR1BH 00000029 |
||||
EQU ICR1L 00000026 |
||||
EQU ICR1H 00000027 |
||||
EQU TCCR2 00000025 |
||||
EQU TCNT2 00000024 |
||||
EQU OCR2 00000023 |
||||
EQU ASSR 00000022 |
||||
EQU WDTCR 00000021 |
||||
EQU UBRRH 00000020 |
||||
EQU UCSRC 00000020 |
||||
EQU EEARL 0000001e |
||||
EQU EEARH 0000001f |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTA 0000001b |
||||
EQU DDRA 0000001a |
||||
EQU PINA 00000019 |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PORTC 00000015 |
||||
EQU DDRC 00000014 |
||||
EQU PINC 00000013 |
||||
EQU PORTD 00000012 |
||||
EQU DDRD 00000011 |
||||
EQU PIND 00000010 |
||||
EQU SPDR 0000000f |
||||
EQU SPSR 0000000e |
||||
EQU SPCR 0000000d |
||||
EQU UDR 0000000c |
||||
EQU UCSRA 0000000b |
||||
EQU UCSRB 0000000a |
||||
EQU UBRRL 00000009 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU TWDR 00000003 |
||||
EQU TWAR 00000002 |
||||
EQU TWSR 00000001 |
||||
EQU TWBR 00000000 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM01 00000003 |
||||
EQU CTC0 00000003 |
||||
EQU COM00 00000004 |
||||
EQU COM01 00000005 |
||||
EQU WGM00 00000006 |
||||
EQU PWM0 00000006 |
||||
EQU FOC0 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU TOIE0 00000000 |
||||
EQU OCIE0 00000001 |
||||
EQU TOV0 00000000 |
||||
EQU OCF0 00000001 |
||||
EQU PSR10 00000000 |
||||
EQU TOIE1 00000002 |
||||
EQU OCIE1B 00000003 |
||||
EQU OCIE1A 00000004 |
||||
EQU TICIE1 00000005 |
||||
EQU TOV1 00000002 |
||||
EQU OCF1B 00000003 |
||||
EQU OCF1A 00000004 |
||||
EQU ICF1 00000005 |
||||
EQU WGM10 00000000 |
||||
EQU PWM10 00000000 |
||||
EQU WGM11 00000001 |
||||
EQU PWM11 00000001 |
||||
EQU FOC1B 00000002 |
||||
EQU FOC1A 00000003 |
||||
EQU COM1B0 00000004 |
||||
EQU COM1B1 00000005 |
||||
EQU COM1A0 00000006 |
||||
EQU COM1A1 00000007 |
||||
EQU CS10 00000000 |
||||
EQU CS11 00000001 |
||||
EQU CS12 00000002 |
||||
EQU WGM12 00000003 |
||||
EQU CTC10 00000003 |
||||
EQU CTC1 00000003 |
||||
EQU WGM13 00000004 |
||||
EQU CTC11 00000004 |
||||
EQU ICES1 00000006 |
||||
EQU ICNC1 00000007 |
||||
EQU GIMSK 0000003b |
||||
EQU IVCE 00000000 |
||||
EQU IVSEL 00000001 |
||||
EQU INT2 00000005 |
||||
EQU INT0 00000006 |
||||
EQU INT1 00000007 |
||||
EQU INTF2 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU INTF1 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU ISC10 00000002 |
||||
EQU ISC11 00000003 |
||||
EQU ISC2 00000006 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEWEE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SM0 00000004 |
||||
EQU SM1 00000005 |
||||
EQU SE 00000006 |
||||
EQU SM2 00000007 |
||||
EQU MCUSR 00000034 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU EXTREF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU JTRF 00000004 |
||||
EQU JTD 00000007 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CAL7 00000007 |
||||
EQU PSR2 00000001 |
||||
EQU PUD 00000002 |
||||
EQU TOIE2 00000006 |
||||
EQU OCIE2 00000007 |
||||
EQU TOV2 00000006 |
||||
EQU OCF2 00000007 |
||||
EQU CS20 00000000 |
||||
EQU CS21 00000001 |
||||
EQU CS22 00000002 |
||||
EQU WGM21 00000003 |
||||
EQU CTC2 00000003 |
||||
EQU COM20 00000004 |
||||
EQU COM21 00000005 |
||||
EQU WGM20 00000006 |
||||
EQU PWM2 00000006 |
||||
EQU FOC2 00000007 |
||||
EQU TCNT2_0 00000000 |
||||
EQU TCNT2_1 00000001 |
||||
EQU TCNT2_2 00000002 |
||||
EQU TCNT2_3 00000003 |
||||
EQU TCNT2_4 00000004 |
||||
EQU TCNT2_5 00000005 |
||||
EQU TCNT2_6 00000006 |
||||
EQU TCNT2_7 00000007 |
||||
EQU OCR2_0 00000000 |
||||
EQU OCR2_1 00000001 |
||||
EQU OCR2_2 00000002 |
||||
EQU OCR2_3 00000003 |
||||
EQU OCR2_4 00000004 |
||||
EQU OCR2_5 00000005 |
||||
EQU OCR2_6 00000006 |
||||
EQU OCR2_7 00000007 |
||||
EQU TCR2UB 00000000 |
||||
EQU OCR2UB 00000001 |
||||
EQU TCN2UB 00000002 |
||||
EQU AS2 00000003 |
||||
EQU SPDR0 00000000 |
||||
EQU SPDR1 00000001 |
||||
EQU SPDR2 00000002 |
||||
EQU SPDR3 00000003 |
||||
EQU SPDR4 00000004 |
||||
EQU SPDR5 00000005 |
||||
EQU SPDR6 00000006 |
||||
EQU SPDR7 00000007 |
||||
EQU SPI2X 00000000 |
||||
EQU WCOL 00000006 |
||||
EQU SPIF 00000007 |
||||
EQU SPR0 00000000 |
||||
EQU SPR1 00000001 |
||||
EQU CPHA 00000002 |
||||
EQU CPOL 00000003 |
||||
EQU MSTR 00000004 |
||||
EQU DORD 00000005 |
||||
EQU SPE 00000006 |
||||
EQU SPIE 00000007 |
||||
EQU UDR0 00000000 |
||||
EQU UDR1 00000001 |
||||
EQU UDR2 00000002 |
||||
EQU UDR3 00000003 |
||||
EQU UDR4 00000004 |
||||
EQU UDR5 00000005 |
||||
EQU UDR6 00000006 |
||||
EQU UDR7 00000007 |
||||
EQU USR 0000000b |
||||
EQU MPCM 00000000 |
||||
EQU U2X 00000001 |
||||
EQU UPE 00000002 |
||||
EQU PE 00000002 |
||||
EQU DOR 00000003 |
||||
EQU FE 00000004 |
||||
EQU UDRE 00000005 |
||||
EQU TXC 00000006 |
||||
EQU RXC 00000007 |
||||
EQU UCR 0000000a |
||||
EQU TXB8 00000000 |
||||
EQU RXB8 00000001 |
||||
EQU UCSZ2 00000002 |
||||
EQU CHR9 00000002 |
||||
EQU TXEN 00000003 |
||||
EQU RXEN 00000004 |
||||
EQU UDRIE 00000005 |
||||
EQU TXCIE 00000006 |
||||
EQU RXCIE 00000007 |
||||
EQU UCPOL 00000000 |
||||
EQU UCSZ0 00000001 |
||||
EQU UCSZ1 00000002 |
||||
EQU USBS 00000003 |
||||
EQU UPM0 00000004 |
||||
EQU UPM1 00000005 |
||||
EQU UMSEL 00000006 |
||||
EQU URSEL 00000007 |
||||
EQU UBRRHI 00000020 |
||||
EQU I2BR 00000000 |
||||
EQU TWBR0 00000000 |
||||
EQU TWBR1 00000001 |
||||
EQU TWBR2 00000002 |
||||
EQU TWBR3 00000003 |
||||
EQU TWBR4 00000004 |
||||
EQU TWBR5 00000005 |
||||
EQU TWBR6 00000006 |
||||
EQU TWBR7 00000007 |
||||
EQU I2CR 00000036 |
||||
EQU TWIE 00000000 |
||||
EQU I2IE 00000000 |
||||
EQU TWEN 00000002 |
||||
EQU I2EN 00000002 |
||||
EQU ENI2C 00000002 |
||||
EQU TWWC 00000003 |
||||
EQU I2WC 00000003 |
||||
EQU TWSTO 00000004 |
||||
EQU I2STO 00000004 |
||||
EQU TWSTA 00000005 |
||||
EQU I2STA 00000005 |
||||
EQU TWEA 00000006 |
||||
EQU I2EA 00000006 |
||||
EQU TWINT 00000007 |
||||
EQU I2INT 00000007 |
||||
EQU I2SR 00000001 |
||||
EQU TWPS0 00000000 |
||||
EQU TWS0 00000000 |
||||
EQU I2GCE 00000000 |
||||
EQU TWPS1 00000001 |
||||
EQU TWS1 00000001 |
||||
EQU TWS3 00000003 |
||||
EQU I2S3 00000003 |
||||
EQU TWS4 00000004 |
||||
EQU I2S4 00000004 |
||||
EQU TWS5 00000005 |
||||
EQU I2S5 00000005 |
||||
EQU TWS6 00000006 |
||||
EQU I2S6 00000006 |
||||
EQU TWS7 00000007 |
||||
EQU I2S7 00000007 |
||||
EQU I2DR 00000003 |
||||
EQU TWD0 00000000 |
||||
EQU TWD1 00000001 |
||||
EQU TWD2 00000002 |
||||
EQU TWD3 00000003 |
||||
EQU TWD4 00000004 |
||||
EQU TWD5 00000005 |
||||
EQU TWD6 00000006 |
||||
EQU TWD7 00000007 |
||||
EQU I2AR 00000002 |
||||
EQU TWGCE 00000000 |
||||
EQU TWA0 00000001 |
||||
EQU TWA1 00000002 |
||||
EQU TWA2 00000003 |
||||
EQU TWA3 00000004 |
||||
EQU TWA4 00000005 |
||||
EQU TWA5 00000006 |
||||
EQU TWA6 00000007 |
||||
EQU ACME 00000003 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIC 00000002 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU MUX2 00000002 |
||||
EQU MUX3 00000003 |
||||
EQU MUX4 00000004 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU REFS1 00000007 |
||||
EQU ADCSR 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADFR 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000005 |
||||
EQU ADTS1 00000006 |
||||
EQU ADTS2 00000007 |
||||
EQU OCDR0 00000000 |
||||
EQU OCDR1 00000001 |
||||
EQU OCDR2 00000002 |
||||
EQU OCDR3 00000003 |
||||
EQU OCDR4 00000004 |
||||
EQU OCDR5 00000005 |
||||
EQU OCDR6 00000006 |
||||
EQU OCDR7 00000007 |
||||
EQU IDRD 00000007 |
||||
EQU SPMCR 00000037 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU BLBSET 00000003 |
||||
EQU RWWSRE 00000004 |
||||
EQU ASRE 00000004 |
||||
EQU RWWSB 00000006 |
||||
EQU ASB 00000006 |
||||
EQU SPMIE 00000007 |
||||
EQU PORTA0 00000000 |
||||
EQU PA0 00000000 |
||||
EQU PORTA1 00000001 |
||||
EQU PA1 00000001 |
||||
EQU PORTA2 00000002 |
||||
EQU PA2 00000002 |
||||
EQU PORTA3 00000003 |
||||
EQU PA3 00000003 |
||||
EQU PORTA4 00000004 |
||||
EQU PA4 00000004 |
||||
EQU PORTA5 00000005 |
||||
EQU PA5 00000005 |
||||
EQU PORTA6 00000006 |
||||
EQU PA6 00000006 |
||||
EQU PORTA7 00000007 |
||||
EQU PA7 00000007 |
||||
EQU DDA0 00000000 |
||||
EQU DDA1 00000001 |
||||
EQU DDA2 00000002 |
||||
EQU DDA3 00000003 |
||||
EQU DDA4 00000004 |
||||
EQU DDA5 00000005 |
||||
EQU DDA6 00000006 |
||||
EQU DDA7 00000007 |
||||
EQU PINA0 00000000 |
||||
EQU PINA1 00000001 |
||||
EQU PINA2 00000002 |
||||
EQU PINA3 00000003 |
||||
EQU PINA4 00000004 |
||||
EQU PINA5 00000005 |
||||
EQU PINA6 00000006 |
||||
EQU PINA7 00000007 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU PORTB6 00000006 |
||||
EQU PB6 00000006 |
||||
EQU PORTB7 00000007 |
||||
EQU PB7 00000007 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU DDB6 00000006 |
||||
EQU DDB7 00000007 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU PINB6 00000006 |
||||
EQU PINB7 00000007 |
||||
EQU PORTC0 00000000 |
||||
EQU PC0 00000000 |
||||
EQU PORTC1 00000001 |
||||
EQU PC1 00000001 |
||||
EQU PORTC2 00000002 |
||||
EQU PC2 00000002 |
||||
EQU PORTC3 00000003 |
||||
EQU PC3 00000003 |
||||
EQU PORTC4 00000004 |
||||
EQU PC4 00000004 |
||||
EQU PORTC5 00000005 |
||||
EQU PC5 00000005 |
||||
EQU PORTC6 00000006 |
||||
EQU PC6 00000006 |
||||
EQU PORTC7 00000007 |
||||
EQU PC7 00000007 |
||||
EQU DDC0 00000000 |
||||
EQU DDC1 00000001 |
||||
EQU DDC2 00000002 |
||||
EQU DDC3 00000003 |
||||
EQU DDC4 00000004 |
||||
EQU DDC5 00000005 |
||||
EQU DDC6 00000006 |
||||
EQU DDC7 00000007 |
||||
EQU PINC0 00000000 |
||||
EQU PINC1 00000001 |
||||
EQU PINC2 00000002 |
||||
EQU PINC3 00000003 |
||||
EQU PINC4 00000004 |
||||
EQU PINC5 00000005 |
||||
EQU PINC6 00000006 |
||||
EQU PINC7 00000007 |
||||
EQU PORTD0 00000000 |
||||
EQU PD0 00000000 |
||||
EQU PORTD1 00000001 |
||||
EQU PD1 00000001 |
||||
EQU PORTD2 00000002 |
||||
EQU PD2 00000002 |
||||
EQU PORTD3 00000003 |
||||
EQU PD3 00000003 |
||||
EQU PORTD4 00000004 |
||||
EQU PD4 00000004 |
||||
EQU PORTD5 00000005 |
||||
EQU PD5 00000005 |
||||
EQU PORTD6 00000006 |
||||
EQU PD6 00000006 |
||||
EQU PORTD7 00000007 |
||||
EQU PD7 00000007 |
||||
EQU DDD0 00000000 |
||||
EQU DDD1 00000001 |
||||
EQU DDD2 00000002 |
||||
EQU DDD3 00000003 |
||||
EQU DDD4 00000004 |
||||
EQU DDD5 00000005 |
||||
EQU DDD6 00000006 |
||||
EQU DDD7 00000007 |
||||
EQU PIND0 00000000 |
||||
EQU PIND1 00000001 |
||||
EQU PIND2 00000002 |
||||
EQU PIND3 00000003 |
||||
EQU PIND4 00000004 |
||||
EQU PIND5 00000005 |
||||
EQU PIND6 00000006 |
||||
EQU PIND7 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDTOE 00000004 |
||||
EQU WDDE 00000004 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU BLB01 00000002 |
||||
EQU BLB02 00000003 |
||||
EQU BLB11 00000004 |
||||
EQU BLB12 00000005 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU CKSEL2 00000002 |
||||
EQU CKSEL3 00000003 |
||||
EQU SUT0 00000004 |
||||
EQU SUT1 00000005 |
||||
EQU BODEN 00000006 |
||||
EQU BODLEVEL 00000007 |
||||
EQU BOOTRST 00000000 |
||||
EQU BOOTSZ0 00000001 |
||||
EQU BOOTSZ1 00000002 |
||||
EQU EESAVE 00000003 |
||||
EQU CKOPT 00000004 |
||||
EQU SPIEN 00000005 |
||||
EQU JTAGEN 00000006 |
||||
EQU OCDEN 00000007 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 00001fff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000400 |
||||
EQU RAMEND 0000045f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 000001ff |
||||
EQU EEPROMEND 000001ff |
||||
EQU EEADRBITS 00000009 |
||||
EQU NRWW_START_ADDR 00001c00 |
||||
EQU NRWW_STOP_ADDR 00001fff |
||||
EQU RWW_START_ADDR 00000000 |
||||
EQU RWW_STOP_ADDR 00001bff |
||||
EQU PAGESIZE 00000040 |
||||
EQU FIRSTBOOTSTART 00001f80 |
||||
EQU SECONDBOOTSTART 00001f00 |
||||
EQU THIRDBOOTSTART 00001e00 |
||||
EQU FOURTHBOOTSTART 00001c00 |
||||
EQU SMALLBOOTSTART 00001f80 |
||||
EQU LARGEBOOTSTART 00001c00 |
||||
EQU INT0addr 00000002 |
||||
EQU INT1addr 00000004 |
||||
EQU OC2addr 00000006 |
||||
EQU OVF2addr 00000008 |
||||
EQU ICP1addr 0000000a |
||||
EQU OC1Aaddr 0000000c |
||||
EQU OC1Baddr 0000000e |
||||
EQU OVF1addr 00000010 |
||||
EQU OVF0addr 00000012 |
||||
EQU SPIaddr 00000014 |
||||
EQU URXCaddr 00000016 |
||||
EQU UDREaddr 00000018 |
||||
EQU UTXCaddr 0000001a |
||||
EQU ADCCaddr 0000001c |
||||
EQU ERDYaddr 0000001e |
||||
EQU ACIaddr 00000020 |
||||
EQU TWIaddr 00000022 |
||||
EQU INT2addr 00000024 |
||||
EQU OC0addr 00000026 |
||||
EQU SPMRaddr 00000028 |
||||
EQU INT_VECTORS_SIZE 0000002a |
||||
DEF POM r16 |
||||
DEF A r17 |
||||
DEF B r18 |
||||
DEF C r19 |
||||
DEF D r20 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 0000001d |
||||
CSEG ACC 00000021 |
||||
CSEG BCC 00000026 |
||||
CSEG CCC 0000002b |
||||
CSEG DCC 00000030 |
||||
CSEG CEKANI 00000033 |
||||
CSEG L1 00000037 |
||||
CSEG L2 00000039 |
||||
CSEG L3 0000003b |
@ -0,0 +1,88 @@ |
||||
;pokus |
||||
|
||||
.include "m16def.inc" |
||||
|
||||
.def POM=r16 |
||||
.def A=r17 |
||||
.def B=r18 |
||||
.def C=r19 |
||||
.def D=r20 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI R16,0x5F ;nastavi stack pointer na 0x045F |
||||
OUT SPL,R16 ;coz je konec SRAM u ATmegy16 |
||||
LDI R16,0x04 |
||||
OUT SPH,R16 |
||||
|
||||
LDI POM,0xFF ;nastavi vsechny porty jako vystupni |
||||
OUT DDRA,POM |
||||
OUT DDRB,POM |
||||
OUT DDRC,POM |
||||
OUT DDRD,POM |
||||
|
||||
LDI A,0b01110000 ;hodnoty portu A az D |
||||
LDI B,0b10001000 |
||||
LDI C,0b10001000 |
||||
LDI D,0b00000111 |
||||
|
||||
|
||||
LOOP: |
||||
CLC |
||||
ROL A ;preroluj A registr |
||||
BRCC ACC ;pokud je C=0, skoc na ACC (A Carry Clear) |
||||
SBR A,0b00000001 ;nastav prvni bit v A na 1 |
||||
ACC: OUT PORTA,A ;output A do PORTA |
||||
|
||||
CLC |
||||
ROL B ;preroluj B registr - totez co u A reg. |
||||
BRCC BCC |
||||
SBR B,0b00000001 |
||||
BCC: OUT PORTB,B |
||||
|
||||
CLC |
||||
ROL C ;preroluj C registr - totez co u A reg. |
||||
BRCC CCC |
||||
SBR C,0b00000001 |
||||
CCC: OUT PORTC,C |
||||
|
||||
CLC |
||||
ROL D ;preroluj D registr - totez co u A reg. |
||||
BRCC DCC |
||||
SBR D,0b00000001 |
||||
DCC: OUT PORTD,D |
||||
|
||||
|
||||
RCALL CEKANI |
||||
RJMP LOOP ;znovu na navesti LOOP |
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 40 |
||||
L1: DEC r16 |
||||
LDI r17, 40 |
||||
L2: DEC r17 |
||||
LDI r18, 40 |
||||
L3: DEC r18 |
||||
CPI r18, 0 |
||||
BRNE L3 |
||||
CPI r17, 0 |
||||
BRNE L2 |
||||
CPI r16, 0 |
||||
BRNE L1 |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
|
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATmega16"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED2" Position="197 71 1026 566" LineCol="0 0" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,33 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATmega16</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.hex</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>18</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>36</LINE></LOOP> |
||||
<ACC><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>41</LINE></ACC> |
||||
<BCC><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>47</LINE></BCC> |
||||
<CCC><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>53</LINE></CCC> |
||||
<DCC><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>59</LINE></DCC> |
||||
<CEKANI><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>63</LINE></CEKANI> |
||||
<L1><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>69</LINE></L1> |
||||
<L2><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>71</LINE></L2> |
||||
<L3><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\HAD_leze\efekty_LED.asm</FILE><LINE>73</LINE></L3> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.hex" -d "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.obj" -e "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.eep" -m "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.map" "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><Created>06-Sep-2007 20:57:13</Created><LastEdit>10-Sep-2007 21:51:09</LastEdit><ProjectType>0</ProjectType><Created>06-Sep-2007 20:57:13</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName><ICON>208</ICON><ProjectName>LED_display</ProjectName><Created>08-Sep-2007 21:57:32</Created><LastEdit>08-Sep-2007 21:57:32</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>08-Sep-2007 21:57:32</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>LED_display.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</EntryFile><ObjectFile></ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_PART>ATmega16</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega16.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND></IO_EXPAND><REGISTERNAMES></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\</Folder><RelPath>LED_display.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>LED_display</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\LED_display.asm</Name><Name>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.inc</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>LED_display.asm</FileName><Status>1</Status></File00000></Files><Workspace><File00000><Position>197 71 1026 566</Position><LineCol>59 11</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,74 @@ |
||||
;pokus |
||||
|
||||
.include "m16def.inc" |
||||
|
||||
.def POM=r16 |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI R16,0x5F ;nastavi stack pointer na 0x045F |
||||
OUT SPL,R16 ;coz je konec SRAM u ATmegy16 |
||||
LDI R16,0x04 |
||||
OUT SPH,R16 |
||||
|
||||
LDI POM,0xFF ;nastavi vsechny potrebne porty jako vystupni |
||||
OUT DDRA,POM |
||||
OUT DDRB,POM |
||||
|
||||
LOOP: |
||||
LDI r16,0b01110111 ;display 3 abcef |
||||
LDI r17,0b00001000 |
||||
OUT PORTA,r16 |
||||
OUT PORTB,r17 |
||||
RCALL cekani |
||||
|
||||
LDI r16,0b01110110 ;display 2 |
||||
LDI r17,0b00000100 |
||||
OUT PORTA,r16 |
||||
OUT PORTB,r17 |
||||
RCALL cekani |
||||
|
||||
LDI r16,0b00111111 ;display 1 |
||||
LDI r17,0b00000010 |
||||
OUT PORTA,r16 |
||||
OUT PORTB,r17 |
||||
RCALL cekani |
||||
|
||||
LDI r16,0b00011110 ;display 0 |
||||
LDI r17,0b00000001 |
||||
OUT PORTA,r16 |
||||
OUT PORTB,r17 |
||||
RCALL cekani |
||||
|
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 2 |
||||
L1: DEC r16 |
||||
LDI r17, 2 |
||||
L2: DEC r17 |
||||
LDI r18, 2 |
||||
L3: DEC r18 |
||||
CPI r18, 0 |
||||
BRNE L3 |
||||
CPI r17, 0 |
||||
BRNE L2 |
||||
CPI r16, 0 |
||||
BRNE L1 |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
@ -0,0 +1,613 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm Mon Sep 10 21:42:09 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000094 |
||||
EQU SIGNATURE_002 00000003 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU SPH 0000003e |
||||
EQU OCR0 0000003c |
||||
EQU GICR 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK 00000039 |
||||
EQU TIFR 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU TWCR 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUCSR 00000034 |
||||
EQU TCCR0 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU OCDR 00000031 |
||||
EQU SFIOR 00000030 |
||||
EQU TCCR1A 0000002f |
||||
EQU TCCR1B 0000002e |
||||
EQU TCNT1L 0000002c |
||||
EQU TCNT1H 0000002d |
||||
EQU OCR1AL 0000002a |
||||
EQU OCR1AH 0000002b |
||||
EQU OCR1BL 00000028 |
||||
EQU OCR1BH 00000029 |
||||
EQU ICR1L 00000026 |
||||
EQU ICR1H 00000027 |
||||
EQU TCCR2 00000025 |
||||
EQU TCNT2 00000024 |
||||
EQU OCR2 00000023 |
||||
EQU ASSR 00000022 |
||||
EQU WDTCR 00000021 |
||||
EQU UBRRH 00000020 |
||||
EQU UCSRC 00000020 |
||||
EQU EEARL 0000001e |
||||
EQU EEARH 0000001f |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTA 0000001b |
||||
EQU DDRA 0000001a |
||||
EQU PINA 00000019 |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PORTC 00000015 |
||||
EQU DDRC 00000014 |
||||
EQU PINC 00000013 |
||||
EQU PORTD 00000012 |
||||
EQU DDRD 00000011 |
||||
EQU PIND 00000010 |
||||
EQU SPDR 0000000f |
||||
EQU SPSR 0000000e |
||||
EQU SPCR 0000000d |
||||
EQU UDR 0000000c |
||||
EQU UCSRA 0000000b |
||||
EQU UCSRB 0000000a |
||||
EQU UBRRL 00000009 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU TWDR 00000003 |
||||
EQU TWAR 00000002 |
||||
EQU TWSR 00000001 |
||||
EQU TWBR 00000000 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM01 00000003 |
||||
EQU CTC0 00000003 |
||||
EQU COM00 00000004 |
||||
EQU COM01 00000005 |
||||
EQU WGM00 00000006 |
||||
EQU PWM0 00000006 |
||||
EQU FOC0 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU TOIE0 00000000 |
||||
EQU OCIE0 00000001 |
||||
EQU TOV0 00000000 |
||||
EQU OCF0 00000001 |
||||
EQU PSR10 00000000 |
||||
EQU TOIE1 00000002 |
||||
EQU OCIE1B 00000003 |
||||
EQU OCIE1A 00000004 |
||||
EQU TICIE1 00000005 |
||||
EQU TOV1 00000002 |
||||
EQU OCF1B 00000003 |
||||
EQU OCF1A 00000004 |
||||
EQU ICF1 00000005 |
||||
EQU WGM10 00000000 |
||||
EQU PWM10 00000000 |
||||
EQU WGM11 00000001 |
||||
EQU PWM11 00000001 |
||||
EQU FOC1B 00000002 |
||||
EQU FOC1A 00000003 |
||||
EQU COM1B0 00000004 |
||||
EQU COM1B1 00000005 |
||||
EQU COM1A0 00000006 |
||||
EQU COM1A1 00000007 |
||||
EQU CS10 00000000 |
||||
EQU CS11 00000001 |
||||
EQU CS12 00000002 |
||||
EQU WGM12 00000003 |
||||
EQU CTC10 00000003 |
||||
EQU CTC1 00000003 |
||||
EQU WGM13 00000004 |
||||
EQU CTC11 00000004 |
||||
EQU ICES1 00000006 |
||||
EQU ICNC1 00000007 |
||||
EQU GIMSK 0000003b |
||||
EQU IVCE 00000000 |
||||
EQU IVSEL 00000001 |
||||
EQU INT2 00000005 |
||||
EQU INT0 00000006 |
||||
EQU INT1 00000007 |
||||
EQU INTF2 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU INTF1 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU ISC10 00000002 |
||||
EQU ISC11 00000003 |
||||
EQU ISC2 00000006 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEWEE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SM0 00000004 |
||||
EQU SM1 00000005 |
||||
EQU SE 00000006 |
||||
EQU SM2 00000007 |
||||
EQU MCUSR 00000034 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU EXTREF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU JTRF 00000004 |
||||
EQU JTD 00000007 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CAL7 00000007 |
||||
EQU PSR2 00000001 |
||||
EQU PUD 00000002 |
||||
EQU TOIE2 00000006 |
||||
EQU OCIE2 00000007 |
||||
EQU TOV2 00000006 |
||||
EQU OCF2 00000007 |
||||
EQU CS20 00000000 |
||||
EQU CS21 00000001 |
||||
EQU CS22 00000002 |
||||
EQU WGM21 00000003 |
||||
EQU CTC2 00000003 |
||||
EQU COM20 00000004 |
||||
EQU COM21 00000005 |
||||
EQU WGM20 00000006 |
||||
EQU PWM2 00000006 |
||||
EQU FOC2 00000007 |
||||
EQU TCNT2_0 00000000 |
||||
EQU TCNT2_1 00000001 |
||||
EQU TCNT2_2 00000002 |
||||
EQU TCNT2_3 00000003 |
||||
EQU TCNT2_4 00000004 |
||||
EQU TCNT2_5 00000005 |
||||
EQU TCNT2_6 00000006 |
||||
EQU TCNT2_7 00000007 |
||||
EQU OCR2_0 00000000 |
||||
EQU OCR2_1 00000001 |
||||
EQU OCR2_2 00000002 |
||||
EQU OCR2_3 00000003 |
||||
EQU OCR2_4 00000004 |
||||
EQU OCR2_5 00000005 |
||||
EQU OCR2_6 00000006 |
||||
EQU OCR2_7 00000007 |
||||
EQU TCR2UB 00000000 |
||||
EQU OCR2UB 00000001 |
||||
EQU TCN2UB 00000002 |
||||
EQU AS2 00000003 |
||||
EQU SPDR0 00000000 |
||||
EQU SPDR1 00000001 |
||||
EQU SPDR2 00000002 |
||||
EQU SPDR3 00000003 |
||||
EQU SPDR4 00000004 |
||||
EQU SPDR5 00000005 |
||||
EQU SPDR6 00000006 |
||||
EQU SPDR7 00000007 |
||||
EQU SPI2X 00000000 |
||||
EQU WCOL 00000006 |
||||
EQU SPIF 00000007 |
||||
EQU SPR0 00000000 |
||||
EQU SPR1 00000001 |
||||
EQU CPHA 00000002 |
||||
EQU CPOL 00000003 |
||||
EQU MSTR 00000004 |
||||
EQU DORD 00000005 |
||||
EQU SPE 00000006 |
||||
EQU SPIE 00000007 |
||||
EQU UDR0 00000000 |
||||
EQU UDR1 00000001 |
||||
EQU UDR2 00000002 |
||||
EQU UDR3 00000003 |
||||
EQU UDR4 00000004 |
||||
EQU UDR5 00000005 |
||||
EQU UDR6 00000006 |
||||
EQU UDR7 00000007 |
||||
EQU USR 0000000b |
||||
EQU MPCM 00000000 |
||||
EQU U2X 00000001 |
||||
EQU UPE 00000002 |
||||
EQU PE 00000002 |
||||
EQU DOR 00000003 |
||||
EQU FE 00000004 |
||||
EQU UDRE 00000005 |
||||
EQU TXC 00000006 |
||||
EQU RXC 00000007 |
||||
EQU UCR 0000000a |
||||
EQU TXB8 00000000 |
||||
EQU RXB8 00000001 |
||||
EQU UCSZ2 00000002 |
||||
EQU CHR9 00000002 |
||||
EQU TXEN 00000003 |
||||
EQU RXEN 00000004 |
||||
EQU UDRIE 00000005 |
||||
EQU TXCIE 00000006 |
||||
EQU RXCIE 00000007 |
||||
EQU UCPOL 00000000 |
||||
EQU UCSZ0 00000001 |
||||
EQU UCSZ1 00000002 |
||||
EQU USBS 00000003 |
||||
EQU UPM0 00000004 |
||||
EQU UPM1 00000005 |
||||
EQU UMSEL 00000006 |
||||
EQU URSEL 00000007 |
||||
EQU UBRRHI 00000020 |
||||
EQU I2BR 00000000 |
||||
EQU TWBR0 00000000 |
||||
EQU TWBR1 00000001 |
||||
EQU TWBR2 00000002 |
||||
EQU TWBR3 00000003 |
||||
EQU TWBR4 00000004 |
||||
EQU TWBR5 00000005 |
||||
EQU TWBR6 00000006 |
||||
EQU TWBR7 00000007 |
||||
EQU I2CR 00000036 |
||||
EQU TWIE 00000000 |
||||
EQU I2IE 00000000 |
||||
EQU TWEN 00000002 |
||||
EQU I2EN 00000002 |
||||
EQU ENI2C 00000002 |
||||
EQU TWWC 00000003 |
||||
EQU I2WC 00000003 |
||||
EQU TWSTO 00000004 |
||||
EQU I2STO 00000004 |
||||
EQU TWSTA 00000005 |
||||
EQU I2STA 00000005 |
||||
EQU TWEA 00000006 |
||||
EQU I2EA 00000006 |
||||
EQU TWINT 00000007 |
||||
EQU I2INT 00000007 |
||||
EQU I2SR 00000001 |
||||
EQU TWPS0 00000000 |
||||
EQU TWS0 00000000 |
||||
EQU I2GCE 00000000 |
||||
EQU TWPS1 00000001 |
||||
EQU TWS1 00000001 |
||||
EQU TWS3 00000003 |
||||
EQU I2S3 00000003 |
||||
EQU TWS4 00000004 |
||||
EQU I2S4 00000004 |
||||
EQU TWS5 00000005 |
||||
EQU I2S5 00000005 |
||||
EQU TWS6 00000006 |
||||
EQU I2S6 00000006 |
||||
EQU TWS7 00000007 |
||||
EQU I2S7 00000007 |
||||
EQU I2DR 00000003 |
||||
EQU TWD0 00000000 |
||||
EQU TWD1 00000001 |
||||
EQU TWD2 00000002 |
||||
EQU TWD3 00000003 |
||||
EQU TWD4 00000004 |
||||
EQU TWD5 00000005 |
||||
EQU TWD6 00000006 |
||||
EQU TWD7 00000007 |
||||
EQU I2AR 00000002 |
||||
EQU TWGCE 00000000 |
||||
EQU TWA0 00000001 |
||||
EQU TWA1 00000002 |
||||
EQU TWA2 00000003 |
||||
EQU TWA3 00000004 |
||||
EQU TWA4 00000005 |
||||
EQU TWA5 00000006 |
||||
EQU TWA6 00000007 |
||||
EQU ACME 00000003 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIC 00000002 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU MUX2 00000002 |
||||
EQU MUX3 00000003 |
||||
EQU MUX4 00000004 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU REFS1 00000007 |
||||
EQU ADCSR 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADFR 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000005 |
||||
EQU ADTS1 00000006 |
||||
EQU ADTS2 00000007 |
||||
EQU OCDR0 00000000 |
||||
EQU OCDR1 00000001 |
||||
EQU OCDR2 00000002 |
||||
EQU OCDR3 00000003 |
||||
EQU OCDR4 00000004 |
||||
EQU OCDR5 00000005 |
||||
EQU OCDR6 00000006 |
||||
EQU OCDR7 00000007 |
||||
EQU IDRD 00000007 |
||||
EQU SPMCR 00000037 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU BLBSET 00000003 |
||||
EQU RWWSRE 00000004 |
||||
EQU ASRE 00000004 |
||||
EQU RWWSB 00000006 |
||||
EQU ASB 00000006 |
||||
EQU SPMIE 00000007 |
||||
EQU PORTA0 00000000 |
||||
EQU PA0 00000000 |
||||
EQU PORTA1 00000001 |
||||
EQU PA1 00000001 |
||||
EQU PORTA2 00000002 |
||||
EQU PA2 00000002 |
||||
EQU PORTA3 00000003 |
||||
EQU PA3 00000003 |
||||
EQU PORTA4 00000004 |
||||
EQU PA4 00000004 |
||||
EQU PORTA5 00000005 |
||||
EQU PA5 00000005 |
||||
EQU PORTA6 00000006 |
||||
EQU PA6 00000006 |
||||
EQU PORTA7 00000007 |
||||
EQU PA7 00000007 |
||||
EQU DDA0 00000000 |
||||
EQU DDA1 00000001 |
||||
EQU DDA2 00000002 |
||||
EQU DDA3 00000003 |
||||
EQU DDA4 00000004 |
||||
EQU DDA5 00000005 |
||||
EQU DDA6 00000006 |
||||
EQU DDA7 00000007 |
||||
EQU PINA0 00000000 |
||||
EQU PINA1 00000001 |
||||
EQU PINA2 00000002 |
||||
EQU PINA3 00000003 |
||||
EQU PINA4 00000004 |
||||
EQU PINA5 00000005 |
||||
EQU PINA6 00000006 |
||||
EQU PINA7 00000007 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU PORTB6 00000006 |
||||
EQU PB6 00000006 |
||||
EQU PORTB7 00000007 |
||||
EQU PB7 00000007 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU DDB6 00000006 |
||||
EQU DDB7 00000007 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU PINB6 00000006 |
||||
EQU PINB7 00000007 |
||||
EQU PORTC0 00000000 |
||||
EQU PC0 00000000 |
||||
EQU PORTC1 00000001 |
||||
EQU PC1 00000001 |
||||
EQU PORTC2 00000002 |
||||
EQU PC2 00000002 |
||||
EQU PORTC3 00000003 |
||||
EQU PC3 00000003 |
||||
EQU PORTC4 00000004 |
||||
EQU PC4 00000004 |
||||
EQU PORTC5 00000005 |
||||
EQU PC5 00000005 |
||||
EQU PORTC6 00000006 |
||||
EQU PC6 00000006 |
||||
EQU PORTC7 00000007 |
||||
EQU PC7 00000007 |
||||
EQU DDC0 00000000 |
||||
EQU DDC1 00000001 |
||||
EQU DDC2 00000002 |
||||
EQU DDC3 00000003 |
||||
EQU DDC4 00000004 |
||||
EQU DDC5 00000005 |
||||
EQU DDC6 00000006 |
||||
EQU DDC7 00000007 |
||||
EQU PINC0 00000000 |
||||
EQU PINC1 00000001 |
||||
EQU PINC2 00000002 |
||||
EQU PINC3 00000003 |
||||
EQU PINC4 00000004 |
||||
EQU PINC5 00000005 |
||||
EQU PINC6 00000006 |
||||
EQU PINC7 00000007 |
||||
EQU PORTD0 00000000 |
||||
EQU PD0 00000000 |
||||
EQU PORTD1 00000001 |
||||
EQU PD1 00000001 |
||||
EQU PORTD2 00000002 |
||||
EQU PD2 00000002 |
||||
EQU PORTD3 00000003 |
||||
EQU PD3 00000003 |
||||
EQU PORTD4 00000004 |
||||
EQU PD4 00000004 |
||||
EQU PORTD5 00000005 |
||||
EQU PD5 00000005 |
||||
EQU PORTD6 00000006 |
||||
EQU PD6 00000006 |
||||
EQU PORTD7 00000007 |
||||
EQU PD7 00000007 |
||||
EQU DDD0 00000000 |
||||
EQU DDD1 00000001 |
||||
EQU DDD2 00000002 |
||||
EQU DDD3 00000003 |
||||
EQU DDD4 00000004 |
||||
EQU DDD5 00000005 |
||||
EQU DDD6 00000006 |
||||
EQU DDD7 00000007 |
||||
EQU PIND0 00000000 |
||||
EQU PIND1 00000001 |
||||
EQU PIND2 00000002 |
||||
EQU PIND3 00000003 |
||||
EQU PIND4 00000004 |
||||
EQU PIND5 00000005 |
||||
EQU PIND6 00000006 |
||||
EQU PIND7 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDTOE 00000004 |
||||
EQU WDDE 00000004 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU BLB01 00000002 |
||||
EQU BLB02 00000003 |
||||
EQU BLB11 00000004 |
||||
EQU BLB12 00000005 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU CKSEL2 00000002 |
||||
EQU CKSEL3 00000003 |
||||
EQU SUT0 00000004 |
||||
EQU SUT1 00000005 |
||||
EQU BODEN 00000006 |
||||
EQU BODLEVEL 00000007 |
||||
EQU BOOTRST 00000000 |
||||
EQU BOOTSZ0 00000001 |
||||
EQU BOOTSZ1 00000002 |
||||
EQU EESAVE 00000003 |
||||
EQU CKOPT 00000004 |
||||
EQU SPIEN 00000005 |
||||
EQU JTAGEN 00000006 |
||||
EQU OCDEN 00000007 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 00001fff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000400 |
||||
EQU RAMEND 0000045f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 000001ff |
||||
EQU EEPROMEND 000001ff |
||||
EQU EEADRBITS 00000009 |
||||
EQU NRWW_START_ADDR 00001c00 |
||||
EQU NRWW_STOP_ADDR 00001fff |
||||
EQU RWW_START_ADDR 00000000 |
||||
EQU RWW_STOP_ADDR 00001bff |
||||
EQU PAGESIZE 00000040 |
||||
EQU FIRSTBOOTSTART 00001f80 |
||||
EQU SECONDBOOTSTART 00001f00 |
||||
EQU THIRDBOOTSTART 00001e00 |
||||
EQU FOURTHBOOTSTART 00001c00 |
||||
EQU SMALLBOOTSTART 00001f80 |
||||
EQU LARGEBOOTSTART 00001c00 |
||||
EQU INT0addr 00000002 |
||||
EQU INT1addr 00000004 |
||||
EQU OC2addr 00000006 |
||||
EQU OVF2addr 00000008 |
||||
EQU ICP1addr 0000000a |
||||
EQU OC1Aaddr 0000000c |
||||
EQU OC1Baddr 0000000e |
||||
EQU OVF1addr 00000010 |
||||
EQU OVF0addr 00000012 |
||||
EQU SPIaddr 00000014 |
||||
EQU URXCaddr 00000016 |
||||
EQU UDREaddr 00000018 |
||||
EQU UTXCaddr 0000001a |
||||
EQU ADCCaddr 0000001c |
||||
EQU ERDYaddr 0000001e |
||||
EQU ACIaddr 00000020 |
||||
EQU TWIaddr 00000022 |
||||
EQU INT2addr 00000024 |
||||
EQU OC0addr 00000026 |
||||
EQU SPMRaddr 00000028 |
||||
EQU INT_VECTORS_SIZE 0000002a |
||||
DEF POM r16 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000017 |
||||
CSEG cekani 0000002c |
||||
CSEG L1 00000030 |
||||
CSEG L2 00000032 |
||||
CSEG L3 00000034 |
@ -0,0 +1,29 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATmega16</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m16def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.hex</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>14</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>24</LINE></LOOP> |
||||
<cekani><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>51</LINE></cekani> |
||||
<L1><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>57</LINE></L1> |
||||
<L2><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>59</LINE></L2> |
||||
<L3><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm</FILE><LINE>61</LINE></L3> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA16"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\LED_display\LED_display.asm" Position="197 71 1026 566" LineCol="59 11" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,53 @@ |
||||
;pokus |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.def POM=r16 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI POM,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,POM |
||||
|
||||
LDI POM,0B00000011 ;nastavi vystupni piny |
||||
OUT DDRB,POM |
||||
|
||||
LOOP: |
||||
SBI PORTB,0 ;PB0=0, PB1=1 |
||||
CBI PORTB,1 |
||||
RCALL CEKANI ;CEKACI SUB |
||||
CBI PORTB,0 ;PB0=1, PB1=0 |
||||
SBI PORTB,1 |
||||
RCALL CEKANI ;CEKACI SUB |
||||
RJMP LOOP ;znovu na navesti LOOP |
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 100 |
||||
L1: DEC r16 |
||||
LDI r17, 100 |
||||
L2: DEC r17 |
||||
LDI r18, 125 |
||||
L3: DEC r18 |
||||
CPI r18, 0 |
||||
BRNE L3 |
||||
CPI r17, 0 |
||||
BRNE L2 |
||||
CPI r16, 0 |
||||
BRNE L1 |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
|
@ -0,0 +1,287 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\pokus\pokus.asm Tue Sep 04 20:36:18 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
DEF POM r16 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG CEKANI 0000001b |
||||
CSEG L1 0000001f |
||||
CSEG L2 00000021 |
||||
CSEG L3 00000023 |
@ -0,0 +1,53 @@ |
||||
.device attiny13 |
||||
.def CNT=r25 |
||||
.def LED=r24 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
CLI ;zakazat vsechna preruseni |
||||
|
||||
LDI LED,0 |
||||
|
||||
LDI r16,0b11111110 ;PB2 je vystupni, PB0 vstupni |
||||
OUT DDRB,r16 |
||||
|
||||
LDI r16,0 ;vypnout PullUp |
||||
OUT PORTB,r16 |
||||
|
||||
LOOP: |
||||
IN r16,PINB ;dej do r16 stav PINB |
||||
ANDI r16,0b00000001 |
||||
CPI r16,1 ;neni-li to 1, jdi na STORNO |
||||
BRNE STORNO |
||||
INC CNT ;CNT+1 |
||||
CPI CNT,50 ;neni-li CNT=100, jdi na LOOP |
||||
BRNE LOOP |
||||
|
||||
IN r16,PORTB ;r16=PORTB (vystupni port) |
||||
LDI r17,0b00000100 ;vyxoruj r16 s 0b00000100 |
||||
EOR r16,R17 |
||||
OUT PORTB,R16 ;a vysledek dej na PORTB |
||||
|
||||
KONEC: |
||||
IN r16,PINB ;cekani na vstup nuly do PINB0 |
||||
ANDI r16,0b00000001 |
||||
CPI r16,0 |
||||
BRNE KONEC ;neni-li r16=0, jdi na KONEC |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
STORNO: |
||||
LDI CNT,0 ;do CNT dej 0 |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,97 @@ |
||||
.DEVICE ATtiny13 |
||||
.LIST |
||||
.LISTMAC |
||||
;běží na 9.6MHz, ckdiv8=0 (zapnuto) |
||||
;avrdude příkaz pro FUSEs: -U lfuse:w:0x6a:m -U hfuse:w:0xff:m |
||||
;LFUSE: 0x6A |
||||
;HFUSE: 0xFF |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
.def A2 = r25 |
||||
.def A1 = r24 |
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
|
||||
; začátek kódu |
||||
.org 0x0010 |
||||
RESET: ldi r16,low(RAMEND) ;nastaví stack pointer |
||||
out SPL,r16 |
||||
|
||||
|
||||
;tělo programu |
||||
|
||||
|
||||
;věčná smyčka |
||||
F_LOOP: rjmp F_LOOP |
||||
|
||||
|
||||
SHOW: |
||||
;A1,A2 obsahují bajty k zobrazení |
||||
ldi r16,8 |
||||
NextB: ror A1 |
||||
brcs A1on |
||||
cbi PORTB,PB0 |
||||
rjmp A2proc |
||||
A1on: sbi PORTB,PB0 |
||||
A2proc: ror A2 |
||||
brcs A2on |
||||
cbi PORTB,PB1 |
||||
rjmp shift |
||||
A1on: sbi PORTB,PB1 |
||||
shift: sbi PORTB,PB2 |
||||
nop |
||||
cbi PORTB,PB2 |
||||
dec r16 |
||||
brne NextB |
||||
sbi PORTB,PB3 |
||||
nop |
||||
cbi PORTB,PB3 |
||||
ret |
||||
|
||||
CharTbl: |
||||
; GR GR GR GR |
||||
; GR GR GR GR |
||||
.db 0b00000000, 0b00000000 |
||||
|
||||
|
||||
|
||||
|
||||
;cteni z EEPROM, v [r17 je ADRESA], v (r16 se objeví DATA) |
||||
;EEread: |
||||
; sbic EECR,1 |
||||
; rjmp EEread ;cekani dokud neni EEPROM ready |
||||
; |
||||
; out EEARL, r17 ;ulozit adresu z r17 |
||||
; sbi EECR,0 ;nastavenim EERE zacina cteni |
||||
; in r16,EEDR ;cteni dat z EEDR do r16 |
||||
; |
||||
; ret |
||||
|
||||
|
||||
;zapis do EEPROM, v [R17 je ADRESA], v [R16 jsou DATA] |
||||
;EEwrite: |
||||
; sbic EECR,EEPE |
||||
; rjmp EEwrite ;cekani dokud neni EEPROM ready |
||||
; |
||||
; cbi EECR,EEPM1 ;nastavit programovaci mod |
||||
; cbi EECR,EEPM0 |
||||
; |
||||
; out EEARL, r17 ;dej adresu z r17 do EEARL |
||||
; out EEDR, r16 ;dej data z r16 do EEDR |
||||
; sbi EECR,EEMPE ;master program enable |
||||
; sbi EECR,EEPE ;program enable |
||||
; |
||||
; ret |
||||
|
||||
|
||||
|
@ -0,0 +1,549 @@ |
||||
;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 |
||||
;------------------------------------------------- |
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +-- wakepin |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; speaker --+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
|
||||
;N A S T A V E N I V Y S I L A N E M O R S E O V K Y |
||||
.equ DelkaTecky = 5 ;delka tecky v desetinach |
||||
.equ DelkaCarky = 15 ;3x delka tecky = delka carky |
||||
.equ MezeraMorspart = 5 ;mezera mezi teckami/carkami v pismene |
||||
.equ MezeraZnak = 16 ;mezera za znakem (pripojena za vnitrni mezeru) |
||||
.equ FrekvenceMorse = 40 ;62500/tohle Hz |
||||
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
.equ LEDPIN = PINB |
||||
|
||||
.equ led0 = 0 |
||||
.equ led1 = 1 |
||||
.equ led2 = 2 |
||||
.equ led3 = 3 |
||||
.equ led4 = 4 |
||||
.equ led5 = 5 |
||||
.equ ledm = 6 |
||||
.equ wakepin = 7 |
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
.equ sw0 = 0 |
||||
.equ sw1 = 1 |
||||
.equ sw2 = 2 |
||||
.equ sw3 = 3 |
||||
.equ sw4 = 4 |
||||
.equ sw5 = 5 |
||||
|
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO DefaultTone |
||||
ldi r16,FrekvenceMorse |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000B ;pin change |
||||
reti ;hned se vrat (tohle je jen na probuzeni, nic se nevykonava) |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "MORSE PIPAC SETI 2011",0 ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16, (1<<SM0) ;nastavi sleep mode = power-down (nejuspornejsi) |
||||
out MCUCR, r16 |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (shutdown a speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;shutdown=0 (continue), speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = wakepin |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, wakepin pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
sei ;Global Interrupt Enable |
||||
|
||||
|
||||
|
||||
;plynule rozsviceni ledm + stoupajici ton |
||||
BuzzOn |
||||
ldi cmatch,255 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L1NEXTSTEP: |
||||
dec cmatch ;zvys jas |
||||
breq L1DONE ;je jas=255(full)? pak L1DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L1OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L1NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsviť ledmain |
||||
L1INNER: |
||||
dec linner |
||||
breq L1OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L1Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L1Ib: |
||||
rjmp L1INNER |
||||
|
||||
L1DONE: |
||||
cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) |
||||
|
||||
|
||||
|
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L2NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L2DONE |
||||
breq L2DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L2OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L2NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L2INNER: |
||||
dec linner |
||||
breq L2OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L2Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L2Ib: |
||||
rjmp L2INNER |
||||
|
||||
L2DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,1 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
;krouzeni cervenych ledek + pipani |
||||
ldi r18,24 ;celkem 24 preklopeni |
||||
ldi r17,0b11111110 ;posuvny registr - inicializace |
||||
KRUH1: |
||||
sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) |
||||
out LEDPORT, r17 ;vystup |
||||
lsr r17 ;rotuj doprava pres carry |
||||
brcs KRUH1b ;neni carry? preskoc |
||||
cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) |
||||
KRUH1b: |
||||
mov r16,r17 ;vypocet tonu pipnuti |
||||
com r16 |
||||
lsl r16 |
||||
eor r16,r18 |
||||
SetTone |
||||
BuzzOn ;pipni |
||||
ldi r16,2 |
||||
rcall delay |
||||
BuzzOff |
||||
dec r18 |
||||
brne KRUH1 ;neni-li to posledni preklopeni, opakuj |
||||
K1DONE: |
||||
DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) |
||||
|
||||
|
||||
;zhasni vse |
||||
ldi r16,0b11111111 |
||||
out LEDPORT,r16 ;vypni ledky |
||||
ldi r16,4 |
||||
rcall delay ;cekej 0.4s |
||||
|
||||
;ukaz co je zapojeno (cervenymi ledkami) |
||||
in r25, SWPIN ;prijmout stav SWPORTu |
||||
andi r25,0b00111111 ;ignoruj nepouzite piny |
||||
mov r16,r25 |
||||
sbr r16,0b01000000 |
||||
out LEDPORT,r16 ;ukazat na LEDPORTu |
||||
|
||||
;cekej 2 sekundy |
||||
ldi r16,20 ;pauza 2s |
||||
rcall delay |
||||
|
||||
;spocitani zapnutych jumperu |
||||
;r25 obsahuje stav SWPINu (bity 0-5) |
||||
sbr r25,0b11000000 ;zapni i nepouzite bity |
||||
com r25 ;neguj (jumpery jsou na zem) -> aktivni budou 1 |
||||
clr r24 ;priprav citac aktivnich jumperu |
||||
clr r16 ;nulovej registr pro ADC (aby procetl jen carry) |
||||
COUNTL: |
||||
lsr r25 ;(r25>>1) bit 0 do carry |
||||
adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) |
||||
cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL |
||||
brne COUNTL |
||||
|
||||
;r24 obsahuje pocet zaplych bitu |
||||
COUNTDONE: |
||||
cpi r24,6 ;je 6 jumperu? |
||||
brne TEST5 |
||||
ldi ZH,high(TEXT6*2) |
||||
ldi ZL,low(TEXT6*2) |
||||
rjmp TESTDONE |
||||
TEST5: |
||||
cpi r24,5 ;je 5 jumperu? |
||||
brne TEST4 |
||||
ldi ZH,high(TEXT5*2) |
||||
ldi ZL,low(TEXT5*2) |
||||
rjmp TESTDONE |
||||
TEST4: |
||||
cpi r24,4 ;jsou 4 jumpery? |
||||
brne TEST3 |
||||
ldi ZH,high(TEXT4*2) |
||||
ldi ZL,low(TEXT4*2) |
||||
rjmp TESTDONE |
||||
TEST3: |
||||
cpi r24,3 ;jsou 3 jumpery? |
||||
brne TEST2 |
||||
ldi ZH,high(TEXT3*2) |
||||
ldi ZL,low(TEXT3*2) |
||||
rjmp TESTDONE |
||||
TEST2: |
||||
cpi r24,2 ;jsou 2 jumpery? |
||||
brne TEST1 |
||||
ldi ZH,high(TEXT2*2) |
||||
ldi ZL,low(TEXT2*2) |
||||
rjmp TESTDONE |
||||
TEST1: |
||||
cpi r24,1 ;je 1 jumper? |
||||
brne TEST0 |
||||
ldi ZH,high(TEXT1*2) |
||||
ldi ZL,low(TEXT1*2) |
||||
rjmp TESTDONE |
||||
TEST0: |
||||
ldi ZH,high(TEXT0*2) ;je 0 jumperu. |
||||
ldi ZL,low(TEXT0*2) |
||||
TESTDONE: |
||||
|
||||
|
||||
;Z obsahuje pointer na zacatek vysilaneho textu. |
||||
;Dalsi znak textu (nebo prvni) |
||||
NextCharTxt: |
||||
lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi |
||||
cpi curchar,0 |
||||
breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec |
||||
|
||||
push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) |
||||
push ZL |
||||
|
||||
;hledani znaku v tabulce |
||||
ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z |
||||
ldi ZL,low(MORSE*2) |
||||
NextCharTbl: |
||||
lpm morspart,Z+ ;precti znak z tabulky |
||||
|
||||
cpi morspart,0 ;je to 0? (= konec tabulky) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cp morspart,curchar ;je to hledany znak? |
||||
breq CharFound ;pak jdi na CharFound |
||||
adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) |
||||
rjmp NextCharTbl |
||||
|
||||
;znak nalezen v tabulce |
||||
CharFound: |
||||
lpm morspart,Z+ ;nacti MorsPart |
||||
cpi morspart,0 ;je to 0? (= konec znaku) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cpi morspart,1 ;je to tecka? (=1) - zustan tady |
||||
brne CARKA ;je to carka? (=3) - jdi na CARKA |
||||
;TECKA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaTecky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
;CARKA |
||||
CARKA: |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaCarky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
|
||||
;tecka/carka dokoncena |
||||
MorsPartDone: ;konec morspartu (=tecka/carka) |
||||
ldi r16,MezeraMorspart ;udelej mezeru |
||||
rcall delay |
||||
rjmp CharFound ;jdi na dalsi cast morspartu |
||||
|
||||
;znak dokoncen |
||||
CharDone: |
||||
ldi r16,MezeraZnak ;mezera za znakem |
||||
rcall delay |
||||
|
||||
pop ZL ;obnov pointer pro text |
||||
pop ZH |
||||
|
||||
rjmp NextCharTxt ;jdi na dalsi znak textu |
||||
|
||||
EndCom: |
||||
ldi r16,10 |
||||
rcall delay |
||||
|
||||
|
||||
BuzzOn |
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L3NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L3DONE |
||||
breq L3DONE |
||||
mov r16,cmatch |
||||
lsr r16 |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L3OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L3NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L3INNER: |
||||
dec linner |
||||
breq L3OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L3Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L3Ib: |
||||
rjmp L3INNER |
||||
|
||||
L3DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,2 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;SLEEP (a po probuzeni skok na RESET) |
||||
clr r16 |
||||
out SWPORT,r16 ;vypni pullupy jumperu |
||||
sbi SYSPORT, speak ;vypni speaker (pro jistotu) |
||||
ser r16 |
||||
out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled |
||||
|
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
ldi r16,(1<<PCINT7) |
||||
out PCMSK,r16 ;povol pinchange interrupt pro PB7 |
||||
|
||||
|
||||
in r16, MCUCR |
||||
ori r16, (1<<SE) |
||||
out MCUCR, r16 ;sleep enable && sleep |
||||
|
||||
sleep |
||||
|
||||
in r16, MCUCR |
||||
andi r16, ~(1<<SE) |
||||
out MCUCR, r16 ;sleep disable |
||||
|
||||
clr r16 |
||||
out GIMSK,r16 ;zakaz pinchange interrupt (general) |
||||
out PCMSK,r16 ;zakaz pinchange interrupt z PB7 |
||||
;reset |
||||
rjmp RESET |
||||
|
||||
;R U T I N Y |
||||
|
||||
delay: |
||||
;ldi r16,#desetin |
||||
push r17 |
||||
push r18 |
||||
;255*225*7 |
||||
d0: |
||||
ldi r17,255 |
||||
d1: |
||||
ldi r18,227 |
||||
d2: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r18 |
||||
brne d2 |
||||
dec r17 |
||||
brne d1 |
||||
dec r16 |
||||
brne d0 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
ret |
||||
|
||||
|
||||
; T A B U L K A Z N A K U |
||||
MORSE: |
||||
.DB "A",1,3,0,0,0,0,0 ;A |
||||
.DB "B",3,1,1,1,0,0,0 ;B |
||||
.DB "C",3,1,3,1,0,0,0 ;C |
||||
.DB "D",3,1,1,0,0,0,0 ;D |
||||
.DB "E",1,0,0,0,0,0,0 ;E |
||||
.DB "F",1,1,3,1,0,0,0 ;F |
||||
.DB "G",3,3,1,0,0,0,0 ;G |
||||
.DB "H",1,1,1,1,0,0,0 ;H |
||||
.DB "I",1,1,0,0,0,0,0 ;I |
||||
.DB "J",1,3,3,3,0,0,0 ;J |
||||
.DB "K",3,1,3,0,0,0,0 ;K |
||||
.DB "L",1,3,1,1,0,0,0 ;L |
||||
.DB "M",3,3,0,0,0,0,0 ;M |
||||
.DB "N",3,1,0,0,0,0,0 ;N |
||||
.DB "O",3,3,3,0,0,0,0 ;O |
||||
.DB "P",1,3,3,1,0,0,0 ;P |
||||
.DB "Q",3,3,1,3,0,0,0 ;Q |
||||
.DB "R",1,3,1,0,0,0,0 ;R |
||||
.DB "S",1,1,1,0,0,0,0 ;S |
||||
.DB "T",3,0,0,0,0,0,0 ;T |
||||
.DB "U",1,1,3,0,0,0,0 ;U |
||||
.DB "V",1,1,1,3,0,0,0 ;V |
||||
.DB "W",1,3,3,0,0,0,0 ;W |
||||
.DB "X",3,1,1,3,0,0,0 ;X |
||||
.DB "Y",3,1,3,3,0,0,0 ;Y |
||||
.DB "Z",3,3,1,1,0,0,0 ;Z |
||||
.DB "0",3,3,3,3,3,0,0 ;0 |
||||
.DB "1",1,3,3,3,3,0,0 ;1 |
||||
.DB "2",1,1,3,3,3,0,0 ;2 |
||||
.DB "3",1,1,1,3,3,0,0 ;3 |
||||
.DB "4",1,1,1,1,3,0,0 ;4 |
||||
.DB "5",1,1,1,1,1,0,0 ;5 |
||||
.DB "6",3,1,1,1,1,0,0 ;6 |
||||
.DB "7",3,3,1,1,1,0,0 ;7 |
||||
.DB "8",3,3,3,1,1,0,0 ;8 |
||||
.DB "9",3,3,3,3,1,0,0 ;9 |
||||
.DB ".",1,3,1,3,1,3,0 ;. |
||||
.DB ",",3,3,1,1,3,3,0 ;, |
||||
.DB " ",0,0,0,0,0,0,0 ;space |
||||
.DB 0,0,0,0,0,0,0,0 ;nic |
||||
|
||||
;T E X T Y K O D V Y S I L A N I |
||||
TEXT0: |
||||
.db "CHYBI ANTENA BYLA ZAMERENA NA POZICI N 50S 12.345 E014S 12.345",0 |
||||
TEXT1: |
||||
.db "POTREBUJI ZESILOVAC LEZI NA N 50S 12.345 E014S 12.345",0 |
||||
TEXT2: |
||||
.db "SLABY SIGNAL DALSI ANTENA JE ZDE N 50S 12.345 E 14S 12.345",0 |
||||
TEXT3: |
||||
.db "DOCHAZI ENERGIE ZALOZNI ZDROJ DOPADL NA N 50S 12.345 E014S 12.345",0 |
||||
TEXT4: |
||||
.db "POLOHA DALSI ANTENY JE N 50S 12.345 E014S 12.345",0 |
||||
TEXT5: |
||||
.db "PRESNOST ZVYSI SUPERSENZOR N 50S 12.345 E014S 12.345",0 |
||||
TEXT6: |
||||
.db "ZASOBNIK LOKALIZOVAN N 50S 12.345 E014S 12.345 MUZETE SI HO NECHAT SLIZOUN JE JEDLY",0 |
||||
|
@ -0,0 +1,597 @@ |
||||
;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 |
||||
;------------------------------------------------- |
||||
;Co to dela: |
||||
;Po spusteni plynule rozsviti a zhasle LED MAIN, behem toho houka s promennou frekvenci |
||||
;Povoli uspani zmenou stavu pinu PB7 |
||||
|
||||
|
||||
|
||||
|
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) |
||||
;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
|
||||
;N A S T A V E N I V Y S I L A N E M O R S E O V K Y |
||||
.equ DelkaTecky = 4 ;delka tecky v desetinach |
||||
.equ DelkaCarky = 14 ;3x delka tecky = delka carky |
||||
.equ MezeraMorspart = 4 ;mezera mezi teckami/carkami v pismene |
||||
.equ MezeraZnak = 16 ;mezera za znakem (pripojena za vnitrni mezeru) |
||||
.equ FrekvenceMorse = 42 ;62500/tohle Hz |
||||
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
.equ LEDPIN = PINB |
||||
|
||||
.equ led0 = 0 |
||||
.equ led1 = 1 |
||||
.equ led2 = 2 |
||||
.equ led3 = 3 |
||||
.equ led4 = 4 |
||||
.equ led5 = 5 |
||||
.equ ledm = 6 |
||||
.equ wakepin = 7 |
||||
.equ AFTER_SLEEP = 0b10101010 ;informace ze byl predtim sleep |
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
.equ sw0 = 0 |
||||
.equ sw1 = 1 |
||||
.equ sw2 = 2 |
||||
.equ sw3 = 3 |
||||
.equ sw4 = 4 |
||||
.equ sw5 = 5 |
||||
|
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO DefaultTone |
||||
ldi r16,FrekvenceMorse |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000B ;pin change |
||||
rjmp PINCHANGE ;probuzeni nebo preruseni cinnosti |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "MORSE PIPAC SETI 2011",0 ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
clr r5 ;vymaz navesti ze je po probuzeni (r5=AFTER_SLEEP, ted bude 0) |
||||
|
||||
ldi r16, (1<<SM0) ;nastavi sleep mode = power-down (nejuspornejsi) |
||||
out MCUCR, r16 |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (shutdown a speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;shutdown=0 (continue), speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = wakepin |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, wakepin pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
|
||||
;konfigurace pinchange interruptu (jeste je treba zapnout PCIE v GIMSK) |
||||
ldi r16,(1<<PCINT7) |
||||
out PCMSK,r16 ;povol pinchange interrupt pro PB7 (=wakepin) |
||||
|
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
|
||||
|
||||
;plynule rozsviceni ledm + stoupajici ton |
||||
BuzzOn |
||||
ldi cmatch,255 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L1NEXTSTEP: |
||||
dec cmatch ;zvys jas |
||||
breq L1DONE ;je jas=255(full)? pak L1DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L1OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L1NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsviť ledmain |
||||
L1INNER: |
||||
dec linner |
||||
breq L1OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L1Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L1Ib: |
||||
rjmp L1INNER |
||||
|
||||
L1DONE: |
||||
cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) |
||||
|
||||
|
||||
|
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L2NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L2DONE |
||||
breq L2DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L2OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L2NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L2INNER: |
||||
dec linner |
||||
breq L2OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L2Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L2Ib: |
||||
rjmp L2INNER |
||||
|
||||
L2DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,1 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
;ted uz je dost douho po resetu, zepneme moznost uspani wakepinem |
||||
;vymaz zasobnik ext. preruseni |
||||
in r16,EIFR |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
;povol interrupt změny pinu PB7 |
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
|
||||
|
||||
;krouzeni cervenych ledek + pipani |
||||
ldi r18,24 ;celkem 24 preklopeni |
||||
ldi r17,0b11111110 ;posuvny registr - inicializace |
||||
KRUH1: |
||||
sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) |
||||
out LEDPORT, r17 ;vystup |
||||
lsr r17 ;rotuj doprava pres carry |
||||
brcs KRUH1b ;neni carry? preskoc |
||||
cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) |
||||
KRUH1b: |
||||
mov r16,r17 ;vypocet tonu pipnuti |
||||
com r16 |
||||
lsl r16 |
||||
eor r16,r18 |
||||
SetTone |
||||
BuzzOn ;pipni |
||||
ldi r16,2 |
||||
rcall delay |
||||
BuzzOff |
||||
dec r18 |
||||
brne KRUH1 ;neni-li to posledni preklopeni, opakuj |
||||
K1DONE: |
||||
DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) |
||||
|
||||
|
||||
;zhasni vse |
||||
ldi r16,0b11111111 |
||||
out LEDPORT,r16 ;vypni ledky |
||||
ldi r16,4 |
||||
rcall delay ;cekej 0.4s |
||||
|
||||
;ukaz co je zapojeno (cervenymi ledkami) |
||||
in r25, SWPIN ;prijmout stav SWPORTu |
||||
andi r25,0b00111111 ;ignoruj nepouzite piny |
||||
mov r16,r25 |
||||
sbr r16,0b11000000 |
||||
out LEDPORT,r16 ;ukazat na LEDPORTu |
||||
|
||||
;cekej 2 sekundy |
||||
ldi r16,20 ;pauza 2s |
||||
rcall delay |
||||
|
||||
;spocitani zapnutych jumperu |
||||
;r25 obsahuje stav SWPINu (bity 0-5) |
||||
sbr r25,0b11000000 ;zapni i nepouzite bity |
||||
com r25 ;neguj (jumpery jsou na zem) -> aktivni budou 1 |
||||
clr r24 ;priprav citac aktivnich jumperu |
||||
clr r16 ;nulovej registr pro ADC (aby procetl jen carry) |
||||
COUNTL: |
||||
lsr r25 ;(r25>>1) bit 0 do carry |
||||
adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) |
||||
cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL |
||||
brne COUNTL |
||||
|
||||
;r24 obsahuje pocet zaplych bitu |
||||
COUNTDONE: |
||||
cpi r24,6 ;je 6 jumperu? |
||||
brne TEST5 |
||||
ldi ZH,high(TEXT6*2) |
||||
ldi ZL,low(TEXT6*2) |
||||
rjmp TESTDONE |
||||
TEST5: |
||||
cpi r24,5 ;je 5 jumperu? |
||||
brne TEST4 |
||||
ldi ZH,high(TEXT5*2) |
||||
ldi ZL,low(TEXT5*2) |
||||
rjmp TESTDONE |
||||
TEST4: |
||||
cpi r24,4 ;jsou 4 jumpery? |
||||
brne TEST3 |
||||
ldi ZH,high(TEXT4*2) |
||||
ldi ZL,low(TEXT4*2) |
||||
rjmp TESTDONE |
||||
TEST3: |
||||
cpi r24,3 ;jsou 3 jumpery? |
||||
brne TEST2 |
||||
ldi ZH,high(TEXT3*2) |
||||
ldi ZL,low(TEXT3*2) |
||||
rjmp TESTDONE |
||||
TEST2: |
||||
cpi r24,2 ;jsou 2 jumpery? |
||||
brne TEST1 |
||||
ldi ZH,high(TEXT2*2) |
||||
ldi ZL,low(TEXT2*2) |
||||
rjmp TESTDONE |
||||
TEST1: |
||||
cpi r24,1 ;je 1 jumper? |
||||
brne TEST0 |
||||
ldi ZH,high(TEXT1*2) |
||||
ldi ZL,low(TEXT1*2) |
||||
rjmp TESTDONE |
||||
TEST0: |
||||
ldi ZH,high(TEXT0*2) ;je 0 jumperu. |
||||
ldi ZL,low(TEXT0*2) |
||||
TESTDONE: |
||||
|
||||
;Z obsahuje pointer na zacatek vysilaneho textu. |
||||
;Dalsi znak textu (nebo prvni) |
||||
NextCharTxt: |
||||
lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi |
||||
cpi curchar,0 |
||||
breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec |
||||
|
||||
push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) |
||||
push ZL |
||||
|
||||
;hledani znaku v tabulce |
||||
ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z |
||||
ldi ZL,low(MORSE*2) |
||||
NextCharTbl: |
||||
lpm morspart,Z+ ;precti znak z tabulky |
||||
|
||||
cpi morspart,0 ;je to 0? (= konec tabulky) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cp morspart,curchar ;je to hledany znak? |
||||
breq CharFound ;pak jdi na CharFound |
||||
adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) |
||||
rjmp NextCharTbl |
||||
|
||||
;znak nalezen v tabulce |
||||
CharFound: |
||||
lpm morspart,Z+ ;nacti MorsPart |
||||
cpi morspart,0 ;je to 0? (= konec znaku) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cpi morspart,1 ;je to tecka? (=1) - zustan tady |
||||
brne CARKA ;je to carka? (=3) - jdi na CARKA |
||||
;TECKA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaTecky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
;CARKA |
||||
CARKA: |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaCarky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
|
||||
;tecka/carka dokoncena |
||||
MorsPartDone: ;konec morspartu (=tecka/carka) |
||||
ldi r16,MezeraMorspart ;udelej mezeru |
||||
rcall delay |
||||
rjmp CharFound ;jdi na dalsi cast morspartu |
||||
|
||||
;znak dokoncen |
||||
CharDone: |
||||
ldi r16,MezeraZnak ;mezera za znakem |
||||
rcall delay |
||||
|
||||
pop ZL ;obnov pointer pro text |
||||
pop ZH |
||||
|
||||
rjmp NextCharTxt ;jdi na dalsi znak textu |
||||
|
||||
EndCom: |
||||
ldi r16,10 |
||||
rcall delay |
||||
|
||||
|
||||
BuzzOn |
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L3NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L3DONE |
||||
breq L3DONE |
||||
mov r16,cmatch |
||||
lsr r16 |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L3OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L3NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L3INNER: |
||||
dec linner |
||||
breq L3OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L3Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L3Ib: |
||||
rjmp L3INNER |
||||
|
||||
L3DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,2 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
USNI: |
||||
;SLEEP (a po probuzeni skok na RESET) |
||||
clr r16 |
||||
out SWPORT,r16 ;vypni pullupy jumperu |
||||
sbi SYSPORT, speak ;vypni speaker (pro jistotu) |
||||
ser r16 |
||||
out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled |
||||
|
||||
|
||||
;nastavit navesti, ze jde o probuzeni po spanku |
||||
ldi r16,AFTER_SLEEP |
||||
mov r5,r16 |
||||
;probudi se pinchange interruptem na PB7 |
||||
in r16, MCUCR |
||||
ori r16, (1<<SE) |
||||
out MCUCR, r16 ;sleep enable && sleep |
||||
|
||||
sleep |
||||
|
||||
in r16, MCUCR |
||||
andi r16, ~(1<<SE) |
||||
out MCUCR, r16 ;sleep disable |
||||
|
||||
;reset |
||||
rjmp RESET |
||||
|
||||
;R U T I N Y |
||||
|
||||
delay: |
||||
;ldi r16,#desetin |
||||
push r17 |
||||
push r18 |
||||
;255*225*7 |
||||
d0: |
||||
ldi r17,255 |
||||
d1: |
||||
ldi r18,227 |
||||
d2: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r18 |
||||
brne d2 |
||||
dec r17 |
||||
brne d1 |
||||
dec r16 |
||||
brne d0 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
ret |
||||
|
||||
|
||||
PINCHANGE: |
||||
mov r16,r5 |
||||
cpi r16,AFTER_SLEEP |
||||
brne NENIPOSLEEPU |
||||
|
||||
;je po SLEEPu -> reset |
||||
ldi r16,2 ;cekej 0.2s |
||||
rcall delay |
||||
clr r5 ;vymazat navesti ze byl SLEEP |
||||
clr r16 |
||||
out GIMSK,r16 ;zakaz pinchange interrupt (general) |
||||
sei |
||||
rjmp RESET ;pri resetu se vynuluje SP a sei uz bylo, takze se reti delat nemusi. bude reset |
||||
|
||||
;preruseni normalniho behu programu tlacitkem -> usnout |
||||
NENIPOSLEEPU: |
||||
ser r16 ;zhasne ledky |
||||
out LEDPORT,r16 |
||||
BuzzOff ;pro jistotu vypne speaker |
||||
ldi r16,20 ;ceka 2 sekundy (aby se tlacitko urcite stihlo uvolnit -> jinak se udela dalsi "pinchange" a hned se to probudi) |
||||
rcall delay |
||||
sei ;povol preruseni (vypnuto pri interruptu) |
||||
rjmp USNI ;usnout (probudi se zmenou PB7) |
||||
|
||||
|
||||
|
||||
; T A B U L K A Z N A K U |
||||
MORSE: |
||||
.DB "A",1,3,0,0,0,0,0 ;A |
||||
.DB "B",3,1,1,1,0,0,0 ;B |
||||
.DB "C",3,1,3,1,0,0,0 ;C |
||||
.DB "D",3,1,1,0,0,0,0 ;D |
||||
.DB "E",1,0,0,0,0,0,0 ;E |
||||
.DB "F",1,1,3,1,0,0,0 ;F |
||||
.DB "G",3,3,1,0,0,0,0 ;G |
||||
.DB "H",1,1,1,1,0,0,0 ;H |
||||
.DB "I",1,1,0,0,0,0,0 ;I |
||||
.DB "J",1,3,3,3,0,0,0 ;J |
||||
.DB "K",3,1,3,0,0,0,0 ;K |
||||
.DB "L",1,3,1,1,0,0,0 ;L |
||||
.DB "M",3,3,0,0,0,0,0 ;M |
||||
.DB "N",3,1,0,0,0,0,0 ;N |
||||
.DB "O",3,3,3,0,0,0,0 ;O |
||||
.DB "P",1,3,3,1,0,0,0 ;P |
||||
.DB "Q",3,3,1,3,0,0,0 ;Q |
||||
.DB "R",1,3,1,0,0,0,0 ;R |
||||
.DB "S",1,1,1,0,0,0,0 ;S |
||||
.DB "T",3,0,0,0,0,0,0 ;T |
||||
.DB "U",1,1,3,0,0,0,0 ;U |
||||
.DB "V",1,1,1,3,0,0,0 ;V |
||||
.DB "W",1,3,3,0,0,0,0 ;W |
||||
.DB "X",3,1,1,3,0,0,0 ;X |
||||
.DB "Y",3,1,3,3,0,0,0 ;Y |
||||
.DB "Z",3,3,1,1,0,0,0 ;Z |
||||
.DB "0",3,3,3,3,3,0,0 ;0 |
||||
.DB "1",1,3,3,3,3,0,0 ;1 |
||||
.DB "2",1,1,3,3,3,0,0 ;2 |
||||
.DB "3",1,1,1,3,3,0,0 ;3 |
||||
.DB "4",1,1,1,1,3,0,0 ;4 |
||||
.DB "5",1,1,1,1,1,0,0 ;5 |
||||
.DB "6",3,1,1,1,1,0,0 ;6 |
||||
.DB "7",3,3,1,1,1,0,0 ;7 |
||||
.DB "8",3,3,3,1,1,0,0 ;8 |
||||
.DB "9",3,3,3,3,1,0,0 ;9 |
||||
.DB ".",1,3,1,3,1,3,0 ;. |
||||
.DB ",",3,3,1,1,3,3,0 ;, |
||||
.DB " ",0,0,0,0,0,0,0 ;space |
||||
.DB 0,0,0,0,0,0,0,0 ;nic |
||||
|
||||
;T E X T Y K O D V Y S I L A N I |
||||
TEXT0: |
||||
.db "TOTO JE NAVIGATOR CHYBI ANTENA BYLA ZAMERENA NA POZICI N 50S 12.345 E014S 12.345",0 |
||||
TEXT1: |
||||
.db "POTREBUJI ZESILOVAC LEZI TADY N 50S 12.345 E014S 12.345",0 |
||||
TEXT2: |
||||
.db "SLABY SIGNAL DALSI ANTENA JE ZDE N 50S 12.345 E 14S 12.345",0 |
||||
TEXT3: |
||||
.db "DOCHAZI ENERGIE IONTOVY GENERATOR DOPADL NA N 50S 12.345 E014S 12.345",0 |
||||
TEXT4: |
||||
.db "POLOHA DALSI ANTENY JE N 50S 12.345 E014S 12.345",0 |
||||
TEXT5: |
||||
.db "PRESNOST ZVYSI SUPERSENZOR N 50S 12.345 E014S 12.345",0 |
||||
TEXT6: |
||||
.db "VRAK MODULU LOKALIZOVAN NA N 50S 12.345 E014S 12.345 SLIZ JE NESKODNY",0 |
||||
|
@ -0,0 +1,605 @@ |
||||
;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 |
||||
;------------------------------------------------- |
||||
;Co to dela: |
||||
;Po spusteni plynule rozsviti a zhasle LED MAIN, behem toho houka s promennou frekvenci |
||||
;Povoli uspani zmenou stavu pinu PB7 |
||||
|
||||
|
||||
|
||||
|
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) |
||||
;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
|
||||
;N A S T A V E N I V Y S I L A N E M O R S E O V K Y |
||||
.equ DelkaTecky = 4 ;delka tecky v desetinach |
||||
.equ DelkaCarky = 13 ;3x delka tecky = delka carky |
||||
.equ MezeraMorspart = 4 ;mezera mezi teckami/carkami v pismene |
||||
.equ MezeraZnak = 14 ;mezera za znakem (pripojena za vnitrni mezeru) |
||||
.equ FrekvenceMorse = 43 ;62500/tohle Hz |
||||
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
.equ LEDPIN = PINB |
||||
|
||||
.equ led0 = 0 |
||||
.equ led1 = 1 |
||||
.equ led2 = 2 |
||||
.equ led3 = 3 |
||||
.equ led4 = 4 |
||||
.equ led5 = 5 |
||||
.equ ledm = 6 |
||||
.equ wakepin = 7 |
||||
.equ AFTER_SLEEP = 0b10101010 ;informace ze byl predtim sleep |
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
.equ sw0 = 0 |
||||
.equ sw1 = 1 |
||||
.equ sw2 = 2 |
||||
.equ sw3 = 3 |
||||
.equ sw4 = 4 |
||||
.equ sw5 = 5 |
||||
|
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
.def YH = r29 |
||||
.def YL = r28 |
||||
.def XH = r27 |
||||
.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO DefaultTone |
||||
ldi r16,FrekvenceMorse |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000B ;pin change |
||||
rjmp PINCHANGE ;probuzeni nebo preruseni cinnosti |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "MORSE PIPAC SETI 2011",0 ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
clr r5 ;vymaz navesti ze je po probuzeni (r5=AFTER_SLEEP, ted bude 0) |
||||
|
||||
ldi r16, (1<<SM0) ;nastavi sleep mode = power-down (nejuspornejsi) |
||||
out MCUCR, r16 |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (shutdown a speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;shutdown=0 (continue), speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = wakepin |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, wakepin pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
|
||||
;konfigurace pinchange interruptu (jeste je treba zapnout PCIE v GIMSK) |
||||
ldi r16,(1<<PCINT7) |
||||
out PCMSK,r16 ;povol pinchange interrupt pro PB7 (=wakepin) |
||||
|
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
|
||||
|
||||
;plynule rozsviceni ledm + stoupajici ton |
||||
BuzzOn |
||||
ldi cmatch,255 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L1NEXTSTEP: |
||||
dec cmatch ;zvys jas |
||||
breq L1DONE ;je jas=255(full)? pak L1DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L1OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L1NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsviť ledmain |
||||
L1INNER: |
||||
dec linner |
||||
breq L1OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L1Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L1Ib: |
||||
rjmp L1INNER |
||||
|
||||
L1DONE: |
||||
cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) |
||||
|
||||
|
||||
|
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L2NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L2DONE |
||||
breq L2DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L2OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L2NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L2INNER: |
||||
dec linner |
||||
breq L2OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L2Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L2Ib: |
||||
rjmp L2INNER |
||||
|
||||
L2DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,1 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
;ted uz je dost douho po resetu, zepneme moznost uspani wakepinem |
||||
;vymaz zasobnik ext. preruseni |
||||
in r16,EIFR |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
;povol interrupt změny pinu PB7 |
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
|
||||
|
||||
;krouzeni cervenych ledek + pipani |
||||
ldi r18,24 ;celkem 24 preklopeni |
||||
ldi r17,0b11111110 ;posuvny registr - inicializace |
||||
KRUH1: |
||||
sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) |
||||
out LEDPORT, r17 ;vystup |
||||
lsr r17 ;rotuj doprava pres carry |
||||
brcs KRUH1b ;neni carry? preskoc |
||||
cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) |
||||
KRUH1b: |
||||
mov r16,r17 ;vypocet tonu pipnuti |
||||
com r16 |
||||
lsl r16 |
||||
eor r16,r18 |
||||
SetTone |
||||
BuzzOn ;pipni |
||||
ldi r16,2 |
||||
rcall delay |
||||
BuzzOff |
||||
dec r18 |
||||
brne KRUH1 ;neni-li to posledni preklopeni, opakuj |
||||
K1DONE: |
||||
DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) |
||||
|
||||
|
||||
;zhasni vse |
||||
ldi r16,0b11111111 |
||||
out LEDPORT,r16 ;vypni ledky |
||||
ldi r16,4 |
||||
rcall delay ;cekej 0.4s |
||||
|
||||
;ukaz co je zapojeno (cervenymi ledkami) |
||||
in r25, SWPIN ;prijmout stav SWPORTu |
||||
andi r25,0b00111111 ;ignoruj nepouzite piny |
||||
mov r16,r25 |
||||
sbr r16,0b11000000 |
||||
out LEDPORT,r16 ;ukazat na LEDPORTu |
||||
|
||||
;cekej 2 sekundy |
||||
ldi r16,20 ;pauza 2s |
||||
rcall delay |
||||
|
||||
;spocitani zapnutych jumperu |
||||
;r25 obsahuje stav SWPINu (bity 0-5) |
||||
sbr r25,0b11000000 ;zapni i nepouzite bity |
||||
com r25 ;neguj (jumpery jsou na zem) -> aktivni budou 1 |
||||
clr r24 ;priprav citac aktivnich jumperu |
||||
clr r16 ;nulovej registr pro ADC (aby procetl jen carry) |
||||
COUNTL: |
||||
lsr r25 ;(r25>>1) bit 0 do carry |
||||
adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) |
||||
cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL |
||||
brne COUNTL |
||||
|
||||
;r24 obsahuje pocet zaplych bitu |
||||
COUNTDONE: |
||||
cpi r24,6 ;je 6 jumperu? |
||||
brne TEST5 |
||||
ldi ZH,high(TEXT6*2) |
||||
ldi ZL,low(TEXT6*2) |
||||
rjmp TESTDONE |
||||
TEST5: |
||||
cpi r24,5 ;je 5 jumperu? |
||||
brne TEST4 |
||||
ldi ZH,high(TEXT5*2) |
||||
ldi ZL,low(TEXT5*2) |
||||
rjmp TESTDONE |
||||
TEST4: |
||||
cpi r24,4 ;jsou 4 jumpery? |
||||
brne TEST3 |
||||
ldi ZH,high(TEXT4*2) |
||||
ldi ZL,low(TEXT4*2) |
||||
rjmp TESTDONE |
||||
TEST3: |
||||
cpi r24,3 ;jsou 3 jumpery? |
||||
brne TEST2 |
||||
ldi ZH,high(TEXT3*2) |
||||
ldi ZL,low(TEXT3*2) |
||||
rjmp TESTDONE |
||||
TEST2: |
||||
cpi r24,2 ;jsou 2 jumpery? |
||||
brne TEST1 |
||||
ldi ZH,high(TEXT2*2) |
||||
ldi ZL,low(TEXT2*2) |
||||
rjmp TESTDONE |
||||
TEST1: |
||||
cpi r24,1 ;je 1 jumper? |
||||
brne TEST0 |
||||
ldi ZH,high(TEXT1*2) |
||||
ldi ZL,low(TEXT1*2) |
||||
rjmp TESTDONE |
||||
TEST0: |
||||
ldi ZH,high(TEXT0*2) ;je 0 jumperu. |
||||
ldi ZL,low(TEXT0*2) |
||||
TESTDONE: |
||||
|
||||
;Z obsahuje pointer na zacatek vysilaneho textu. |
||||
;Dalsi znak textu (nebo prvni) |
||||
NextCharTxt: |
||||
lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi |
||||
cpi curchar,0 |
||||
breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec |
||||
|
||||
push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) |
||||
push ZL |
||||
|
||||
;hledani znaku v tabulce |
||||
ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z |
||||
ldi ZL,low(MORSE*2) |
||||
NextCharTbl: |
||||
lpm morspart,Z+ ;precti znak z tabulky |
||||
|
||||
cpi morspart,0 ;je to 0? (= konec tabulky) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cp morspart,curchar ;je to hledany znak? |
||||
breq CharFound ;pak jdi na CharFound |
||||
adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) |
||||
rjmp NextCharTbl |
||||
|
||||
;znak nalezen v tabulce |
||||
CharFound: |
||||
lpm morspart,Z+ ;nacti MorsPart |
||||
cpi morspart,0 ;je to 0? (= konec znaku) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cpi morspart,1 ;je to tecka? (=1) - zustan tady |
||||
brne CARKA ;je to carka? (=3) - jdi na CARKA |
||||
;TECKA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaTecky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
;CARKA |
||||
CARKA: |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaCarky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
|
||||
;tecka/carka dokoncena |
||||
MorsPartDone: ;konec morspartu (=tecka/carka) |
||||
ldi r16,MezeraMorspart ;udelej mezeru |
||||
rcall delay |
||||
rjmp CharFound ;jdi na dalsi cast morspartu |
||||
|
||||
;znak dokoncen |
||||
CharDone: |
||||
ldi r16,MezeraZnak ;mezera za znakem |
||||
rcall delay |
||||
|
||||
pop ZL ;obnov pointer pro text |
||||
pop ZH |
||||
|
||||
rjmp NextCharTxt ;jdi na dalsi znak textu |
||||
|
||||
EndCom: |
||||
ldi r16,10 |
||||
rcall delay |
||||
|
||||
|
||||
BuzzOn |
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
in r24,LEDPORT ;uloz stav ledportu |
||||
cbr r24,0b01000000 ;zapni ledm |
||||
sbr r24,0b10000000 ;zapni pullup |
||||
ldi r23,0b11111111 ;priprav stav pro vypnute ledky |
||||
L3NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=255? pak L3DONE |
||||
breq L3DONE |
||||
mov r16,cmatch |
||||
lsr r16 |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L3OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L3NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
;cbi LEDPORT,ledm ;rozsvit ledmain |
||||
out LEDPORT,r24 ;zapni ledky |
||||
L3INNER: |
||||
dec linner |
||||
breq L3OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L3Ib |
||||
;sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
out LEDPORT,r23 ;zhasni ledky |
||||
L3Ib: |
||||
rjmp L3INNER |
||||
|
||||
L3DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,2 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
USNI: |
||||
;SLEEP (a po probuzeni skok na RESET) |
||||
clr r16 |
||||
out SWPORT,r16 ;vypni pullupy jumperu |
||||
sbi SYSPORT, speak ;vypni speaker (pro jistotu) |
||||
ser r16 |
||||
out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled |
||||
|
||||
|
||||
;nastavit navesti, ze jde o probuzeni po spanku |
||||
ldi r16,AFTER_SLEEP |
||||
mov r5,r16 |
||||
;probudi se pinchange interruptem na PB7 |
||||
in r16, MCUCR |
||||
ori r16, (1<<SE) |
||||
out MCUCR, r16 ;sleep enable && sleep |
||||
|
||||
sleep |
||||
|
||||
in r16, MCUCR |
||||
andi r16, ~(1<<SE) |
||||
out MCUCR, r16 ;sleep disable |
||||
|
||||
;reset |
||||
rjmp RESET |
||||
|
||||
;R U T I N Y |
||||
|
||||
delay: |
||||
;ldi r16,#desetin |
||||
push r17 |
||||
push r18 |
||||
;255*225*7 |
||||
d0: |
||||
ldi r17,255 |
||||
d1: |
||||
ldi r18,227 |
||||
d2: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r18 |
||||
brne d2 |
||||
dec r17 |
||||
brne d1 |
||||
dec r16 |
||||
brne d0 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
ret |
||||
|
||||
|
||||
PINCHANGE: |
||||
mov r16,r5 |
||||
cpi r16,AFTER_SLEEP |
||||
brne NENIPOSLEEPU |
||||
|
||||
;je po SLEEPu -> reset |
||||
ldi r16,2 ;cekej 0.2s |
||||
rcall delay |
||||
clr r5 ;vymazat navesti ze byl SLEEP |
||||
clr r16 |
||||
out GIMSK,r16 ;zakaz pinchange interrupt (general) |
||||
sei |
||||
rjmp RESET ;pri resetu se vynuluje SP a sei uz bylo, takze se reti delat nemusi. bude reset |
||||
|
||||
;preruseni normalniho behu programu tlacitkem -> usnout |
||||
NENIPOSLEEPU: |
||||
ser r16 ;zhasne ledky |
||||
out LEDPORT,r16 |
||||
BuzzOff ;pro jistotu vypne speaker |
||||
ldi r16,20 ;ceka 2 sekundy (aby se tlacitko urcite stihlo uvolnit -> jinak se udela dalsi "pinchange" a hned se to probudi) |
||||
rcall delay |
||||
sei ;povol preruseni (vypnuto pri interruptu) |
||||
rjmp USNI ;usnout (probudi se zmenou PB7) |
||||
|
||||
|
||||
|
||||
; T A B U L K A Z N A K U |
||||
MORSE: |
||||
.DB "A",1,3,0,0,0,0,0 ;A |
||||
.DB "B",3,1,1,1,0,0,0 ;B |
||||
.DB "C",3,1,3,1,0,0,0 ;C |
||||
.DB "D",3,1,1,0,0,0,0 ;D |
||||
.DB "E",1,0,0,0,0,0,0 ;E |
||||
.DB "F",1,1,3,1,0,0,0 ;F |
||||
.DB "G",3,3,1,0,0,0,0 ;G |
||||
.DB "H",1,1,1,1,0,0,0 ;H |
||||
.DB "I",1,1,0,0,0,0,0 ;I |
||||
.DB "J",1,3,3,3,0,0,0 ;J |
||||
.DB "K",3,1,3,0,0,0,0 ;K |
||||
.DB "L",1,3,1,1,0,0,0 ;L |
||||
.DB "M",3,3,0,0,0,0,0 ;M |
||||
.DB "N",3,1,0,0,0,0,0 ;N |
||||
.DB "O",3,3,3,0,0,0,0 ;O |
||||
.DB "P",1,3,3,1,0,0,0 ;P |
||||
.DB "Q",3,3,1,3,0,0,0 ;Q |
||||
.DB "R",1,3,1,0,0,0,0 ;R |
||||
.DB "S",1,1,1,0,0,0,0 ;S |
||||
.DB "T",3,0,0,0,0,0,0 ;T |
||||
.DB "U",1,1,3,0,0,0,0 ;U |
||||
.DB "V",1,1,1,3,0,0,0 ;V |
||||
.DB "W",1,3,3,0,0,0,0 ;W |
||||
.DB "X",3,1,1,3,0,0,0 ;X |
||||
.DB "Y",3,1,3,3,0,0,0 ;Y |
||||
.DB "Z",3,3,1,1,0,0,0 ;Z |
||||
.DB "0",3,3,3,3,3,0,0 ;0 |
||||
.DB "1",1,3,3,3,3,0,0 ;1 |
||||
.DB "2",1,1,3,3,3,0,0 ;2 |
||||
.DB "3",1,1,1,3,3,0,0 ;3 |
||||
.DB "4",1,1,1,1,3,0,0 ;4 |
||||
.DB "5",1,1,1,1,1,0,0 ;5 |
||||
.DB "6",3,1,1,1,1,0,0 ;6 |
||||
.DB "7",3,3,1,1,1,0,0 ;7 |
||||
.DB "8",3,3,3,1,1,0,0 ;8 |
||||
.DB "9",3,3,3,3,1,0,0 ;9 |
||||
.DB ".",1,3,1,3,1,3,0 ;. |
||||
.DB ",",3,3,1,1,3,3,0 ;, |
||||
.DB " ",0,0,0,0,0,0,0 ;space |
||||
.DB 0,0,0,0,0,0,0,0 ;nic=konec tabulky |
||||
|
||||
;T E X T Y K O D V Y S I L A N I |
||||
; |
||||
; 0 1 2 3 4 5 6 7 8 minut9 |
||||
TEXT0: |
||||
.db "TOTO JE NAVIGATOR CHYBI ANTENA HLEDEJ TADY N 50S 12.345 E014S 12.345",0 |
||||
TEXT1: |
||||
.db "POTREBUJI ZESILOVAC LEZI TADY N 50S 12.345 E014S 12.345",0 |
||||
TEXT2: |
||||
.db "SLABY SIGNAL DALSI ANTENA JE ZDE N 50S 12.345 E 14S 12.345",0 |
||||
TEXT3: |
||||
.db "USMERNOVAC VYKONU DOPADL NA N 50S 12.345 E014S 12.345",0 |
||||
TEXT4: |
||||
.db "POLOHA DALSI ANTENY JE N 50S 12.345 E014S 12.345",0 |
||||
TEXT5: |
||||
.db "PRESNOST ZVYSI SUPERSENZOR N 50S 12.345 E014S 12.345",0 |
||||
TEXT6: |
||||
.db "VRAK MODULU ZAMEREN NA N 50S 12.345 E014S 12.345 SLIZ JE NESKODNY",0 |
||||
|
@ -0,0 +1,630 @@ |
||||
;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 |
||||
;------------------------------------------------- |
||||
;Co to dela: |
||||
;Po spusteni plynule rozsviti a zhasle LED MAIN, behem toho houka s promennou frekvenci |
||||
;Povoli uspani zmenou stavu pinu PB7 |
||||
|
||||
|
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) |
||||
;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
|
||||
;N A S T A V E N I V Y S I L A N E M O R S E O V K Y |
||||
;tecka mmorspart carka mznak mmezera mznak carka mmorspart |
||||
.equ DelkaTecky = 3 ;delka tecky v desetinach |
||||
.equ DelkaCarky = 14 ;3x delka tecky = delka carky |
||||
.equ DelkaMezery = 4 ;mznak+tohle+mznak |
||||
.equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene |
||||
.equ MezeraZnak = 19 ;mezera za znakem |
||||
.equ FrekvenceMorse = 50 ;62500/tohle Hz tón 42 |
||||
|
||||
;.equ DelkaTecky = 4 ;delka tecky v desetinach |
||||
;.equ DelkaCarky = 14 ;3x delka tecky = delka carky |
||||
;.equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene |
||||
;.equ MezeraZnak = 14 ;mezera za znakem (pripojena za vnitrni mezeru) |
||||
;.equ FrekvenceMorse = 43 ;62500/tohle Hz |
||||
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
;.equ LEDPIN = PINB |
||||
|
||||
;.equ led0 = 0 |
||||
;.equ led1 = 1 |
||||
;.equ led2 = 2 |
||||
;.equ led3 = 3 |
||||
;.equ led4 = 4 |
||||
;.equ led5 = 5 |
||||
.equ ledm = 6 |
||||
;.equ wakepin = 7 |
||||
.equ AFTER_SLEEP = 0b10101010 ;informace ze byl predtim sleep |
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
;.equ sw0 = 0 |
||||
;.equ sw1 = 1 |
||||
;.equ sw2 = 2 |
||||
;.equ sw3 = 3 |
||||
;.equ sw4 = 4 |
||||
;.equ sw5 = 5 |
||||
|
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
;.def YH = r29 |
||||
;.def YL = r28 |
||||
;.def XH = r27 |
||||
;.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO DefaultTone |
||||
ldi r16,FrekvenceMorse |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000B ;pin change |
||||
rjmp PINCHANGE ;probuzeni nebo preruseni cinnosti |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "MORSE PIPAC SETI 2011",0 ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
clr r5 ;vymaz navesti ze je po probuzeni (r5=AFTER_SLEEP, ted bude 0) |
||||
|
||||
ldi r16, (1<<SM0) ;nastavi sleep mode = power-down (nejuspornejsi) |
||||
out MCUCR, r16 |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (shutdown a speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;shutdown=0 (continue), speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = wakepin |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, wakepin pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
|
||||
;konfigurace pinchange interruptu (jeste je treba zapnout PCIE v GIMSK) |
||||
ldi r16,(1<<PCINT7) |
||||
out PCMSK,r16 ;povol pinchange interrupt pro PB7 (=wakepin) |
||||
|
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
|
||||
|
||||
;plynule rozsviceni ledm + stoupajici ton |
||||
BuzzOn |
||||
ldi cmatch,255 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L1NEXTSTEP: |
||||
dec cmatch ;zvys jas |
||||
breq L1DONE ;je jas=255(full)? pak L1DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L1OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L1NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsviť ledmain |
||||
L1INNER: |
||||
dec linner |
||||
breq L1OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L1Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L1Ib: |
||||
rjmp L1INNER |
||||
|
||||
L1DONE: |
||||
cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) |
||||
|
||||
|
||||
|
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L2NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L2DONE |
||||
breq L2DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L2OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L2NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L2INNER: |
||||
dec linner |
||||
breq L2OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L2Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L2Ib: |
||||
rjmp L2INNER |
||||
|
||||
L2DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,1 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
;ted uz je dost douho po resetu, zepneme moznost uspani wakepinem |
||||
;vymaz zasobnik ext. preruseni |
||||
in r16,EIFR |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
;povol interrupt změny pinu PB7 |
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
|
||||
|
||||
;krouzeni cervenych ledek + pipani |
||||
ldi r18,24 ;celkem 24 preklopeni |
||||
ldi r17,0b11111110 ;posuvny registr - inicializace |
||||
KRUH1: |
||||
sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) |
||||
out LEDPORT, r17 ;vystup |
||||
lsr r17 ;rotuj doprava pres carry |
||||
brcs KRUH1b ;neni carry? preskoc |
||||
cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) |
||||
KRUH1b: |
||||
mov r16,r17 ;vypocet tonu pipnuti |
||||
com r16 |
||||
lsl r16 |
||||
eor r16,r18 |
||||
SetTone |
||||
BuzzOn ;pipni |
||||
ldi r16,2 |
||||
rcall delay |
||||
BuzzOff |
||||
dec r18 |
||||
brne KRUH1 ;neni-li to posledni preklopeni, opakuj |
||||
K1DONE: |
||||
DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) |
||||
|
||||
|
||||
;zhasni vse |
||||
ldi r16,0b11111111 |
||||
out LEDPORT,r16 ;vypni ledky |
||||
ldi r16,4 |
||||
rcall delay ;cekej 0.4s |
||||
|
||||
;ukaz co je zapojeno (cervenymi ledkami) |
||||
in r25, SWPIN ;prijmout stav SWPORTu |
||||
andi r25,0b00111111 ;ignoruj nepouzite piny |
||||
mov r16,r25 |
||||
sbr r16,0b11000000 |
||||
out LEDPORT,r16 ;ukazat na LEDPORTu |
||||
|
||||
;cekej 2 sekundy |
||||
ldi r16,20 ;pauza 2s |
||||
rcall delay |
||||
|
||||
;spocitani zapnutych jumperu |
||||
;r25 obsahuje stav SWPINu (bity 0-5) |
||||
sbr r25,0b11000000 ;zapni i nepouzite bity |
||||
com r25 ;neguj (jumpery jsou na zem) -> aktivni budou 1 |
||||
clr r24 ;priprav citac aktivnich jumperu |
||||
clr r16 ;nulovej registr pro ADC (aby procetl jen carry) |
||||
COUNTL: |
||||
lsr r25 ;(r25>>1) bit 0 do carry |
||||
adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) |
||||
cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL |
||||
brne COUNTL |
||||
|
||||
;r24 obsahuje pocet zaplych bitu |
||||
COUNTDONE: |
||||
cpi r24,6 ;je 6 jumperu? |
||||
brne TEST5 |
||||
ldi ZH,high(TEXT6*2) |
||||
ldi ZL,low(TEXT6*2) |
||||
rjmp TESTDONE |
||||
TEST5: |
||||
cpi r24,5 ;je 5 jumperu? |
||||
brne TEST4 |
||||
ldi ZH,high(TEXT5*2) |
||||
ldi ZL,low(TEXT5*2) |
||||
rjmp TESTDONE |
||||
TEST4: |
||||
cpi r24,4 ;jsou 4 jumpery? |
||||
brne TEST3 |
||||
ldi ZH,high(TEXT4*2) |
||||
ldi ZL,low(TEXT4*2) |
||||
rjmp TESTDONE |
||||
TEST3: |
||||
cpi r24,3 ;jsou 3 jumpery? |
||||
brne TEST2 |
||||
ldi ZH,high(TEXT3*2) |
||||
ldi ZL,low(TEXT3*2) |
||||
rjmp TESTDONE |
||||
TEST2: |
||||
cpi r24,2 ;jsou 2 jumpery? |
||||
brne TEST1 |
||||
ldi ZH,high(TEXT2*2) |
||||
ldi ZL,low(TEXT2*2) |
||||
rjmp TESTDONE |
||||
TEST1: |
||||
cpi r24,1 ;je 1 jumper? |
||||
brne TEST0 |
||||
ldi ZH,high(TEXT1*2) |
||||
ldi ZL,low(TEXT1*2) |
||||
rjmp TESTDONE |
||||
TEST0: |
||||
ldi ZH,high(TEXT0*2) ;je 0 jumperu. |
||||
ldi ZL,low(TEXT0*2) |
||||
TESTDONE: |
||||
|
||||
;Z obsahuje pointer na zacatek vysilaneho textu. |
||||
;Dalsi znak textu (nebo prvni) |
||||
NextCharTxt: |
||||
lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi |
||||
cpi curchar,0 |
||||
breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec |
||||
|
||||
push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) |
||||
push ZL |
||||
|
||||
;hledani znaku v tabulce |
||||
ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z |
||||
ldi ZL,low(MORSE*2) |
||||
NextCharTbl: |
||||
lpm morspart,Z+ ;precti znak z tabulky |
||||
|
||||
cpi morspart,0 ;je to 0? (= konec tabulky) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cp morspart,curchar ;je to hledany znak? |
||||
breq CharFound ;pak jdi na CharFound |
||||
adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) |
||||
rjmp NextCharTbl |
||||
|
||||
;znak nalezen v tabulce |
||||
CharFound: |
||||
lpm morspart,Z+ ;nacti MorsPart |
||||
cpi morspart,0 ;je to 0? (= konec znaku) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cpi morspart,1 ;je to tecka? (=1) - zustan tady |
||||
brne CARKA ;je to carka nebo mezera? (=3/4) - jdi na CARKA |
||||
;TECKA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaTecky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
;CARKA |
||||
CARKA: |
||||
cpi morspart,3 ;je to carka? (=3) - zustan tady |
||||
brne MEZERA ;je to mezera? (=4) - jdi na MEZERA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaCarky ;cekej podle DelkaCarky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
MEZERA: |
||||
ldi r16,DelkaMezery ;cekej podle DelkaMezery |
||||
rcall delay |
||||
rjmp CharFound |
||||
|
||||
;tecka/carka/mezera dokoncena |
||||
MorsPartDone: ;konec morspartu (=tecka/carka) |
||||
ldi r16,MezeraMorspart ;udelej mezeru |
||||
rcall delay |
||||
rjmp CharFound ;jdi na dalsi cast morspartu |
||||
|
||||
;znak dokoncen |
||||
CharDone: |
||||
ldi r16,MezeraZnak ;mezera za znakem |
||||
rcall delay |
||||
|
||||
pop ZL ;obnov pointer pro text |
||||
pop ZH |
||||
|
||||
rjmp NextCharTxt ;jdi na dalsi znak textu |
||||
|
||||
EndCom: |
||||
ldi r16,10 |
||||
rcall delay |
||||
|
||||
|
||||
BuzzOn |
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
in r24,LEDPORT ;uloz stav ledportu |
||||
cbr r24,0b01000000 ;zapni ledm |
||||
sbr r24,0b10000000 ;zapni pullup |
||||
ldi r23,0b11111111 ;priprav stav pro vypnute ledky |
||||
L3NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=255? pak L3DONE |
||||
breq L3DONE |
||||
mov r16,cmatch |
||||
lsr r16 |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L3OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L3NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
;cbi LEDPORT,ledm ;rozsvit ledmain |
||||
out LEDPORT,r24 ;zapni ledky |
||||
L3INNER: |
||||
dec linner |
||||
breq L3OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L3Ib |
||||
;sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
out LEDPORT,r23 ;zhasni ledky |
||||
L3Ib: |
||||
rjmp L3INNER |
||||
|
||||
L3DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,2 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
USNI: |
||||
;SLEEP (a po probuzeni skok na RESET) |
||||
|
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
clr r16 |
||||
out SWPORT,r16 ;vypni pullupy jumperu |
||||
sbi SYSPORT, speak ;vypni speaker (pro jistotu) |
||||
ser r16 |
||||
out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled |
||||
|
||||
|
||||
;nastavit navesti, ze jde o probuzeni po spanku |
||||
ldi r16,AFTER_SLEEP |
||||
mov r5,r16 |
||||
;probudi se pinchange interruptem na PB7 |
||||
in r16, MCUCR |
||||
ori r16, (1<<SE) |
||||
out MCUCR, r16 ;sleep enable && sleep |
||||
|
||||
sleep |
||||
|
||||
in r16, MCUCR |
||||
andi r16, ~(1<<SE) |
||||
out MCUCR, r16 ;sleep disable |
||||
|
||||
;reset |
||||
rjmp RESET |
||||
|
||||
;R U T I N Y |
||||
|
||||
delay: |
||||
;ldi r16,#desetin |
||||
push r17 |
||||
push r18 |
||||
;255*225*7 |
||||
d0: |
||||
ldi r17,255 |
||||
d1: |
||||
ldi r18,227 |
||||
d2: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r18 |
||||
brne d2 |
||||
dec r17 |
||||
brne d1 |
||||
dec r16 |
||||
brne d0 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
ret |
||||
|
||||
|
||||
PINCHANGE: |
||||
mov r16,r5 |
||||
cpi r16,AFTER_SLEEP |
||||
brne NENIPOSLEEPU |
||||
|
||||
;je po SLEEPu -> reset |
||||
ldi r16,2 ;cekej 0.2s |
||||
rcall delay |
||||
clr r5 ;vymazat navesti ze byl SLEEP |
||||
|
||||
clr r16 |
||||
out GIMSK,r16 ;zakaz pinchange interrupt (general) |
||||
|
||||
sei |
||||
rjmp RESET ;pri resetu se vynuluje SP a sei uz bylo, takze se reti delat nemusi. bude reset |
||||
|
||||
;preruseni normalniho behu programu tlacitkem -> usnout |
||||
NENIPOSLEEPU: |
||||
ser r16 ;zhasne ledky |
||||
out LEDPORT,r16 |
||||
BuzzOff ;pro jistotu vypne speaker |
||||
ldi r16,15 ;ceka 1.5 sekundy (aby se tlacitko urcite stihlo uvolnit -> jinak se udela dalsi "pinchange" a hned se to probudi) |
||||
rcall delay |
||||
|
||||
in r16,EIFR ;vymaz zasobnik ext. preruseni (behem cekani bylo tlacitko pusteno -> vygenerovan dalsi interrupt) |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
|
||||
sei ;povol preruseni (vypnuto pri interruptu) |
||||
rjmp USNI ;usnout (probudi se zmenou PB7) |
||||
|
||||
|
||||
|
||||
; T A B U L K A Z N A K U |
||||
MORSE: |
||||
.DB "A",1,3,0,0,0,0,0 ;A |
||||
.DB "B",3,1,1,1,0,0,0 ;B |
||||
.DB "C",3,1,3,1,0,0,0 ;C |
||||
.DB "D",3,1,1,0,0,0,0 ;D |
||||
.DB "E",1,0,0,0,0,0,0 ;E |
||||
.DB "F",1,1,3,1,0,0,0 ;F |
||||
.DB "G",3,3,1,0,0,0,0 ;G |
||||
.DB "H",1,1,1,1,0,0,0 ;H |
||||
.DB "I",1,1,0,0,0,0,0 ;I |
||||
.DB "J",1,3,3,3,0,0,0 ;J |
||||
.DB "K",3,1,3,0,0,0,0 ;K |
||||
.DB "L",1,3,1,1,0,0,0 ;L |
||||
.DB "M",3,3,0,0,0,0,0 ;M |
||||
.DB "N",3,1,0,0,0,0,0 ;N |
||||
.DB "O",3,3,3,0,0,0,0 ;O |
||||
.DB "P",1,3,3,1,0,0,0 ;P |
||||
.DB "Q",3,3,1,3,0,0,0 ;Q |
||||
.DB "R",1,3,1,0,0,0,0 ;R |
||||
.DB "S",1,1,1,0,0,0,0 ;S |
||||
.DB "T",3,0,0,0,0,0,0 ;T |
||||
.DB "U",1,1,3,0,0,0,0 ;U |
||||
.DB "V",1,1,1,3,0,0,0 ;V |
||||
.DB "W",1,3,3,0,0,0,0 ;W |
||||
.DB "X",3,1,1,3,0,0,0 ;X |
||||
.DB "Y",3,1,3,3,0,0,0 ;Y |
||||
.DB "Z",3,3,1,1,0,0,0 ;Z |
||||
.DB "0",3,3,3,3,3,0,0 ;0 |
||||
.DB "1",1,3,3,3,3,0,0 ;1 |
||||
.DB "2",1,1,3,3,3,0,0 ;2 |
||||
.DB "3",1,1,1,3,3,0,0 ;3 |
||||
.DB "4",1,1,1,1,3,0,0 ;4 |
||||
.DB "5",1,1,1,1,1,0,0 ;5 |
||||
.DB "6",3,1,1,1,1,0,0 ;6 |
||||
.DB "7",3,3,1,1,1,0,0 ;7 |
||||
.DB "8",3,3,3,1,1,0,0 ;8 |
||||
.DB "9",3,3,3,3,1,0,0 ;9 |
||||
.DB ".",1,3,1,3,1,3,0 ;. |
||||
.DB ",",3,3,1,1,3,3,0 ;, |
||||
.DB " ",4,0,0,0,0,0,0 ;space |
||||
.DB 0,0,0,0,0,0,0,0 ;nic=konec tabulky |
||||
|
||||
;T E X T Y K O D V Y S I L A N I |
||||
; |
||||
; 0 1 2 3 4 5 6 minut cca |
||||
TEXT0: |
||||
.db "JSEM NAVIGATOR NEMOHU ZAMERIT MODUL HLEDEJTE ANTENU NA N50 03.264 E014 24.965",0 ;gps=vesl.ostrov FINAL |
||||
TEXT1: |
||||
.db "POTREBUJI ZESILOVAC LEZI ZDE N50 03.067 E014 25.170",0 ;gps=kavky FINAL |
||||
TEXT2: |
||||
.db "SLABY SIGNAL ZAPOJTE DALSI ANTENU N50 02.547 E014 24.823 NAHORE",0 ;gps=dobeska FINAL |
||||
TEXT3: |
||||
.db "USMERNOVAC VYKONU DOPADL NA N50 02.858 E014 24.529",0 ;gps=kostel zlichov FINAL |
||||
TEXT4: |
||||
.db "POLOHA DALSI ANTENY JE N50 03.073 E014 24.150",0 ;gps=skala prokopak FINAL |
||||
TEXT5: |
||||
.db "PRESNOST ZVYSI SUPERSENZOR N50 03.344 E014 24.822",0 ;gps=kempovy ostrov FINAL |
||||
TEXT6: |
||||
.db "VRAK MODULU ZAMEREN NA N50 03.034 E014 24.928 MUZETE SI HO NECHAT",0 ;gps=bosan FINAL |
||||
|
@ -0,0 +1,175 @@ |
||||
|
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) |
||||
;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
.equ FrekvenceMorse = 50 ;62500/tohle Hz tón 42 |
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
.equ inkey = 7 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
.equ LEDPIN = PINB |
||||
|
||||
.equ ledm = 6 |
||||
|
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
;.def YH = r29 |
||||
;.def YL = r28 |
||||
;.def XH = r27 |
||||
;.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
;.MACRO DefaultTone |
||||
; ldi r16,FrekvenceMorse |
||||
; out OCR0A,r16 |
||||
;.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "PIPAC PRO PUNTU NA MORSE" |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = pip |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, pip pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
ldi r16,50 |
||||
SetTone |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
sei ;Global Interrupt Enable |
||||
ldi r20,0b10000000 |
||||
loop: |
||||
in r19,LEDPIN |
||||
andi r19,0b10000000 |
||||
cp r19,r20 |
||||
breq loop ;beze zmeny, opakuj test |
||||
|
||||
|
||||
ldi r16,255 |
||||
l1: in r18,LEDPIN |
||||
andi r18,0b10000000 |
||||
cp r18,r19 ;nacti LEDPIN. je porad stajny? (255x) |
||||
brne loop ;ne -> loop |
||||
dec r16 ;jo -> dalsi test shodnosti, l1 |
||||
brne l1 |
||||
|
||||
mov r20,r19 ;uloz jako minulou hodnotu pinu |
||||
cpi r20,0b10000000 ;je nestisknuto? |
||||
breq beepoff ;vypni pip |
||||
ldi r16,0b10000000 |
||||
out LEDPORT,r16 ;rozsvit ledky |
||||
BuzzOn ;jinak pipej |
||||
rjmp loop |
||||
beepoff: |
||||
BuzzOff |
||||
ldi r16,0b11111111 |
||||
out LEDPORT, r16 ;zhasni ledky |
||||
out LEDPORT,r16 |
||||
rjmp loop |
@ -0,0 +1,630 @@ |
||||
;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 |
||||
;------------------------------------------------- |
||||
;Co to dela: |
||||
;Po spusteni plynule rozsviti a zhasle LED MAIN, behem toho houka s promennou frekvenci |
||||
;Povoli uspani zmenou stavu pinu PB7 |
||||
|
||||
|
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V |
||||
; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND |
||||
; SW1 G --+ PD1 PB6 +-- LED MAIN K |
||||
; --+ PA1 PB5 +-- LED 5 K |
||||
; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K |
||||
; SW2 G --+ PD2 PB3 +-- LED 3 K |
||||
; SW3 G --+ PD3 PB2 +-- LED 2 K |
||||
; SW4 G --+ PD4 PB1 +-- LED 1 K |
||||
; SW5 G --+ PD5 PB0 +-- LED 0 K |
||||
; GND --+ GND PD6 +-- |
||||
; +-------------+ |
||||
;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) |
||||
;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) |
||||
|
||||
.device attiny2313 |
||||
;běží na 4MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE2 |
||||
;HFUSE: 0xDF |
||||
|
||||
|
||||
|
||||
;N A S T A V E N I V Y S I L A N E M O R S E O V K Y |
||||
;tecka mmorspart carka mznak mmezera mznak carka mmorspart |
||||
.equ DelkaTecky = 3 ;delka tecky v desetinach |
||||
.equ DelkaCarky = 14 ;3x delka tecky = delka carky |
||||
.equ DelkaMezery = 6 ;mznak+tohle+mznak |
||||
.equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene |
||||
.equ MezeraZnak = 21 ;mezera za znakem |
||||
.equ FrekvenceMorse = 50 ;62500/tohle Hz tón 42 |
||||
|
||||
;.equ DelkaTecky = 4 ;delka tecky v desetinach |
||||
;.equ DelkaCarky = 14 ;3x delka tecky = delka carky |
||||
;.equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene |
||||
;.equ MezeraZnak = 14 ;mezera za znakem (pripojena za vnitrni mezeru) |
||||
;.equ FrekvenceMorse = 43 ;62500/tohle Hz |
||||
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U |
||||
;PORTA |
||||
.equ SYSPORT = PORTA |
||||
.equ SYSPIN = PINA |
||||
.equ SYSDDR = DDRA |
||||
|
||||
.equ speak = 0 |
||||
|
||||
|
||||
;PORTB |
||||
.equ LEDPORT = PORTB |
||||
.equ LEDDDR = DDRB |
||||
;.equ LEDPIN = PINB |
||||
|
||||
;.equ led0 = 0 |
||||
;.equ led1 = 1 |
||||
;.equ led2 = 2 |
||||
;.equ led3 = 3 |
||||
;.equ led4 = 4 |
||||
;.equ led5 = 5 |
||||
.equ ledm = 6 |
||||
;.equ wakepin = 7 |
||||
.equ AFTER_SLEEP = 0b10101010 ;informace ze byl predtim sleep |
||||
|
||||
|
||||
;PORTD |
||||
.equ SWPORT = PORTD |
||||
.equ SWPIN = PIND |
||||
.equ SWDDR = DDRD |
||||
|
||||
;.equ sw0 = 0 |
||||
;.equ sw1 = 1 |
||||
;.equ sw2 = 2 |
||||
;.equ sw3 = 3 |
||||
;.equ sw4 = 4 |
||||
;.equ sw5 = 5 |
||||
|
||||
|
||||
|
||||
;A L I A S Y R E G I S T R U |
||||
.def cmatch = r19 |
||||
.def louter = r18 |
||||
.def linner = r17 |
||||
.def curchar = r25 |
||||
.def morspart = r24 |
||||
|
||||
;aliasy pointerů |
||||
.def ZH = r31 |
||||
.def ZL = r30 |
||||
;.def YH = r29 |
||||
;.def YL = r28 |
||||
;.def XH = r27 |
||||
;.def XL = r26 |
||||
|
||||
|
||||
|
||||
; M A K R A |
||||
;Reprak (zapnuti a vypnuti pipani 1kHz) |
||||
.MACRO BuzzOn |
||||
sbi SYSPORT,speak |
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 zapnut, prescaler na 64 (4000000/64=62500) |
||||
out TCCR0B,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO BuzzOff |
||||
clr r16 ;TC0 vypnut (hodiny zastaveny) |
||||
out TCCR0B,r16 |
||||
sbi SYSPORT,speak ;vymazat speak (aby netekl proud reprakem) |
||||
.ENDMACRO |
||||
|
||||
.MACRO SetTone |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
.MACRO DefaultTone |
||||
ldi r16,FrekvenceMorse |
||||
out OCR0A,r16 |
||||
.ENDMACRO |
||||
|
||||
|
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
;vektory preruseni |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x000B ;pin change |
||||
rjmp PINCHANGE ;probuzeni nebo preruseni cinnosti |
||||
|
||||
.org 0x000D ;TC0 Compare match A |
||||
sbi SYSPIN,speak ;přepnout speak |
||||
reti ;návrat do programu (0x000E) |
||||
|
||||
.org 0x0013 |
||||
|
||||
;nastaveni po resetu |
||||
.DB "MORSE PIPAC SETI 2011",0 ;(nazev programu) |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
cli ;zakazat vsechna preruseni |
||||
clr r5 ;vymaz navesti ze je po probuzeni (r5=AFTER_SLEEP, ted bude 0) |
||||
|
||||
ldi r16, (1<<SM0) ;nastavi sleep mode = power-down (nejuspornejsi) |
||||
out MCUCR, r16 |
||||
|
||||
; Nastaveni portu |
||||
;PORTA = SYSPORT |
||||
ldi r16,0b00000011 ;smer portu A - vse na výstup (shutdown a speak) |
||||
out SYSDDR,r16 |
||||
ldi r16,0b00000001 ;shutdown=0 (continue), speak=1 (je mezi Vcc a timhle, takze skrz nej nic netece) |
||||
out SYSPORT,r16 |
||||
|
||||
;PORTB = LEDPORT |
||||
ldi r16,0b01111111 ;smer portu B - vystupni (ledky) - použijou se piny 0-6, 7. = wakepin |
||||
out LEDDDR,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1 = ledky zhasnuty, wakepin pullup enabled |
||||
out LEDPORT,r16 |
||||
|
||||
;PORTD = SWPORT |
||||
ldi r16,0b00000000 ;smer portu D - vse na vstup (tlačítka) - použijou se jen piny 0-5, 6. zbyde |
||||
out SWDDR,r16 |
||||
ldi r16,0b01111111 ;enable pullup |
||||
out SWPORT,r16 |
||||
|
||||
; timer0 - generator f=1kHz (pipak) |
||||
ldi r16,(1<<WGM01) ;port se neovlivnuje citacem, CTC mod |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,62 ;compare match = 62 (vystupni frekvence 1kHz) |
||||
out OCR0A,r16 |
||||
|
||||
ldi r16,(1<<OCIE0A) ;povolit interupt z casovace (jeste nutno zapnout: makro BuzzOn) |
||||
out TIMSK,r16 |
||||
|
||||
;pipani aktivuje makro BuzzOn, vypne makro BuzzOff |
||||
|
||||
;konfigurace pinchange interruptu (jeste je treba zapnout PCIE v GIMSK) |
||||
ldi r16,(1<<PCINT7) |
||||
out PCMSK,r16 ;povol pinchange interrupt pro PB7 (=wakepin) |
||||
|
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
|
||||
|
||||
;plynule rozsviceni ledm + stoupajici ton |
||||
BuzzOn |
||||
ldi cmatch,255 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L1NEXTSTEP: |
||||
dec cmatch ;zvys jas |
||||
breq L1DONE ;je jas=255(full)? pak L1DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L1OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L1NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsviť ledmain |
||||
L1INNER: |
||||
dec linner |
||||
breq L1OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L1Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L1Ib: |
||||
rjmp L1INNER |
||||
|
||||
L1DONE: |
||||
cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) |
||||
|
||||
|
||||
|
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
L2NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=0? pak L2DONE |
||||
breq L2DONE |
||||
mov r16,cmatch |
||||
SetTone |
||||
ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L2OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L2NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
cbi LEDPORT,ledm ;rozsvit ledmain |
||||
L2INNER: |
||||
dec linner |
||||
breq L2OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L2Ib |
||||
sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
L2Ib: |
||||
rjmp L2INNER |
||||
|
||||
L2DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,1 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
;ted uz je dost douho po resetu, zepneme moznost uspani wakepinem |
||||
;vymaz zasobnik ext. preruseni |
||||
in r16,EIFR |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
;povol interrupt změny pinu PB7 |
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
|
||||
|
||||
;krouzeni cervenych ledek + pipani |
||||
ldi r18,24 ;celkem 24 preklopeni |
||||
ldi r17,0b11111110 ;posuvny registr - inicializace |
||||
KRUH1: |
||||
sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) |
||||
out LEDPORT, r17 ;vystup |
||||
lsr r17 ;rotuj doprava pres carry |
||||
brcs KRUH1b ;neni carry? preskoc |
||||
cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) |
||||
KRUH1b: |
||||
mov r16,r17 ;vypocet tonu pipnuti |
||||
com r16 |
||||
lsl r16 |
||||
eor r16,r18 |
||||
SetTone |
||||
BuzzOn ;pipni |
||||
ldi r16,2 |
||||
rcall delay |
||||
BuzzOff |
||||
dec r18 |
||||
brne KRUH1 ;neni-li to posledni preklopeni, opakuj |
||||
K1DONE: |
||||
DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) |
||||
|
||||
|
||||
;zhasni vse |
||||
ldi r16,0b11111111 |
||||
out LEDPORT,r16 ;vypni ledky |
||||
ldi r16,4 |
||||
rcall delay ;cekej 0.4s |
||||
|
||||
;ukaz co je zapojeno (cervenymi ledkami) |
||||
in r25, SWPIN ;prijmout stav SWPORTu |
||||
andi r25,0b00111111 ;ignoruj nepouzite piny |
||||
mov r16,r25 |
||||
sbr r16,0b11000000 |
||||
out LEDPORT,r16 ;ukazat na LEDPORTu |
||||
|
||||
;cekej 2 sekundy |
||||
ldi r16,20 ;pauza 2s |
||||
rcall delay |
||||
|
||||
;spocitani zapnutych jumperu |
||||
;r25 obsahuje stav SWPINu (bity 0-5) |
||||
sbr r25,0b11000000 ;zapni i nepouzite bity |
||||
com r25 ;neguj (jumpery jsou na zem) -> aktivni budou 1 |
||||
clr r24 ;priprav citac aktivnich jumperu |
||||
clr r16 ;nulovej registr pro ADC (aby procetl jen carry) |
||||
COUNTL: |
||||
lsr r25 ;(r25>>1) bit 0 do carry |
||||
adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) |
||||
cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL |
||||
brne COUNTL |
||||
|
||||
;r24 obsahuje pocet zaplych bitu |
||||
COUNTDONE: |
||||
cpi r24,6 ;je 6 jumperu? |
||||
brne TEST5 |
||||
ldi ZH,high(TEXT6*2) |
||||
ldi ZL,low(TEXT6*2) |
||||
rjmp TESTDONE |
||||
TEST5: |
||||
cpi r24,5 ;je 5 jumperu? |
||||
brne TEST4 |
||||
ldi ZH,high(TEXT5*2) |
||||
ldi ZL,low(TEXT5*2) |
||||
rjmp TESTDONE |
||||
TEST4: |
||||
cpi r24,4 ;jsou 4 jumpery? |
||||
brne TEST3 |
||||
ldi ZH,high(TEXT4*2) |
||||
ldi ZL,low(TEXT4*2) |
||||
rjmp TESTDONE |
||||
TEST3: |
||||
cpi r24,3 ;jsou 3 jumpery? |
||||
brne TEST2 |
||||
ldi ZH,high(TEXT3*2) |
||||
ldi ZL,low(TEXT3*2) |
||||
rjmp TESTDONE |
||||
TEST2: |
||||
cpi r24,2 ;jsou 2 jumpery? |
||||
brne TEST1 |
||||
ldi ZH,high(TEXT2*2) |
||||
ldi ZL,low(TEXT2*2) |
||||
rjmp TESTDONE |
||||
TEST1: |
||||
cpi r24,1 ;je 1 jumper? |
||||
brne TEST0 |
||||
ldi ZH,high(TEXT1*2) |
||||
ldi ZL,low(TEXT1*2) |
||||
rjmp TESTDONE |
||||
TEST0: |
||||
ldi ZH,high(TEXT0*2) ;je 0 jumperu. |
||||
ldi ZL,low(TEXT0*2) |
||||
TESTDONE: |
||||
|
||||
;Z obsahuje pointer na zacatek vysilaneho textu. |
||||
;Dalsi znak textu (nebo prvni) |
||||
NextCharTxt: |
||||
lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi |
||||
cpi curchar,0 |
||||
breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec |
||||
|
||||
push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) |
||||
push ZL |
||||
|
||||
;hledani znaku v tabulce |
||||
ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z |
||||
ldi ZL,low(MORSE*2) |
||||
NextCharTbl: |
||||
lpm morspart,Z+ ;precti znak z tabulky |
||||
|
||||
cpi morspart,0 ;je to 0? (= konec tabulky) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cp morspart,curchar ;je to hledany znak? |
||||
breq CharFound ;pak jdi na CharFound |
||||
adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) |
||||
rjmp NextCharTbl |
||||
|
||||
;znak nalezen v tabulce |
||||
CharFound: |
||||
lpm morspart,Z+ ;nacti MorsPart |
||||
cpi morspart,0 ;je to 0? (= konec znaku) |
||||
breq CharDone ;pak jdi na CharDone |
||||
|
||||
cpi morspart,1 ;je to tecka? (=1) - zustan tady |
||||
brne CARKA ;je to carka nebo mezera? (=3/4) - jdi na CARKA |
||||
;TECKA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaTecky ;cekej podle DelkaTecky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
;CARKA |
||||
CARKA: |
||||
cpi morspart,3 ;je to carka? (=3) - zustan tady |
||||
brne MEZERA ;je to mezera? (=4) - jdi na MEZERA |
||||
cbi LEDPORT, ledm ;rozsvit ledm |
||||
BuzzOn ;zacni pipnuti |
||||
ldi r16,DelkaCarky ;cekej podle DelkaCarky |
||||
rcall delay |
||||
BuzzOff ;konec pipnuti |
||||
sbi LEDPORT, ledm ;zhasni ledm |
||||
rjmp MorsPartDone ;konec morspartu -> MorsPartDone |
||||
|
||||
MEZERA: |
||||
ldi r16,DelkaMezery ;cekej podle DelkaMezery |
||||
rcall delay |
||||
rjmp CharFound |
||||
|
||||
;tecka/carka/mezera dokoncena |
||||
MorsPartDone: ;konec morspartu (=tecka/carka) |
||||
ldi r16,MezeraMorspart ;udelej mezeru |
||||
rcall delay |
||||
rjmp CharFound ;jdi na dalsi cast morspartu |
||||
|
||||
;znak dokoncen |
||||
CharDone: |
||||
ldi r16,MezeraZnak ;mezera za znakem |
||||
rcall delay |
||||
|
||||
pop ZL ;obnov pointer pro text |
||||
pop ZH |
||||
|
||||
rjmp NextCharTxt ;jdi na dalsi znak textu |
||||
|
||||
EndCom: |
||||
ldi r16,10 |
||||
rcall delay |
||||
|
||||
|
||||
BuzzOn |
||||
;plynule zhasnuti ledm + klesajici ton |
||||
ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) |
||||
in r24,LEDPORT ;uloz stav ledportu |
||||
cbr r24,0b01000000 ;zapni ledm |
||||
sbr r24,0b10000000 ;zapni pullup |
||||
ldi r23,0b11111111 ;priprav stav pro vypnute ledky |
||||
L3NEXTSTEP: |
||||
inc cmatch ;sniz jas |
||||
cpi cmatch,255 ;je jas=255? pak L3DONE |
||||
breq L3DONE |
||||
mov r16,cmatch |
||||
lsr r16 |
||||
SetTone |
||||
ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) |
||||
L3OUTER: |
||||
dec louter ;je konec louter? pak novy jas |
||||
breq L3NEXTSTEP |
||||
ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu |
||||
;cbi LEDPORT,ledm ;rozsvit ledmain |
||||
out LEDPORT,r24 ;zapni ledky |
||||
L3INNER: |
||||
dec linner |
||||
breq L3OUTER |
||||
cp linner,cmatch ;je cmatch? |
||||
brne L3Ib |
||||
;sbi LEDPORT,ledm ;jo -> zhasni ledmain |
||||
out LEDPORT,r23 ;zhasni ledky |
||||
L3Ib: |
||||
rjmp L3INNER |
||||
|
||||
L3DONE: |
||||
sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) |
||||
ldi r16,2 ;prodleva, aby ton neznel tak uriznute |
||||
rcall delay |
||||
BuzzOff ;vypnout zvuk |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
USNI: |
||||
;SLEEP (a po probuzeni skok na RESET) |
||||
|
||||
ldi r16,(1<<PCIE) |
||||
out GIMSK,r16 ;povol pinchange interrupt (general) |
||||
|
||||
clr r16 |
||||
out SWPORT,r16 ;vypni pullupy jumperu |
||||
sbi SYSPORT, speak ;vypni speaker (pro jistotu) |
||||
ser r16 |
||||
out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled |
||||
|
||||
|
||||
;nastavit navesti, ze jde o probuzeni po spanku |
||||
ldi r16,AFTER_SLEEP |
||||
mov r5,r16 |
||||
;probudi se pinchange interruptem na PB7 |
||||
in r16, MCUCR |
||||
ori r16, (1<<SE) |
||||
out MCUCR, r16 ;sleep enable && sleep |
||||
|
||||
sleep |
||||
|
||||
in r16, MCUCR |
||||
andi r16, ~(1<<SE) |
||||
out MCUCR, r16 ;sleep disable |
||||
|
||||
;reset |
||||
rjmp RESET |
||||
|
||||
;R U T I N Y |
||||
|
||||
delay: |
||||
;ldi r16,#desetin |
||||
push r17 |
||||
push r18 |
||||
;255*225*7 |
||||
d0: |
||||
ldi r17,255 |
||||
d1: |
||||
ldi r18,227 |
||||
d2: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r18 |
||||
brne d2 |
||||
dec r17 |
||||
brne d1 |
||||
dec r16 |
||||
brne d0 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
ret |
||||
|
||||
|
||||
PINCHANGE: |
||||
mov r16,r5 |
||||
cpi r16,AFTER_SLEEP |
||||
brne NENIPOSLEEPU |
||||
|
||||
;je po SLEEPu -> reset |
||||
ldi r16,2 ;cekej 0.2s |
||||
rcall delay |
||||
clr r5 ;vymazat navesti ze byl SLEEP |
||||
|
||||
clr r16 |
||||
out GIMSK,r16 ;zakaz pinchange interrupt (general) |
||||
|
||||
sei |
||||
rjmp RESET ;pri resetu se vynuluje SP a sei uz bylo, takze se reti delat nemusi. bude reset |
||||
|
||||
;preruseni normalniho behu programu tlacitkem -> usnout |
||||
NENIPOSLEEPU: |
||||
ser r16 ;zhasne ledky |
||||
out LEDPORT,r16 |
||||
BuzzOff ;pro jistotu vypne speaker |
||||
ldi r16,15 ;ceka 1.5 sekundy (aby se tlacitko urcite stihlo uvolnit -> jinak se udela dalsi "pinchange" a hned se to probudi) |
||||
rcall delay |
||||
|
||||
in r16,EIFR ;vymaz zasobnik ext. preruseni (behem cekani bylo tlacitko pusteno -> vygenerovan dalsi interrupt) |
||||
andi r16,(1<<PCIF) |
||||
out EIFR,r16 |
||||
|
||||
sei ;povol preruseni (vypnuto pri interruptu) |
||||
rjmp USNI ;usnout (probudi se zmenou PB7) |
||||
|
||||
|
||||
|
||||
; T A B U L K A Z N A K U |
||||
MORSE: |
||||
.DB "A",1,3,0,0,0,0,0 ;A |
||||
.DB "B",3,1,1,1,0,0,0 ;B |
||||
.DB "C",3,1,3,1,0,0,0 ;C |
||||
.DB "D",3,1,1,0,0,0,0 ;D |
||||
.DB "E",1,0,0,0,0,0,0 ;E |
||||
.DB "F",1,1,3,1,0,0,0 ;F |
||||
.DB "G",3,3,1,0,0,0,0 ;G |
||||
.DB "H",1,1,1,1,0,0,0 ;H |
||||
.DB "I",1,1,0,0,0,0,0 ;I |
||||
.DB "J",1,3,3,3,0,0,0 ;J |
||||
.DB "K",3,1,3,0,0,0,0 ;K |
||||
.DB "L",1,3,1,1,0,0,0 ;L |
||||
.DB "M",3,3,0,0,0,0,0 ;M |
||||
.DB "N",3,1,0,0,0,0,0 ;N |
||||
.DB "O",3,3,3,0,0,0,0 ;O |
||||
.DB "P",1,3,3,1,0,0,0 ;P |
||||
.DB "Q",3,3,1,3,0,0,0 ;Q |
||||
.DB "R",1,3,1,0,0,0,0 ;R |
||||
.DB "S",1,1,1,0,0,0,0 ;S |
||||
.DB "T",3,0,0,0,0,0,0 ;T |
||||
.DB "U",1,1,3,0,0,0,0 ;U |
||||
.DB "V",1,1,1,3,0,0,0 ;V |
||||
.DB "W",1,3,3,0,0,0,0 ;W |
||||
.DB "X",3,1,1,3,0,0,0 ;X |
||||
.DB "Y",3,1,3,3,0,0,0 ;Y |
||||
.DB "Z",3,3,1,1,0,0,0 ;Z |
||||
.DB "0",3,3,3,3,3,0,0 ;0 |
||||
.DB "1",1,3,3,3,3,0,0 ;1 |
||||
.DB "2",1,1,3,3,3,0,0 ;2 |
||||
.DB "3",1,1,1,3,3,0,0 ;3 |
||||
.DB "4",1,1,1,1,3,0,0 ;4 |
||||
.DB "5",1,1,1,1,1,0,0 ;5 |
||||
.DB "6",3,1,1,1,1,0,0 ;6 |
||||
.DB "7",3,3,1,1,1,0,0 ;7 |
||||
.DB "8",3,3,3,1,1,0,0 ;8 |
||||
.DB "9",3,3,3,3,1,0,0 ;9 |
||||
.DB ".",1,3,1,3,1,3,0 ;. |
||||
.DB ",",3,3,1,1,3,3,0 ;, |
||||
.DB " ",4,0,0,0,0,0,0 ;space |
||||
.DB 0,0,0,0,0,0,0,0 ;nic=konec tabulky |
||||
|
||||
;T E X T Y K O D V Y S I L A N I |
||||
; |
||||
; 0 1 2 3 4 5 6 minut cca |
||||
TEXT0: |
||||
.db "HLEDEJ ANTENU NA ZADNIM ZACHODE",0 ;gps=vesl.ostrov FINAL |
||||
TEXT1: |
||||
.db "DALSI ANTENA JE V KLUBOVNE",0 ;gps=kavky FINAL |
||||
TEXT2: |
||||
.db "HLEDEJ V HALE NA NASTENCE",0 ;gps=dobeska FINAL |
||||
TEXT3: |
||||
.db "KONTEJNER NA ODPADKY",0 ;gps=kostel zlichov FINAL |
||||
TEXT4: |
||||
.db "TAJEMSTVI UKRYVA BOTNIK",0 ;gps=skala prokopak FINAL |
||||
TEXT5: |
||||
.db "K CILI TE DOVEDE VYPINAC",0 ;gps=kempovy ostrov FINAL |
||||
TEXT6: |
||||
.db "ZAMETTE HALU A KLUBOVNU PAK HLEDEJTE CHROCHTAVE ZVIRE",0 ;gps=bosan FINAL |
||||
|
@ -0,0 +1,151 @@ |
||||
.device attiny13 |
||||
.def cnt=r17 |
||||
.def P0=r20 |
||||
.def P1=r21 |
||||
.def P2=r22 |
||||
.def P3=r23 |
||||
.def P4=r24 |
||||
.def chc=r18 |
||||
.def faze=r19 |
||||
|
||||
;### NASTAVENI ### |
||||
.equ CChDelay=6 ;DELAY pro zmenu barev - cim min tim rychlejsi je zmena |
||||
.equ ColDepth=128 ;Barevna hloubka - urcuje na kolik kroku se rozdeli prepinani 2 barev |
||||
.equ TIMEROV=2 ;porovnavaci hodnota pro timer - konstanta |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
rjmp CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000001 ;TC0 prescaler na 1 - velice plynule, bez blikani |
||||
out TCCR0B,r16 ;4800000Hz |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,TIMEROV ;overflow 32 clks - upravuje rychlost prepinani (konstanta) |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ori r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi P0,0 ;0 |
||||
ldi P1,ColDepth ;1 |
||||
ldi P2,ColDepth ;2 |
||||
ldi P3,ColDepth ;3 |
||||
ldi P4,ColDepth ;4 |
||||
clr cnt |
||||
clr chc |
||||
clr faze ;faze: 0 = 0->1, 1=1->2, 2=2->3 atd |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt ;cnt=cnt+1 |
||||
|
||||
cpi cnt,ColDepth ;cnt==ColorDepth? ANO->pokracovat, NE->skok na NOV |
||||
brne nov |
||||
|
||||
clr cnt ;CNT je ColorDepth -> vymazat CNT |
||||
;vynulovat LED kanaly: |
||||
cbi portb,0 ; (0) |
||||
cbi portb,1 ; (1) |
||||
cbi portb,2 ; (2) |
||||
cbi portb,3 ; (3) |
||||
cbi portb,4 ; (4) |
||||
|
||||
inc chc ;Zvysime citac pro zmenu barvy CHC o 1 |
||||
cpi chc,CChDelay ;CHC==delay? ANO->pokracovat, NE->skok na NOV |
||||
brne nov |
||||
|
||||
clr chc ;MENI SE BARVY |
||||
|
||||
cpi faze,0 |
||||
brne FazeNot0 |
||||
;FAZE je 0 |
||||
inc P0 |
||||
dec P1 |
||||
cpi P1,0 |
||||
brne nov |
||||
inc faze |
||||
|
||||
FazeNot0: |
||||
cpi faze,1 |
||||
brne FazeNot1 |
||||
;FAZE je 1 |
||||
inc P1 |
||||
dec P2 |
||||
cpi P2,0 |
||||
brne nov |
||||
inc faze |
||||
|
||||
FazeNot1: |
||||
cpi faze,2 |
||||
brne FazeNot2 |
||||
;FAZE je 2 |
||||
inc P2 |
||||
dec P3 |
||||
cpi P3,0 |
||||
brne nov |
||||
inc faze |
||||
FazeNot2: |
||||
cpi faze,3 |
||||
brne FazeNot3 |
||||
;FAZE je 3 |
||||
inc P3 |
||||
dec P4 |
||||
cpi P4,0 |
||||
brne nov |
||||
inc faze |
||||
FazeNot3: |
||||
;FAZE je 4 |
||||
inc P4 |
||||
dec P0 |
||||
cpi P0,0 |
||||
brne nov |
||||
clr faze |
||||
|
||||
;sprava PWM kanalu - podminene zapnuti LED |
||||
nov: ;NOV label |
||||
cp cnt,P0 ;P0==CNT? ANO->zapni P0, NE->skok na NOT0 |
||||
brne not0 |
||||
sbi portb,0 |
||||
not0: ;NOTR label |
||||
cp cnt,P1 ;P1==CNT? ANO->zapni P1, NE->skok na NOT1 |
||||
brne not1 |
||||
sbi portb,1 |
||||
not1: ;NOTG label |
||||
cp cnt,P2 ;P2==CNT? ANO->zapni P2, NE->skok na NOT2 |
||||
brne not2 |
||||
sbi portb,2 |
||||
not2: ;NOTG label |
||||
cp cnt,P3 ;P3==CNT? ANO->zapni P3, NE->skok na NOT3 |
||||
brne not3 |
||||
sbi portb,4 |
||||
not3: ;NOTG label |
||||
cp cnt,P4 ;P4==CNT? ANO->zapni P4, NE->skok na NOT4 |
||||
brne endcounter |
||||
sbi portb,3 |
||||
endcounter: ;ENDCOUNTER label - konec preruseni |
||||
reti ;navrat z obsluhy preruseni |
||||
|
@ -0,0 +1,53 @@ |
||||
;pokus |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.def POM=r16 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI POM,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,POM |
||||
|
||||
LDI POM,0B00000011 ;nastavi vystupni piny |
||||
OUT DDRB,POM |
||||
|
||||
LOOP: |
||||
SBI PORTB,0 ;PB0=0, PB1=1 |
||||
CBI PORTB,1 |
||||
RCALL CEKANI ;CEKACI SUB |
||||
CBI PORTB,0 ;PB0=1, PB1=0 |
||||
SBI PORTB,1 |
||||
RCALL CEKANI ;CEKACI SUB |
||||
RJMP LOOP ;znovu na navesti LOOP |
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 100 |
||||
L1: DEC r16 |
||||
LDI r17, 100 |
||||
L2: DEC r17 |
||||
LDI r18, 125 |
||||
L3: DEC r18 |
||||
CPI r18, 0 |
||||
BRNE L3 |
||||
CPI r17, 0 |
||||
BRNE L2 |
||||
CPI r16, 0 |
||||
BRNE L1 |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
|
@ -0,0 +1,287 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\pokus\pokus.asm Tue Sep 04 20:36:18 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
DEF POM r16 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG CEKANI 0000001b |
||||
CSEG L1 0000001f |
||||
CSEG L2 00000021 |
||||
CSEG L3 00000023 |
@ -0,0 +1,100 @@ |
||||
.device attiny13 |
||||
.def cnt=r17 |
||||
.def P0=r20 |
||||
.def chc=r18 |
||||
.def faze=r19 |
||||
|
||||
;### NASTAVENI ### |
||||
.equ CChDelay=8 ;DELAY pro zmenu barev - cim min tim rychlejsi je zmena |
||||
.equ TIMEROV=2 ;porovnavaci hodnota pro timer - konstanta |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
rjmp CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000001 ;TC0 prescaler na 1 - velice plynule, bez blikani |
||||
out TCCR0B,r16 ;4800000Hz |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,TIMEROV ;overflow 32 clks - upravuje rychlost prepinani (konstanta) |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ori r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi P0,0 ;0 |
||||
clr cnt |
||||
clr chc |
||||
clr faze ;faze: 0 = nahoru 1=dolu |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt ;cnt=cnt+1 |
||||
|
||||
cpi cnt,128 ;cnt==128? ANO->pokracovat, NE->skok na NOV |
||||
brne nov |
||||
|
||||
clr cnt ;CNT je 128 -> vymazat CNT |
||||
;vynulovat LED kanaly: |
||||
cbi portb,0 ; (0) |
||||
cbi portb,1 ; (1) |
||||
cbi portb,2 ; (2) |
||||
cbi portb,3 ; (3) |
||||
cbi portb,4 ; (4) |
||||
|
||||
inc chc ;Zvysime citac pro zmenu barvy CHC o 1 |
||||
cpi chc,CChDelay ;CHC==delay? ANO->pokracovat, NE->skok na NOV |
||||
brne nov |
||||
|
||||
clr chc ;MENI SE BARVY |
||||
|
||||
cpi faze,0 |
||||
brne FazeNot0 |
||||
;FAZE je 0 |
||||
inc P0 |
||||
cpi P0,85 |
||||
brne nov |
||||
inc faze |
||||
|
||||
FazeNot0: |
||||
;FAZE je 1 |
||||
dec P0 |
||||
cpi P0,0 |
||||
brne nov |
||||
clr faze |
||||
|
||||
;sprava PWM kanalu - podminene zapnuti LED |
||||
nov: ;NOV label |
||||
cp cnt,P0 ;P0==CNT? ANO->zapni P0, NE->skok na NOT0 |
||||
brne endcounter |
||||
sbi portb,0 |
||||
sbi portb,1 |
||||
sbi portb,2 |
||||
sbi portb,3 |
||||
sbi portb,4 |
||||
endcounter: ;ENDCOUNTER label - konec preruseni |
||||
reti ;navrat z obsluhy preruseni |
||||
|
@ -0,0 +1,179 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def cnt=r18 |
||||
.def RED=r19 |
||||
.def GREEN=r20 |
||||
.def BLUE=r21 |
||||
.def chc=r22 |
||||
.def faze=r23 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/32 |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,20 ;overflow 22 |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi RED,0 ;R |
||||
ldi GREEN,16 ;G |
||||
ldi BLUE,32 ;B |
||||
clr cnt |
||||
clr chc |
||||
clr faze |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt |
||||
|
||||
cpi cnt,32 |
||||
breq ov0 |
||||
rjmp nov |
||||
ov0: |
||||
clr cnt |
||||
cbi portb,0 |
||||
cbi portb,1 |
||||
cbi portb,2 |
||||
|
||||
inc chc |
||||
cpi chc,30 |
||||
breq ov1 |
||||
rjmp nov |
||||
ov1: |
||||
inc faze |
||||
clr chc |
||||
cpi faze,12 |
||||
brne fazenov |
||||
clr faze |
||||
fazenov: |
||||
cpi faze,0 |
||||
breq f0 |
||||
cpi faze,1 |
||||
breq f1 |
||||
cpi faze,2 |
||||
breq f2 |
||||
cpi faze,3 |
||||
breq f3 |
||||
cpi faze,4 |
||||
breq f4 |
||||
cpi faze,5 |
||||
breq f5 |
||||
cpi faze,6 |
||||
breq f6 |
||||
cpi faze,7 |
||||
breq f7 |
||||
cpi faze,8 |
||||
breq f8 |
||||
cpi faze,9 |
||||
breq f9 |
||||
cpi faze,10 |
||||
breq f10 |
||||
cpi faze,11 |
||||
breq f11 |
||||
f0: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f1: |
||||
ldi RED,0 |
||||
ldi GREEN,16 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f2: |
||||
ldi RED,8 |
||||
ldi GREEN,8 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f3: |
||||
ldi RED,16 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f4: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f5: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,16 |
||||
rjmp nov |
||||
f6: |
||||
ldi RED,32 |
||||
ldi GREEN,8 |
||||
ldi BLUE,8 |
||||
rjmp nov |
||||
f7: |
||||
ldi RED,32 |
||||
ldi GREEN,16 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
|
||||
f8: |
||||
ldi RED,32 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
f9: |
||||
ldi RED,16 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
f10: |
||||
ldi RED,8 |
||||
ldi GREEN,32 |
||||
ldi BLUE,8 |
||||
rjmp nov |
||||
f11: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,16 |
||||
rjmp nov |
||||
|
||||
nov: |
||||
cp cnt,RED |
||||
brne notr |
||||
sbi portb,0 |
||||
|
||||
notr: cp cnt,GREEN |
||||
brne notg |
||||
sbi portb,1 |
||||
|
||||
notg: cp cnt,BLUE |
||||
brne notb |
||||
sbi portb,2 |
||||
notb: |
||||
reti |
||||
|
@ -0,0 +1,133 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def cnt=r18 |
||||
.def RED=r19 |
||||
.def GREEN=r20 |
||||
.def BLUE=r21 |
||||
.def chc=r22 |
||||
.def faze=r23 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/32 |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,20 ;overflow 22 |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi RED,0 ;R |
||||
ldi GREEN,16 ;G |
||||
ldi BLUE,32 ;B |
||||
clr cnt |
||||
clr chc |
||||
clr faze |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt |
||||
|
||||
cpi cnt,32 |
||||
brne nov |
||||
|
||||
clr cnt |
||||
cbi portb,0 |
||||
cbi portb,1 |
||||
cbi portb,2 |
||||
|
||||
inc chc |
||||
cpi chc,255 |
||||
brne nov |
||||
inc faze |
||||
cpi faze,6 |
||||
brne fazenov |
||||
clr faze |
||||
fazenov: |
||||
cpi faze,0 |
||||
breq f0 |
||||
cpi faze,1 |
||||
breq f1 |
||||
cpi faze,2 |
||||
breq f2 |
||||
cpi faze,3 |
||||
breq f3 |
||||
cpi faze,4 |
||||
breq f4 |
||||
cpi faze,5 |
||||
breq f5 |
||||
|
||||
f0: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f1: |
||||
ldi RED,0 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f2: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f3: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,10 |
||||
rjmp nov |
||||
f4: |
||||
ldi RED,32 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
f5: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
|
||||
nov: |
||||
cp cnt,RED |
||||
brne notr |
||||
sbi portb,0 |
||||
|
||||
notr: cp cnt,GREEN |
||||
brne notg |
||||
sbi portb,1 |
||||
|
||||
notg: cp cnt,BLUE |
||||
brne notb |
||||
sbi portb,2 |
||||
notb: |
||||
reti |
||||
|
@ -0,0 +1,156 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def cnt=r18 |
||||
.def RED=r19 |
||||
.def GREEN=r20 |
||||
.def BLUE=r21 |
||||
.def chc=r22 |
||||
.def faze=r23 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/32 |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,20 ;overflow 22 |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi RED,0 ;R |
||||
ldi GREEN,16 ;G |
||||
ldi BLUE,32 ;B |
||||
clr cnt |
||||
clr chc |
||||
clr faze |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt |
||||
|
||||
cpi cnt,32 |
||||
breq ov |
||||
rjmp nov |
||||
ov: |
||||
clr cnt |
||||
cbi portb,0 |
||||
cbi portb,1 |
||||
cbi portb,2 |
||||
|
||||
inc chc |
||||
cpi chc,150 |
||||
brne nov |
||||
inc faze |
||||
cpi faze,9 |
||||
brne fazenov |
||||
clr faze |
||||
fazenov: |
||||
cpi faze,0 |
||||
breq f0 |
||||
cpi faze,1 |
||||
breq f1 |
||||
cpi faze,2 |
||||
breq f2 |
||||
cpi faze,3 |
||||
breq f3 |
||||
cpi faze,4 |
||||
breq f4 |
||||
cpi faze,5 |
||||
breq f5 |
||||
cpi faze,6 |
||||
breq f6 |
||||
cpi faze,7 |
||||
breq f7 |
||||
cpi faze,8 |
||||
breq f8 |
||||
|
||||
f0: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f1: |
||||
ldi RED,0 |
||||
ldi GREEN,16 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f2: |
||||
ldi RED,16 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f3: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,32 |
||||
rjmp nov |
||||
f4: |
||||
ldi RED,32 |
||||
ldi GREEN,0 |
||||
ldi BLUE,16 |
||||
rjmp nov |
||||
f5: |
||||
ldi RED,32 |
||||
ldi GREEN,16 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
|
||||
f6: |
||||
ldi RED,32 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
f7: |
||||
ldi RED,16 |
||||
ldi GREEN,32 |
||||
ldi BLUE,0 |
||||
rjmp nov |
||||
f8: |
||||
ldi RED,0 |
||||
ldi GREEN,32 |
||||
ldi BLUE,16 |
||||
rjmp nov |
||||
|
||||
nov: |
||||
cp cnt,RED |
||||
brne notr |
||||
sbi portb,0 |
||||
|
||||
notr: cp cnt,GREEN |
||||
brne notg |
||||
sbi portb,1 |
||||
|
||||
notg: cp cnt,BLUE |
||||
brne notb |
||||
sbi portb,2 |
||||
notb: |
||||
reti |
||||
|
@ -0,0 +1,493 @@ |
||||
;Imitace sacovane bomby, Ondrej Hruska (c) 2010 |
||||
;------------------------------------------------- |
||||
; Zapojeni: |
||||
; +------u------+ |
||||
; reset --+ /RST Vcc +-- napajeni +5V |
||||
; Anoda jednotek --+ PD0 PB7 +-- segment D |
||||
; Anoda desitek --+ PD1 PB6 +-- sedment E |
||||
; (nezapojeno) --+ XT2 PB5 +-- segment C |
||||
; (nezapojeno) --+ XT1 PB4 +-- segment H |
||||
; Spatny drat 1 --+ PD2 PB3 +-- segment G |
||||
; Spatny drat 2 --+ PD3 PB2 +-- segment A |
||||
; Spatny drat 3 --+ PD4 PB1 +-- segment F |
||||
; Spatny drat 4 --+ PD5 PB0 +-- segment B |
||||
; GND --+ GND PD6 +-- Spravny drat |
||||
; +-------------+ |
||||
; |
||||
; Nazvy segmentu na displeji: |
||||
; ---A--- |
||||
; | | |
||||
; F B |
||||
; | | |
||||
; ---G--- |
||||
; | | |
||||
; E C |
||||
; | | |
||||
; ---D--- H |
||||
; |
||||
|
||||
.device attiny2313 |
||||
;běží na 8MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
;LFUSE: 0xE4 |
||||
;HFUSE: 0xDF |
||||
|
||||
; A L I A S Y |
||||
.def numL = r20 |
||||
.def numH = r21 |
||||
.def dispL = r22 |
||||
.def dispH = r23 |
||||
.def wOld = r24 |
||||
.def InitLoopN = r25 |
||||
|
||||
.equ CUvodniIntervaly = 60 ;pocet intervalu cekani |
||||
.equ CInitLoopMax = 180 ;delka 1 intervalu cekani (s) |
||||
.equ CUnitSecs = 60 ;delka 1 jednotky (s) - zacina se s 99 jednotkami |
||||
|
||||
; M A K R A |
||||
.MACRO TimIntEnable |
||||
ldi r16,(1<<OCIE1A) |
||||
out TIMSK,r16 ;povolit interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
.MACRO TimIntDisable |
||||
ldi r16,0 |
||||
out TIMSK,r16 ;zakazat interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0004 ;TC1 Compare match A |
||||
rjmp TIMER |
||||
|
||||
.org 0x0010 |
||||
; NASTAVENI PO RESETU |
||||
.DB "IMITACE CASOVANE BOMBY. Ondrej Hruska 2010" |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
ldi r16,0b11111111 ;smer portu B - vystupni: segmenty (=katody) |
||||
out DDRB,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1, segmenty zhasnuty |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;smer portu D - PD0 a PD1 jsou vystupni - spinaji anody displeje. Zbytek: dratky. PD2 je spravny drat |
||||
out DDRD,r16 |
||||
ldi r16,0b01111100 ;enable pullup, 0 na anody = zhasnout. dratky pripojeny na GND, s pullupy |
||||
out PORTD,r16 |
||||
|
||||
; 16bitovy citac - generator f=1Hz |
||||
ldi r16,0 ;port se neovlivnuje citacem |
||||
out TCCR1A,r16 |
||||
ldi r16,(1<<WGM12)|(1<<CS12) ;TC1 prescaler na 256 (8000000/256=31250), CTC mod |
||||
out TCCR1B,r16 |
||||
|
||||
ldi r16,0b01111010 ;Compare Match 1 A high |
||||
ldi r17,0b00010010 ;Compare Match 1 A low (celkem 31250, overflow f=1Hz) |
||||
out OCR1AH,r16 ;set high |
||||
out OCR1AL,r17 ;set low |
||||
|
||||
TimIntDisable ;vypni casovac (makro) |
||||
sei ;Global Interrupt Enable |
||||
|
||||
; Navesti, ze se povedl start |
||||
; DEChGAFB |
||||
ldi dispH,0b00011000 |
||||
ldi dispL,0b10010111 |
||||
ldi r16,100 |
||||
nav: |
||||
ldi r17,255 |
||||
nav2: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne nav2 |
||||
dec r16 |
||||
brne nav |
||||
|
||||
ldi r16,0b00000000 ;disable pullupy a 0 na anody. Musime setrit energii! |
||||
out PORTD,r16 |
||||
clr r16 |
||||
clr r17 |
||||
|
||||
; INIT LOOP |
||||
ldi InitLoopN, CUvodniIntervaly ;cekej n intervalu |
||||
ldi r19,CInitLoopMax ;delka prvniho intervalu jako obecny interval |
||||
;soucasny interval: r19, defaultni interval: CInitLoopMax |
||||
TimIntEnable ;zapni casovac (makro) |
||||
InitLoop: |
||||
;kontroluje se InitLoopN. snizovani zajistuje casovac. |
||||
cpi InitLoopN,0 ;zbyva 0 intervalu? |
||||
brne InitLoop ;pokud ne, testuj znova |
||||
|
||||
; P R I P R A V Y N A H L A V N I P R O G R A M |
||||
cli ;vypni preruseni - skoncila uvodni smycka, zacina odpocitavani |
||||
;vycisteni registru |
||||
clr r16 ;vynuluj registry |
||||
clr r17 |
||||
clr r18 |
||||
clr r19 |
||||
|
||||
;pullupy PORTD |
||||
ldi r16,0b01111100 ;enable pullup |
||||
out PORTD,r16 |
||||
|
||||
;cas 99 |
||||
ldi numL,9 |
||||
ldi numH,9 |
||||
|
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
;vychozi rozlozeni dratu |
||||
in wOld,PIND ;nastaveni stareho rozlozeni dratu |
||||
andi wOld,0b01111000 ;ignorovat anody a spravny drat |
||||
;nastaveni vychoziho rozlozeni dratu k prestrihnuti |
||||
mov r16, wOld ;uloz wOld -> r16 |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum pridej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
ldi r19,CUnitSecs ;nastav citac intervalu pro hlavni odpocet |
||||
|
||||
ldi r16,0b11111111 ;255 na PORTB, vse zhasnuto |
||||
out PORTB, r16 |
||||
|
||||
sei ;zacina hlavni program s casovacem, bude se pouzivat preruseni |
||||
|
||||
loop: |
||||
rcall WireTest ;test dratku |
||||
|
||||
sbic PIND,2 ;pokud je spravny drat PD2 = 0, preskoc |
||||
rjmp CHCIP ;skoc na CHCIP |
||||
;spravny drat je neprerusen |
||||
|
||||
rcall multiplex |
||||
|
||||
rjmp loop ;hlavni smycka se opakuje |
||||
|
||||
multiplex: |
||||
push r16 |
||||
push r17 |
||||
;DISPLEJ JEDNOTEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
sbi PORTD,1 ;PORTD = 01 - zapnout anodu pro jednotky |
||||
out PORTB,dispL ;PORTB = dispL (displej jednotek) |
||||
ldi r17,100 ;pocet smycek |
||||
dL: ;smycka |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dL |
||||
|
||||
;DISPLEJ DESITEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,1 |
||||
sbi PORTD,0 ;PORTD 10 - zapnout anodu pro desitky |
||||
out PORTB,dispH ;PORTB = dispH (displej desitek) |
||||
ldi r17,100 ;pocet smycek |
||||
dH: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dH |
||||
|
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
cbi PORTD,1 |
||||
pop r17 |
||||
pop r16 |
||||
ret |
||||
|
||||
; r17 konvertuj do 7segmentovyho kodu pro displej se spol. anodou DECGAFB ---> r16 |
||||
dec7seg: ;dec7seg(r17) -> r16 |
||||
clr r16 ;do r16 budeme ukladat vystup, v r17 je vstupni cislo 0-9 |
||||
|
||||
cpi r17,9 ;je r17 = 9? |
||||
brne dec7segN8 ;neni -> pokracuj s 8 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000000 ;katody DCGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN8: |
||||
cpi r17,8 ;je r17 = 8? |
||||
brne dec7segN7 ;neni -> pokracuj s 7 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000000 ;katody DECGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN7: |
||||
cpi r17,7 ;je r17 = 7? |
||||
brne dec7segN6 ;neni -> pokracuj s 6 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001010 ;katody CAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN6: |
||||
cpi r17,6 ;je r17 = 6? |
||||
brne dec7segN5 ;neni -> pokracuj s 5 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000001 ;katody DECGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN5: |
||||
cpi r17,5 ;je r17 = 5? |
||||
brne dec7segN4 ;neni -> pokracuj s 4 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000001 ;katody DCGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN4: |
||||
cpi r17,4 ;je r17 = 4? |
||||
brne dec7segN3 ;neni -> pokracuj s 3 |
||||
; DEChGAFB |
||||
ldi r16, 0b11000100 ;katody CGFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN3: |
||||
cpi r17,3 ;je r17 = 3? |
||||
brne dec7segN2 ;neni -> pokracuj s 2 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000010 ;katody DCGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN2: |
||||
cpi r17,2 ;je r17 = 2? |
||||
brne dec7segN1 ;neni -> pokracuj s 1 |
||||
; DEChGAFB |
||||
ldi r16, 0b00100010 ;katody DEGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN1: |
||||
cpi r17,1 ;je r17 = 1? |
||||
brne dec7segN0 ;neni -> pokracuj s 0 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001110 ;katody CB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN0: |
||||
; DEChGAFB |
||||
ldi r16, 0b00001000 ;katody DECAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
dec7segReturn: |
||||
ret |
||||
|
||||
; TEST DRATU (nutno volat rucne) |
||||
WireTest: |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
in r16,PIND |
||||
andi r16, 0b01111000 ;odfiltrovat anody a spravny drat |
||||
;test dratku |
||||
cp wOld,r16 ;porovnej r16 a wOld |
||||
brsh WireTestReturn ;wOld >= r16: nebyl prestrizen dratek, nebo byl nejaky spojen |
||||
;dratek byl prestrizen |
||||
;ODECTENI 3 desitek |
||||
cpi numH,3 ;jsou aspon 3 desitky? |
||||
brlo WireTestMaloCasu ;nejsou-li ani 3 desitky, vynuluj vse a vybuchni |
||||
subi numH,3 ;jinak odecti 3 desitky |
||||
|
||||
;nedoslo k vynulovani? |
||||
brne WireTestReturn ;desitky > 0: odejdi bez vybuchu |
||||
cpi numL,0 ;desitky = 0. kolik je jednotek? |
||||
breq WireTestBum ;je-li 0 jednotek, vybuchni |
||||
;0 desitek, n > 0 jednotek |
||||
rjmp WireTestReturn ;0 desitek ale n > 0 jednotek, odejdi bez vybuchu |
||||
WireTestMaloCasu: |
||||
clr numL ;vymazat jednotky |
||||
clr numH ;vymazat desitky |
||||
WireTestBum: |
||||
rcall BUM ;vybuchnout |
||||
WireTestReturn: |
||||
mov wOld, r16 ;uloz soucasny stav dratu do wOld |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum prodej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
;obnovit displej |
||||
mov r17,numL ;zpracovat numL |
||||
|
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispL,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispH,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
pop r16 |
||||
ret ;navrat |
||||
|
||||
; B U M |
||||
BUM: |
||||
;vybuch - blikajici nuly |
||||
cli ;vypni preruseni |
||||
|
||||
ldi r17,0 ;0 jednotek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
|
||||
ldi r17,0 ;0 desitek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
BUMsmycka: ;nekonecna smycka, blikaji nuly |
||||
ldi r16, 255 |
||||
BUMsmyckaMX: |
||||
rcall multiplex |
||||
dec r16 |
||||
brne BUMsmyckaMX |
||||
|
||||
ldi r16, 255 |
||||
BUMsmyckaPAUZA: |
||||
ldi r17, 255 |
||||
BUMsmyckaPAUZAb: |
||||
dec r17 |
||||
brne BUMsmyckaPAUZAb |
||||
dec r16 |
||||
brne BUMsmyckaPAUZA |
||||
|
||||
rjmp BUMsmycka |
||||
|
||||
; C H C I P |
||||
CHCIP: |
||||
;nekdo prestrihl spravny drat |
||||
cli |
||||
;ldi dispL,0b00000000 |
||||
;ldi dispH,0b00000000 |
||||
ldi r16,180 ; citac delky cekani |
||||
CHCIPsmycka: |
||||
mov r17,r16 |
||||
com r17 |
||||
CHCIPsmyckaMX: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne CHCIPsmyckaMX |
||||
|
||||
mov r17,r16 ; nastaveni smycky cekani |
||||
inc r16 |
||||
cpi r16,255 |
||||
brsh CHCIPsleep ;uz je to moc dlouhy, usnout |
||||
|
||||
CHCIPsmyckaPAUZA: ;r17*200 |
||||
mov r18,r16 |
||||
CHCIPsmyckaPAUZAb: |
||||
dec r18 |
||||
brne CHCIPsmyckaPAUZAb |
||||
dec r17 |
||||
brne CHCIPsmyckaPAUZA |
||||
rjmp CHCIPsmycka |
||||
|
||||
CHCIPsleep: |
||||
cli |
||||
ldi r16,(1<<SE)|(1<<SM0) |
||||
out MCUCR,r16 |
||||
sleep |
||||
|
||||
; PRERUSENI OD CASOVACE f=1Hz |
||||
TIMER: ; casovac ma frekvenci 1Hz |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
; r19 je citac intervalu |
||||
cpi InitLoopN,0 ;je InitLoopN = 0? |
||||
breq TIMERnormal ;Je-li InitLoopN = 0, pokracuj normalnim prerusenim |
||||
; probiha uvodni cekani |
||||
; test intervaloveho citace (pokud je InitLoopN > 0, pouziva k tomu se r19) |
||||
cpi r19,0 ;je r19 = 0? |
||||
breq TIMERsnizitILN ;je-li r19 = 0, snizit InitLoopN: jdi na TIMERsnizitILN |
||||
dec r19 ;jinak o 1 sniz r19 (intervalovy citac) |
||||
;out PORTB,r19 ;DEBUG test r19 |
||||
rjmp TIMERreturn ;a odejdi |
||||
TIMERsnizitILN: |
||||
dec InitLoopN ;snizit InitLoopN |
||||
ldi r19,CInitLoopMax ;nastaveni delky dalsiho intervalu |
||||
rjmp TIMERreturn ;odejdi |
||||
|
||||
TIMERnormal: |
||||
;invertuj tecku (Low) |
||||
ldi r16,0b00010000 |
||||
eor dispL,r16 |
||||
cbr dispH,0b00010000 |
||||
sbrc dispL,4 ;do H zkopiruj tecku z L (tim se zajisti, ze budou vzdy stejne) |
||||
sbr dispH,0b00010000 |
||||
|
||||
; r19 slouzi jako citac sekund |
||||
dec r19 ;sniz citac intervalu o 1 |
||||
brne TIMERreturn ;neni-li 0, odejdi |
||||
ldi r19,CUnitSecs ;nastaveni dalsiho intervalu |
||||
; ODECTENI JEDNOTKY |
||||
cpi numL,0 ;je jednotek vic nez 0? |
||||
brne TIMERnOdectiJednotku ;jednotky > 0, jdi na odecteni jednotky |
||||
;0 jednotek |
||||
cpi numH, 0 ;0 jednotek. je desitek vic nez 0? |
||||
brne TIMERnOdectiPresDesitku ;je-li desitek vic nez 0, jdi na odecteni desitky |
||||
;0 jednotek i desitek |
||||
rcall BUM |
||||
|
||||
TIMERnOdectiPresDesitku: |
||||
;0 jednotek, n > 0 desitek |
||||
dec numH ;odecti desitku |
||||
ldi numL,9 ;dej jednotky=9 |
||||
rjmp TIMERnOdecteniHotovo ;preskoc na TIMERnOdecteniHotovo |
||||
|
||||
TIMERnOdectiJednotku: |
||||
dec numL ;odecti jednotku |
||||
|
||||
TIMERnOdecteniHotovo: |
||||
cpi numH,0 ;test desitek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
cpi numL,0 ;test jednotek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
;je nula |
||||
rcall BUM ;je nula: vybuchni |
||||
|
||||
TIMERnHotovoNevybuch: |
||||
;uprav displej |
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispL,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispH,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
;je obnoven stav displeje, konec preruseni |
||||
|
||||
TIMERreturn: |
||||
pop r18 ;navratit puvodni hodnoty registru |
||||
pop r17 |
||||
pop r16 |
||||
reti |
@ -0,0 +1,233 @@ |
||||
.device attiny2313 |
||||
;běží na 8MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
; A L I A S Y |
||||
.def numL = r19 |
||||
.def numH = r20 |
||||
.def dispL = r21 |
||||
.def dispH = r22 |
||||
.def wNow = r23 |
||||
.def wOld = r24 |
||||
.def InitLoopN = r25 |
||||
|
||||
; M A K R A |
||||
.MACRO TimIntEnable |
||||
ldi r16,(1<<OCIE1A) |
||||
out TIMSK,r16 ;povolit interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
.MACRO TimIntDisable |
||||
ldi r16,0 |
||||
out TIMSK,r16 ;zakazat interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0004 ;TC1 Compare match A |
||||
rjmp TIMER |
||||
|
||||
.org 0x0010 |
||||
; NASTAVENI PO RESETU |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
ldi r16,255 ;smer portu B - vystupni: segmenty (=katody) |
||||
out DDRB,r16 |
||||
ser r16 ;r16=255 - vse na 1, segmenty zhasnuty |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;smer portu D - PB0 a PB1 jsou vystupni - spinaji anody displeje. Zbytek: dratky. |
||||
out DDRD,r16 |
||||
ldi r16,0b11111100 ;enable pullup, 0 na anody = zhasnout |
||||
;dratky pripojeny na GND, s pullupy |
||||
out PORTD,r16 |
||||
|
||||
; 16bitovy citac - generator f=1Hz |
||||
ldi r16,0 ;port se neovlivnuje citacem |
||||
out TCCR1A,r16 |
||||
ldi r16,(1<<WGM12)|(1<<CS12) ;TC1 prescaler na 256 (8000000/256=31250), CTC mod |
||||
out TCCR1B,r16 |
||||
|
||||
ldi r16,0b01111010 ;Compare Match 1 A high |
||||
ldi r17,0b00010010 ;Compare Match 1 A low (celkem 31250, overflow f=1Hz) |
||||
out OCR1AH,r16 ;set high |
||||
out OCR1AL,r17 ;set low |
||||
|
||||
TimIntDisable ;vypni casovac (makro) |
||||
|
||||
; Nastaveni promennych |
||||
;cas 99 |
||||
ldi numL,9 |
||||
ldi numH,9 |
||||
|
||||
;vychozi rozlozeni dratu |
||||
in r16,PORTD |
||||
andi r16, 0b11111100 ;ignorovat anody |
||||
mov wOld, r16 ;nastaveni stareho rozlozeni dratu |
||||
mov wNow, r16 ;nastaveni soucasneho rozlozeni dratu |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
; INIT LOOP |
||||
ldi InitLoopN, 0 ;cekej n intervalu |
||||
ldi r18,60 ;delka intervalu v sekundach |
||||
mov r17,r18 ;delka prvniho intervalu jako obecny interval |
||||
;soucasny interval: r17, defaultni interval: r18. |
||||
TimIntEnable ;zapni casovac (makro) |
||||
InitLoop: |
||||
;kontroluje se InitLoopN. snizovani zajistuje casovac. |
||||
cpi InitLoopN,0 |
||||
brne InitLoop |
||||
|
||||
; HLAVNI PROGRAM |
||||
TimIntDisable ;vypni casovac (makro) - skoncila uvodni smycka, zacina odpocitavani |
||||
;nastaveni |
||||
clr r16 ;vynuluj registry ovlivnene uvodnim cekanim |
||||
clr r17 |
||||
clr r18 |
||||
|
||||
TimIntEnable ;zacina hlavni program s casovacem. |
||||
|
||||
ser r16 ;255 na PORTB, vse zhasnuto |
||||
out PORTB, r16 |
||||
loop: |
||||
rjmp loop |
||||
|
||||
; r17 konvertuj do 7segmentovyho kodu pro displej se spol. anodou DECGAFB ---> r16 |
||||
dec7seg: |
||||
clr r16 ;do r16 budeme ukladat vystup, v r17 je vstupni cislo 0-9 |
||||
|
||||
cpi r17,9 ;je r17 = 9? |
||||
brne dec7segN8 ;neni -> pokracuj s 8 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000000 ;katody DCGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN8: |
||||
cpi r17,8 ;je r17 = 8? |
||||
brne dec7segN7 ;neni -> pokracuj s 7 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000000 ;katody DECGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN7: |
||||
cpi r17,7 ;je r17 = 7? |
||||
brne dec7segN6 ;neni -> pokracuj s 6 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001010 ;katody CAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN6: |
||||
cpi r17,6 ;je r17 = 6? |
||||
brne dec7segN5 ;neni -> pokracuj s 5 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000001 ;katody DECGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN5: |
||||
cpi r17,5 ;je r17 = 5? |
||||
brne dec7segN4 ;neni -> pokracuj s 4 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000001 ;katody DCGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN4: |
||||
cpi r17,4 ;je r17 = 4? |
||||
brne dec7segN3 ;neni -> pokracuj s 3 |
||||
; DEChGAFB |
||||
ldi r16, 0b11000100 ;katody CGFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN3: |
||||
cpi r17,3 ;je r17 = 3? |
||||
brne dec7segN2 ;neni -> pokracuj s 2 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000010 ;katody DCGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN2: |
||||
cpi r17,2 ;je r17 = 2? |
||||
brne dec7segN1 ;neni -> pokracuj s 1 |
||||
; DEChGAFB |
||||
ldi r16, 0b00100010 ;katody DEGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN1: |
||||
cpi r17,1 ;je r17 = 1? |
||||
brne dec7segN0 ;neni -> pokracuj s 0 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001110 ;katody CB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
|
||||
dec7segN0: |
||||
; DEChGAFB |
||||
ldi r16, 0b00001000 ;katody DECAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
|
||||
dec7segReturn: |
||||
ret |
||||
|
||||
|
||||
; TEST DRATU (nutno volat rucne) |
||||
WireTest: |
||||
in r16,PORTD |
||||
andi r16, 0b11111100 ;odfiltrovat anody |
||||
mov wNow, r16 ;nastaveni soucasneho rozlozeni dratu |
||||
;test dratku |
||||
cp wOld,wNow ;porovnej wOld a wNow |
||||
brge WireTestReturn ;wOld >= wNow: nebyl prestrizen dratek, nebo byl nejaky spojen |
||||
|
||||
;dratek byl prestrizen |
||||
mov wOld, wNow ;nastaveni |
||||
;ODECTENI CASU |
||||
cpi numH,3 ;jsou aspon 3 desitky? |
||||
brlo WireTestLowTens ;nejsou-li ani 3 desitky, vynuluj vse a vybuchni |
||||
subi numH,3 ;jinak odecti 3 desitky |
||||
;nedoslo k vynulovani? |
||||
brne WireTestReturn ;desitky > 0: odejdi bez vybuchu |
||||
cpi numL,0 ;desitky = 0, kolik je jednotek? |
||||
breq WireTestBum ;je-li 0 jednotek, vybuchni |
||||
;0 desitek, n > 0 jednotek |
||||
rjmp WireTestReturn ;0 desitek ale n > 0 jednotek, odejdi bez vybuchu |
||||
WireTestLowTens: |
||||
clr numL ;vymazat jednotky |
||||
clr numH ;vymazat desitky |
||||
WireTestBum: |
||||
rcall BUM |
||||
WireTestReturn: |
||||
ret |
||||
|
||||
; B U M |
||||
BUM: |
||||
;nekonecna smycka, blikaji nuly |
||||
TimIntDisable ;vypni casovac (makro) |
||||
smycka: |
||||
rjmp smycka |
||||
|
||||
|
||||
; PRERUSENI OD CASOVACE f=1Hz |
||||
rjmp loop ; aby se TIMER nevykonal mimo preruseni, kdyby procesor zabloudil |
||||
TIMER: ; casovac ma frekvenci 1Hz |
||||
cpi InitLoopN,0 ;je InitLoopN = 0? |
||||
breq TIMERnormal ;Je-li InitLoopN = 0, pokracuj normalnim prerusenim |
||||
; probiha uvodni cekani |
||||
; test intervaloveho citace |
||||
cpi r17,0 ;je r17 = 0? |
||||
breq TIMERsnizitILN ;je-li r17 = 0, snizit InitLoopN: jdi na TIMERsnizitILN |
||||
dec r17 ;jinak o 1 sniz r17 (intervalovy citac) |
||||
;out PORTB,r17 ;DEBUG test r17 |
||||
rjmp TIMERreturn ;a odejdi |
||||
TIMERsnizitILN: |
||||
dec InitLoopN ;snizit InitLoopN |
||||
mov r17,r18 ;nastaveni delky dalsiho intervalu |
||||
rjmp TIMERreturn ;odejdi |
||||
TIMERnormal: |
||||
; STANDARTNI PRERUSENI (1s) |
||||
sbi PINB,4 ;toogle PB4 (tecka na displeji) |
||||
TIMERreturn: |
||||
reti |
@ -0,0 +1,439 @@ |
||||
.device attiny2313 |
||||
;běží na 8MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
; A L I A S Y |
||||
.def numL = r20 |
||||
.def numH = r21 |
||||
.def dispL = r22 |
||||
.def dispH = r23 |
||||
.def wOld = r24 |
||||
.def InitLoopN = r25 |
||||
|
||||
.equ CUvodniIntervaly = 1 ;pocet intervalu cekani |
||||
.equ CInitLoopMax = 10 ;delka 1 intervalu cekani (s) |
||||
.equ CUnitSecs = 1 ;delka 1 jednotky (s) - zacina se s 99 jednotkami |
||||
|
||||
; M A K R A |
||||
.MACRO TimIntEnable |
||||
ldi r16,(1<<OCIE1A) |
||||
out TIMSK,r16 ;povolit interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
.MACRO TimIntDisable |
||||
ldi r16,0 |
||||
out TIMSK,r16 ;zakazat interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0004 ;TC1 Compare match A |
||||
rjmp TIMER |
||||
|
||||
.org 0x0010 |
||||
; NASTAVENI PO RESETU |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
ldi r16,0b11111111 ;smer portu B - vystupni: segmenty (=katody) |
||||
out DDRB,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1, segmenty zhasnuty |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;smer portu D - PD0 a PD1 jsou vystupni - spinaji anody displeje. Zbytek: dratky. PD2 je spravny drat |
||||
out DDRD,r16 |
||||
ldi r16,0b11111100 ;enable pullup, 0 na anody = zhasnout. dratky pripojeny na GND, s pullupy |
||||
out PORTD,r16 |
||||
|
||||
; 16bitovy citac - generator f=1Hz |
||||
ldi r16,0 ;port se neovlivnuje citacem |
||||
out TCCR1A,r16 |
||||
ldi r16,(1<<WGM12)|(1<<CS12) ;TC1 prescaler na 256 (8000000/256=31250), CTC mod |
||||
out TCCR1B,r16 |
||||
|
||||
ldi r16,0b01111010 ;Compare Match 1 A high |
||||
ldi r17,0b00010010 ;Compare Match 1 A low (celkem 31250, overflow f=1Hz) |
||||
out OCR1AH,r16 ;set high |
||||
out OCR1AL,r17 ;set low |
||||
|
||||
TimIntDisable ;vypni casovac (makro) |
||||
sei ;Global Interrupt Enable |
||||
|
||||
; Navesti, ze se povedl start |
||||
; DEChGAFB |
||||
ldi dispH,0b00011000 |
||||
ldi dispL,0b10010111 |
||||
ldi r16,100 |
||||
nav: |
||||
ldi r17,255 |
||||
nav2: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne nav2 |
||||
dec r16 |
||||
brne nav |
||||
clr r16 |
||||
clr r17 |
||||
cbi PORTD,0 |
||||
cbi PORTD,1 |
||||
|
||||
; INIT LOOP |
||||
ldi InitLoopN, CUvodniIntervaly ;cekej n intervalu |
||||
ldi r19,CInitLoopMax ;delka prvniho intervalu jako obecny interval |
||||
;soucasny interval: r19, defaultni interval: CInitLoopMax |
||||
TimIntEnable ;zapni casovac (makro) |
||||
InitLoop: |
||||
;kontroluje se InitLoopN. snizovani zajistuje casovac. |
||||
cpi InitLoopN,0 ;zbyva 0 intervalu? |
||||
brne InitLoop ;pokud ne, testuj znova |
||||
|
||||
; P R I P R A V Y N A H L A V N I P R O G R A M |
||||
cli ;vypni preruseni - skoncila uvodni smycka, zacina odpocitavani |
||||
;vycisteni registru |
||||
clr r16 ;vynuluj registry |
||||
clr r17 |
||||
clr r18 |
||||
clr r19 |
||||
|
||||
;cas 99 |
||||
ldi numL,9 |
||||
ldi numH,9 |
||||
|
||||
;vychozi rozlozeni dratu |
||||
in wOld,PIND ;nastaveni stareho rozlozeni dratu |
||||
andi wOld,0b01111000 ;ignorovat anody a spravny drat |
||||
|
||||
mov r16, wOld ;uloz wOld -> r16 |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum pridej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
|
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
;dispL a dispH maji nastaveny obsah |
||||
|
||||
ldi r19,CUnitSecs ;nastav citac intervalu pro hlavni odpocet |
||||
|
||||
ldi r16,0b11111111 ;255 na PORTB, vse zhasnuto |
||||
out PORTB, r16 |
||||
|
||||
sei ;zacina hlavni program s casovacem, bude se pouzivat preruseni |
||||
|
||||
loop: |
||||
rcall WireTest ;test dratku |
||||
sbic PIND,2 ;pokud je spravny drat PD2 = 0, preskoc |
||||
rjmp CHCIP ;skoc na CHCIP |
||||
;spravny drat je neprerusen |
||||
|
||||
rcall multiplex |
||||
|
||||
rjmp loop ;hlavni smycka se opakuje |
||||
|
||||
multiplex: |
||||
push r16 |
||||
push r17 |
||||
;DISPLEJ JEDNOTEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,1 |
||||
sbi PORTD,0 ;PORTD = 01 - zapnout anodu pro jednotky |
||||
out PORTB,dispL ;PORTB = dispL (displej jednotek) |
||||
ldi r17,100 ;pocet smycek |
||||
dL: ;smycka |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dL |
||||
|
||||
;DISPLEJ DESITEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
sbi PORTD,1 ;PORTD 10 - zapnout anodu pro desitky |
||||
out PORTB,dispH ;PORTB = dispH (displej desitek) |
||||
ldi r17,100 ;pocet smycek |
||||
dH: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dH |
||||
|
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
|
||||
pop r17 |
||||
pop r16 |
||||
ret |
||||
|
||||
; r17 konvertuj do 7segmentovyho kodu pro displej se spol. anodou DECGAFB ---> r16 |
||||
dec7seg: ;dec7seg(r17) -> r16 |
||||
clr r16 ;do r16 budeme ukladat vystup, v r17 je vstupni cislo 0-9 |
||||
|
||||
cpi r17,9 ;je r17 = 9? |
||||
brne dec7segN8 ;neni -> pokracuj s 8 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000000 ;katody DCGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN8: |
||||
cpi r17,8 ;je r17 = 8? |
||||
brne dec7segN7 ;neni -> pokracuj s 7 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000000 ;katody DECGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN7: |
||||
cpi r17,7 ;je r17 = 7? |
||||
brne dec7segN6 ;neni -> pokracuj s 6 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001010 ;katody CAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN6: |
||||
cpi r17,6 ;je r17 = 6? |
||||
brne dec7segN5 ;neni -> pokracuj s 5 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000001 ;katody DECGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN5: |
||||
cpi r17,5 ;je r17 = 5? |
||||
brne dec7segN4 ;neni -> pokracuj s 4 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000001 ;katody DCGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN4: |
||||
cpi r17,4 ;je r17 = 4? |
||||
brne dec7segN3 ;neni -> pokracuj s 3 |
||||
; DEChGAFB |
||||
ldi r16, 0b11000100 ;katody CGFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN3: |
||||
cpi r17,3 ;je r17 = 3? |
||||
brne dec7segN2 ;neni -> pokracuj s 2 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000010 ;katody DCGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN2: |
||||
cpi r17,2 ;je r17 = 2? |
||||
brne dec7segN1 ;neni -> pokracuj s 1 |
||||
; DEChGAFB |
||||
ldi r16, 0b00100010 ;katody DEGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN1: |
||||
cpi r17,1 ;je r17 = 1? |
||||
brne dec7segN0 ;neni -> pokracuj s 0 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001110 ;katody CB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN0: |
||||
; DEChGAFB |
||||
ldi r16, 0b00001000 ;katody DECAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
dec7segReturn: |
||||
ret |
||||
|
||||
; TEST DRATU (nutno volat rucne) |
||||
WireTest: |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
in r16,PIND |
||||
andi r16, 0b01111000 ;odfiltrovat anody a spravny drat |
||||
;test dratku |
||||
cp wOld,r16 ;porovnej r16 a wOld |
||||
brsh WireTestReturn ;wOld >= r16: nebyl prestrizen dratek, nebo byl nejaky spojen |
||||
;dratek byl prestrizen |
||||
;ODECTENI 3 desitek |
||||
cpi numH,3 ;jsou aspon 3 desitky? |
||||
brlo WireTestMaloCasu ;nejsou-li ani 3 desitky, vynuluj vse a vybuchni |
||||
subi numH,3 ;jinak odecti 3 desitky |
||||
;nedoslo k vynulovani? |
||||
brne WireTestReturn ;desitky > 0: odejdi bez vybuchu |
||||
cpi numL,0 ;desitky = 0. kolik je jednotek? |
||||
breq WireTestBum ;je-li 0 jednotek, vybuchni |
||||
;0 desitek, n > 0 jednotek |
||||
rjmp WireTestReturn ;0 desitek ale n > 0 jednotek, odejdi bez vybuchu |
||||
WireTestMaloCasu: |
||||
clr numL ;vymazat jednotky |
||||
clr numH ;vymazat desitky |
||||
WireTestBum: |
||||
rcall BUM ;vybuchnout |
||||
WireTestReturn: |
||||
mov wOld, r16 ;uloz soucasny stav dratu do wOld |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum prodej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
pop r16 |
||||
ret ;navrat |
||||
|
||||
; B U M |
||||
BUM: |
||||
;vybuch - blikajici nuly |
||||
cli ;vypni preruseni |
||||
|
||||
ldi r17,0 ;0 jednotek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
|
||||
ldi r17,0 ;0 desitek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
BUMsmycka: ;nekonecna smycka, blikaji nuly |
||||
ldi r16, 255 |
||||
BUMsmyckaMX: |
||||
rcall multiplex |
||||
dec r16 |
||||
brne BUMsmyckaMX |
||||
|
||||
ldi r16, 255 |
||||
BUMsmyckaPAUZA: |
||||
ldi r17, 255 |
||||
BUMsmyckaPAUZAb: |
||||
dec r17 |
||||
brne BUMsmyckaPAUZAb |
||||
dec r16 |
||||
brne BUMsmyckaPAUZA |
||||
|
||||
rjmp BUMsmycka |
||||
|
||||
; C H C I P |
||||
CHCIP: |
||||
;nekdo prestrihl spravny drat |
||||
cli |
||||
ldi dispL,0b00000000 |
||||
ldi dispH,0b00000000 |
||||
clr r16 ; citac delky cekani |
||||
CHCIPsmycka: |
||||
ldi r17, 120 ;smycka multiplexu |
||||
CHCIPsmyckaMX: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne CHCIPsmyckaMX |
||||
|
||||
mov r17,r16 ; nastaveni smycky cekani |
||||
inc r16 |
||||
cpi r16,255 |
||||
brsh CHCIPsleep ;uz je to moc dlouhy, usnout |
||||
|
||||
CHCIPsmyckaPAUZA: ;r17*200 |
||||
ldi r18,255 |
||||
CHCIPsmyckaPAUZAb: |
||||
dec r18 |
||||
brne CHCIPsmyckaPAUZAb |
||||
dec r17 |
||||
brne CHCIPsmyckaPAUZA |
||||
rjmp CHCIPsmycka |
||||
|
||||
CHCIPsleep: |
||||
cli |
||||
ldi r16,(1<<SE)|(1<<SM0) |
||||
out MCUCR,r16 |
||||
sleep |
||||
|
||||
; PRERUSENI OD CASOVACE f=1Hz |
||||
TIMER: ; casovac ma frekvenci 1Hz |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
; r19 je citac intervalu |
||||
cpi InitLoopN,0 ;je InitLoopN = 0? |
||||
breq TIMERnormal ;Je-li InitLoopN = 0, pokracuj normalnim prerusenim |
||||
; probiha uvodni cekani |
||||
; test intervaloveho citace (pokud je InitLoopN > 0, pouziva k tomu se r19) |
||||
cpi r19,0 ;je r19 = 0? |
||||
breq TIMERsnizitILN ;je-li r19 = 0, snizit InitLoopN: jdi na TIMERsnizitILN |
||||
dec r19 ;jinak o 1 sniz r19 (intervalovy citac) |
||||
;out PORTB,r19 ;DEBUG test r19 |
||||
rjmp TIMERreturn ;a odejdi |
||||
TIMERsnizitILN: |
||||
dec InitLoopN ;snizit InitLoopN |
||||
ldi r19,CInitLoopMax ;nastaveni delky dalsiho intervalu |
||||
rjmp TIMERreturn ;odejdi |
||||
|
||||
TIMERnormal: |
||||
;invertuj tecky |
||||
ldi r16,0b00010000 |
||||
eor dispL,r16 |
||||
eor dispH,r16 |
||||
|
||||
; r19 slouzi jako citac sekund |
||||
dec r19 ;sniz citac intervalu o 1 |
||||
brne TIMERreturn ;neni-li 0, odejdi |
||||
ldi r19,CUnitSecs ;nastaveni dalsiho intervalu |
||||
; ODECTENI JEDNOTKY |
||||
cpi numL,0 ;je jednotek vic nez 0? |
||||
brne TIMERnOdectiJednotku ;jednotky > 0, jdi na odecteni jednotky |
||||
;0 jednotek |
||||
cpi numH, 0 ;0 jednotek. je desitek vic nez 0? |
||||
brne TIMERnOdectiPresDesitku ;je-li desitek vic nez 0, jdi na odecteni desitky |
||||
;0 jednotek i desitek |
||||
rcall BUM |
||||
|
||||
TIMERnOdectiPresDesitku: |
||||
;0 jednotek, n > 0 desitek |
||||
dec numH ;odecti desitku |
||||
ldi numL,9 ;dej jednotky=9 |
||||
rjmp TIMERnOdecteniHotovo ;preskoc na TIMERnOdecteniHotovo |
||||
|
||||
TIMERnOdectiJednotku: |
||||
dec numL ;odecti jednotku |
||||
|
||||
TIMERnOdecteniHotovo: |
||||
cpi numH,0 ;test desitek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
cpi numL,0 ;test jednotek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
;je nula |
||||
rcall BUM ;je nula: vybuchni |
||||
|
||||
TIMERnHotovoNevybuch: |
||||
;uprav displej |
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispL,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispH,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
;je obnoven stav displeje, konec preruseni |
||||
|
||||
TIMERreturn: |
||||
pop r18 ;navratit puvodni hodnoty registru |
||||
pop r17 |
||||
pop r16 |
||||
reti |
@ -0,0 +1,462 @@ |
||||
.device attiny2313 |
||||
;běží na 8MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
; A L I A S Y |
||||
.def numL = r20 |
||||
.def numH = r21 |
||||
.def dispL = r22 |
||||
.def dispH = r23 |
||||
.def wOld = r24 |
||||
.def InitLoopN = r25 |
||||
|
||||
.equ CUvodniIntervaly = 60 ;pocet intervalu cekani |
||||
.equ CInitLoopMax = 180 ;delka 1 intervalu cekani (s) |
||||
.equ CUnitSecs = 60 ;delka 1 jednotky (s) - zacina se s 99 jednotkami |
||||
|
||||
; M A K R A |
||||
.MACRO TimIntEnable |
||||
ldi r16,(1<<OCIE1A) |
||||
out TIMSK,r16 ;povolit interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
.MACRO TimIntDisable |
||||
ldi r16,0 |
||||
out TIMSK,r16 ;zakazat interrupt pri Compare Match A |
||||
.ENDMACRO |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0004 ;TC1 Compare match A |
||||
rjmp TIMER |
||||
|
||||
.org 0x0010 |
||||
; NASTAVENI PO RESETU |
||||
.DB "Ondrej Hruska (C) 2010" |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
ldi r16,0b11111111 ;smer portu B - vystupni: segmenty (=katody) |
||||
out DDRB,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1, segmenty zhasnuty |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;smer portu D - PD0 a PD1 jsou vystupni - spinaji anody displeje. Zbytek: dratky. PD2 je spravny drat |
||||
out DDRD,r16 |
||||
ldi r16,0b01111100 ;enable pullup, 0 na anody = zhasnout. dratky pripojeny na GND, s pullupy |
||||
out PORTD,r16 |
||||
|
||||
; 16bitovy citac - generator f=1Hz |
||||
ldi r16,0 ;port se neovlivnuje citacem |
||||
out TCCR1A,r16 |
||||
ldi r16,(1<<WGM12)|(1<<CS12) ;TC1 prescaler na 256 (8000000/256=31250), CTC mod |
||||
out TCCR1B,r16 |
||||
|
||||
ldi r16,0b01111010 ;Compare Match 1 A high |
||||
ldi r17,0b00010010 ;Compare Match 1 A low (celkem 31250, overflow f=1Hz) |
||||
out OCR1AH,r16 ;set high |
||||
out OCR1AL,r17 ;set low |
||||
|
||||
TimIntDisable ;vypni casovac (makro) |
||||
sei ;Global Interrupt Enable |
||||
|
||||
; Navesti, ze se povedl start |
||||
; DEChGAFB |
||||
ldi dispH,0b00011000 |
||||
ldi dispL,0b10010111 |
||||
ldi r16,100 |
||||
nav: |
||||
ldi r17,255 |
||||
nav2: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne nav2 |
||||
dec r16 |
||||
brne nav |
||||
|
||||
ldi r16,0b00000000 ;disable pullupy a 0 na anody. Musime setrit energii! |
||||
out PORTD,r16 |
||||
clr r16 |
||||
clr r17 |
||||
|
||||
; INIT LOOP |
||||
ldi InitLoopN, CUvodniIntervaly ;cekej n intervalu |
||||
ldi r19,CInitLoopMax ;delka prvniho intervalu jako obecny interval |
||||
;soucasny interval: r19, defaultni interval: CInitLoopMax |
||||
TimIntEnable ;zapni casovac (makro) |
||||
InitLoop: |
||||
;kontroluje se InitLoopN. snizovani zajistuje casovac. |
||||
cpi InitLoopN,0 ;zbyva 0 intervalu? |
||||
brne InitLoop ;pokud ne, testuj znova |
||||
|
||||
; P R I P R A V Y N A H L A V N I P R O G R A M |
||||
cli ;vypni preruseni - skoncila uvodni smycka, zacina odpocitavani |
||||
;vycisteni registru |
||||
clr r16 ;vynuluj registry |
||||
clr r17 |
||||
clr r18 |
||||
clr r19 |
||||
|
||||
;pullupy PORTD |
||||
ldi r16,0b01111100 ;enable pullup |
||||
out PORTD,r16 |
||||
|
||||
;cas 99 |
||||
ldi numL,9 |
||||
ldi numH,9 |
||||
|
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
;vychozi rozlozeni dratu |
||||
in wOld,PIND ;nastaveni stareho rozlozeni dratu |
||||
andi wOld,0b01111000 ;ignorovat anody a spravny drat |
||||
;nastaveni vychoziho rozlozeni dratu k prestrihnuti |
||||
mov r16, wOld ;uloz wOld -> r16 |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum pridej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
ldi r19,CUnitSecs ;nastav citac intervalu pro hlavni odpocet |
||||
|
||||
ldi r16,0b11111111 ;255 na PORTB, vse zhasnuto |
||||
out PORTB, r16 |
||||
|
||||
sei ;zacina hlavni program s casovacem, bude se pouzivat preruseni |
||||
|
||||
loop: |
||||
rcall WireTest ;test dratku |
||||
|
||||
sbic PIND,2 ;pokud je spravny drat PD2 = 0, preskoc |
||||
rjmp CHCIP ;skoc na CHCIP |
||||
;spravny drat je neprerusen |
||||
|
||||
rcall multiplex |
||||
|
||||
rjmp loop ;hlavni smycka se opakuje |
||||
|
||||
multiplex: |
||||
push r16 |
||||
push r17 |
||||
;DISPLEJ JEDNOTEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
sbi PORTD,1 ;PORTD = 01 - zapnout anodu pro jednotky |
||||
out PORTB,dispL ;PORTB = dispL (displej jednotek) |
||||
ldi r17,100 ;pocet smycek |
||||
dL: ;smycka |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dL |
||||
|
||||
;DISPLEJ DESITEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,1 |
||||
sbi PORTD,0 ;PORTD 10 - zapnout anodu pro desitky |
||||
out PORTB,dispH ;PORTB = dispH (displej desitek) |
||||
ldi r17,100 ;pocet smycek |
||||
dH: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dH |
||||
|
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
cbi PORTD,1 |
||||
pop r17 |
||||
pop r16 |
||||
ret |
||||
|
||||
; r17 konvertuj do 7segmentovyho kodu pro displej se spol. anodou DECGAFB ---> r16 |
||||
dec7seg: ;dec7seg(r17) -> r16 |
||||
clr r16 ;do r16 budeme ukladat vystup, v r17 je vstupni cislo 0-9 |
||||
|
||||
cpi r17,9 ;je r17 = 9? |
||||
brne dec7segN8 ;neni -> pokracuj s 8 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000000 ;katody DCGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN8: |
||||
cpi r17,8 ;je r17 = 8? |
||||
brne dec7segN7 ;neni -> pokracuj s 7 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000000 ;katody DECGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN7: |
||||
cpi r17,7 ;je r17 = 7? |
||||
brne dec7segN6 ;neni -> pokracuj s 6 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001010 ;katody CAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN6: |
||||
cpi r17,6 ;je r17 = 6? |
||||
brne dec7segN5 ;neni -> pokracuj s 5 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000001 ;katody DECGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN5: |
||||
cpi r17,5 ;je r17 = 5? |
||||
brne dec7segN4 ;neni -> pokracuj s 4 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000001 ;katody DCGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN4: |
||||
cpi r17,4 ;je r17 = 4? |
||||
brne dec7segN3 ;neni -> pokracuj s 3 |
||||
; DEChGAFB |
||||
ldi r16, 0b11000100 ;katody CGFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN3: |
||||
cpi r17,3 ;je r17 = 3? |
||||
brne dec7segN2 ;neni -> pokracuj s 2 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000010 ;katody DCGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN2: |
||||
cpi r17,2 ;je r17 = 2? |
||||
brne dec7segN1 ;neni -> pokracuj s 1 |
||||
; DEChGAFB |
||||
ldi r16, 0b00100010 ;katody DEGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN1: |
||||
cpi r17,1 ;je r17 = 1? |
||||
brne dec7segN0 ;neni -> pokracuj s 0 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001110 ;katody CB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN0: |
||||
; DEChGAFB |
||||
ldi r16, 0b00001000 ;katody DECAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
dec7segReturn: |
||||
ret |
||||
|
||||
; TEST DRATU (nutno volat rucne) |
||||
WireTest: |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
in r16,PIND |
||||
andi r16, 0b01111000 ;odfiltrovat anody a spravny drat |
||||
;test dratku |
||||
cp wOld,r16 ;porovnej r16 a wOld |
||||
brsh WireTestReturn ;wOld >= r16: nebyl prestrizen dratek, nebo byl nejaky spojen |
||||
;dratek byl prestrizen |
||||
;ODECTENI 3 desitek |
||||
cpi numH,3 ;jsou aspon 3 desitky? |
||||
brlo WireTestMaloCasu ;nejsou-li ani 3 desitky, vynuluj vse a vybuchni |
||||
subi numH,3 ;jinak odecti 3 desitky |
||||
|
||||
;nedoslo k vynulovani? |
||||
brne WireTestReturn ;desitky > 0: odejdi bez vybuchu |
||||
cpi numL,0 ;desitky = 0. kolik je jednotek? |
||||
breq WireTestBum ;je-li 0 jednotek, vybuchni |
||||
;0 desitek, n > 0 jednotek |
||||
rjmp WireTestReturn ;0 desitek ale n > 0 jednotek, odejdi bez vybuchu |
||||
WireTestMaloCasu: |
||||
clr numL ;vymazat jednotky |
||||
clr numH ;vymazat desitky |
||||
WireTestBum: |
||||
rcall BUM ;vybuchnout |
||||
WireTestReturn: |
||||
mov wOld, r16 ;uloz soucasny stav dratu do wOld |
||||
;v r16 jsou pouze rozpojene draty: 0b00010000 |
||||
in r17, PORTD ;do r17 stav portu D |
||||
mov r18,r16 |
||||
com r18 |
||||
and r17,r18 ;v r17 vynuluj bity patrici k rozpojenym dratum (ochrana X zkratu) |
||||
out PORTD,r17 ;dej na vystup |
||||
|
||||
in r17, DDRD ;do r17 DDRD |
||||
or r17, r16 ;k vystupnim pinum prodej prave rozpojeny drat |
||||
out DDRD,r17 |
||||
|
||||
;obnovit displej |
||||
mov r17,numL ;zpracovat numL |
||||
|
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispL,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispH,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
pop r18 |
||||
pop r17 |
||||
pop r16 |
||||
ret ;navrat |
||||
|
||||
; B U M |
||||
BUM: |
||||
;vybuch - blikajici nuly |
||||
cli ;vypni preruseni |
||||
|
||||
ldi r17,0 ;0 jednotek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
|
||||
ldi r17,0 ;0 desitek |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbr r16,0b00010000 ;1 na katodu H - zhasnout tecku |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
BUMsmycka: ;nekonecna smycka, blikaji nuly |
||||
ldi r16, 255 |
||||
BUMsmyckaMX: |
||||
rcall multiplex |
||||
dec r16 |
||||
brne BUMsmyckaMX |
||||
|
||||
ldi r16, 255 |
||||
BUMsmyckaPAUZA: |
||||
ldi r17, 255 |
||||
BUMsmyckaPAUZAb: |
||||
dec r17 |
||||
brne BUMsmyckaPAUZAb |
||||
dec r16 |
||||
brne BUMsmyckaPAUZA |
||||
|
||||
rjmp BUMsmycka |
||||
|
||||
; C H C I P |
||||
CHCIP: |
||||
;nekdo prestrihl spravny drat |
||||
cli |
||||
;ldi dispL,0b00000000 |
||||
;ldi dispH,0b00000000 |
||||
ldi r16,180 ; citac delky cekani |
||||
CHCIPsmycka: |
||||
mov r17,r16 |
||||
com r17 |
||||
CHCIPsmyckaMX: |
||||
rcall multiplex |
||||
dec r17 |
||||
brne CHCIPsmyckaMX |
||||
|
||||
mov r17,r16 ; nastaveni smycky cekani |
||||
inc r16 |
||||
cpi r16,255 |
||||
brsh CHCIPsleep ;uz je to moc dlouhy, usnout |
||||
|
||||
CHCIPsmyckaPAUZA: ;r17*200 |
||||
mov r18,r16 |
||||
CHCIPsmyckaPAUZAb: |
||||
dec r18 |
||||
brne CHCIPsmyckaPAUZAb |
||||
dec r17 |
||||
brne CHCIPsmyckaPAUZA |
||||
rjmp CHCIPsmycka |
||||
|
||||
CHCIPsleep: |
||||
cli |
||||
ldi r16,(1<<SE)|(1<<SM0) |
||||
out MCUCR,r16 |
||||
sleep |
||||
|
||||
; PRERUSENI OD CASOVACE f=1Hz |
||||
TIMER: ; casovac ma frekvenci 1Hz |
||||
push r16 |
||||
push r17 |
||||
push r18 |
||||
; r19 je citac intervalu |
||||
cpi InitLoopN,0 ;je InitLoopN = 0? |
||||
breq TIMERnormal ;Je-li InitLoopN = 0, pokracuj normalnim prerusenim |
||||
; probiha uvodni cekani |
||||
; test intervaloveho citace (pokud je InitLoopN > 0, pouziva k tomu se r19) |
||||
cpi r19,0 ;je r19 = 0? |
||||
breq TIMERsnizitILN ;je-li r19 = 0, snizit InitLoopN: jdi na TIMERsnizitILN |
||||
dec r19 ;jinak o 1 sniz r19 (intervalovy citac) |
||||
;out PORTB,r19 ;DEBUG test r19 |
||||
rjmp TIMERreturn ;a odejdi |
||||
TIMERsnizitILN: |
||||
dec InitLoopN ;snizit InitLoopN |
||||
ldi r19,CInitLoopMax ;nastaveni delky dalsiho intervalu |
||||
rjmp TIMERreturn ;odejdi |
||||
|
||||
TIMERnormal: |
||||
;invertuj tecku (Low) |
||||
ldi r16,0b00010000 |
||||
eor dispL,r16 |
||||
cbr dispH,0b00010000 |
||||
sbrc dispL,4 ;do H zkopiruj tecku z L (tim se zajisti, ze budou vzdy stejne) |
||||
sbr dispH,0b00010000 |
||||
|
||||
; r19 slouzi jako citac sekund |
||||
dec r19 ;sniz citac intervalu o 1 |
||||
brne TIMERreturn ;neni-li 0, odejdi |
||||
ldi r19,CUnitSecs ;nastaveni dalsiho intervalu |
||||
; ODECTENI JEDNOTKY |
||||
cpi numL,0 ;je jednotek vic nez 0? |
||||
brne TIMERnOdectiJednotku ;jednotky > 0, jdi na odecteni jednotky |
||||
;0 jednotek |
||||
cpi numH, 0 ;0 jednotek. je desitek vic nez 0? |
||||
brne TIMERnOdectiPresDesitku ;je-li desitek vic nez 0, jdi na odecteni desitky |
||||
;0 jednotek i desitek |
||||
rcall BUM |
||||
|
||||
TIMERnOdectiPresDesitku: |
||||
;0 jednotek, n > 0 desitek |
||||
dec numH ;odecti desitku |
||||
ldi numL,9 ;dej jednotky=9 |
||||
rjmp TIMERnOdecteniHotovo ;preskoc na TIMERnOdecteniHotovo |
||||
|
||||
TIMERnOdectiJednotku: |
||||
dec numL ;odecti jednotku |
||||
|
||||
TIMERnOdecteniHotovo: |
||||
cpi numH,0 ;test desitek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
cpi numL,0 ;test jednotek |
||||
brne TIMERnHotovoNevybuch ; neni nula -> ok |
||||
;je nula |
||||
rcall BUM ;je nula: vybuchni |
||||
|
||||
TIMERnHotovoNevybuch: |
||||
;uprav displej |
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispL,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
sbrc dispH,4 ;neni-li H nastaven na displeji, preskoc |
||||
sbr r16,0b00010000 ;nastaveni H v novem stavu displeje |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
;je obnoven stav displeje, konec preruseni |
||||
|
||||
TIMERreturn: |
||||
pop r18 ;navratit puvodni hodnoty registru |
||||
pop r17 |
||||
pop r16 |
||||
reti |
@ -0,0 +1,180 @@ |
||||
.device attiny2313 |
||||
;běží na 8MHz, ckdiv8=1 (vypnuto) |
||||
|
||||
; A L I A S Y |
||||
.def numL = r20 |
||||
.def numH = r21 |
||||
.def dispL = r22 |
||||
.def dispH = r23 |
||||
.def wOld = r24 |
||||
.def InitLoopN = r25 |
||||
|
||||
.equ CUvodniIntervaly = 1 ;pocet intervalu cekani |
||||
.equ CInitLoopMax = 10 ;delka 1 intervalu cekani (s) |
||||
.equ CUnitSecs = 1 ;delka 1 jednotky (s) - zacina se s 99 jednotkami |
||||
|
||||
; Z A C A T E K P R O G R A M U |
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
; NASTAVENI PO RESETU |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
; Nastaveni portu |
||||
ldi r16,0b11111111 ;smer portu B - vystupni: segmenty (=katody) |
||||
out DDRB,r16 |
||||
ldi r16,0b11111111 ;vse v PORTB na 1, segmenty zhasnuty |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;smer portu D - PB0 a PB1 jsou vystupni - spinaji anody displeje. Zbytek: dratky. PB2 je spravny drat |
||||
out DDRD,r16 |
||||
ldi r16,0b11111100 ;enable pullup, 0 na anody = zhasnout. dratky pripojeny na GND, s pullupy |
||||
out PORTD,r16 |
||||
|
||||
sei ;Global Interrupt Enable |
||||
|
||||
; P R I P R A V Y N A H L A V N I P R O G R A M |
||||
cli ;vypni preruseni - skoncila uvodni smycka, zacina odpocitavani |
||||
;vycisteni registru |
||||
clr r16 ;vynuluj registry |
||||
clr r17 |
||||
clr r18 |
||||
clr r19 |
||||
|
||||
;cas 99 |
||||
ldi numL,3 |
||||
ldi numH,7 |
||||
|
||||
;vychozi rozlozeni dratu |
||||
in wOld,PORTD ;nastaveni stareho rozlozeni dratu |
||||
andi wOld,0b01111000 ;ignorovat anody a spravny drat |
||||
|
||||
mov r17,numL ;zpracovat numL |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispL,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
|
||||
mov r17,numH ;zpracovat numH |
||||
rcall dec7seg ;najdi 7seg. reprezentaci jednotek a dej ji do r16 |
||||
mov dispH,r16 ;presunout vysledek do vystupu displeje |
||||
|
||||
;dispL a dispH maji nastaveny obsah |
||||
|
||||
ldi r19,CUnitSecs ;nastav citac intervalu pro hlavni odpocet |
||||
|
||||
ldi r16,0b111111 ;255 na PORTB, vse zhasnuto |
||||
out PORTB, r16 |
||||
|
||||
sei ;zacina hlavni program s casovacem, bude se pouzivat preruseni |
||||
|
||||
loop: |
||||
rcall multiplex |
||||
|
||||
rjmp loop ;hlavni smycka se opakuje |
||||
|
||||
multiplex: |
||||
push r16 |
||||
push r17 |
||||
;DISPLEJ JEDNOTEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
|
||||
cbi PORTD,1 |
||||
sbi PORTD,0 ;PORTD = 01 - zapnout anodu pro jednotky |
||||
out PORTB,dispL ;PORTB = dispL (displej jednotek) |
||||
ldi r17,100 ;pocet smycek |
||||
dL: ;smycka |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dL |
||||
|
||||
;DISPLEJ DESITEK |
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
cbi PORTD,0 |
||||
sbi PORTD,1 ;PORTD 10 - zapnout anodu pro desitky |
||||
out PORTB,dispH ;PORTB = dispH (displej desitek) |
||||
ldi r17,100 ;pocet smycek |
||||
dH: |
||||
nop |
||||
nop |
||||
nop |
||||
dec r17 |
||||
brne dH |
||||
|
||||
ser r16 ;katody na +: vypnout vsechny segmenty |
||||
out PORTB,r16 |
||||
|
||||
pop r17 |
||||
pop r16 |
||||
ret |
||||
|
||||
; r17 konvertuj do 7segmentovyho kodu pro displej se spol. anodou DECGAFB ---> r16 |
||||
dec7seg: ;dec7seg(r17) -> r16 |
||||
clr r16 ;do r16 budeme ukladat vystup, v r17 je vstupni cislo 0-9 |
||||
|
||||
cpi r17,9 ;je r17 = 9? |
||||
brne dec7segN8 ;neni -> pokracuj s 8 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000000 ;katody DCGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN8: |
||||
cpi r17,8 ;je r17 = 8? |
||||
brne dec7segN7 ;neni -> pokracuj s 7 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000000 ;katody DECGAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN7: |
||||
cpi r17,7 ;je r17 = 7? |
||||
brne dec7segN6 ;neni -> pokracuj s 6 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001010 ;katody CAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN6: |
||||
cpi r17,6 ;je r17 = 6? |
||||
brne dec7segN5 ;neni -> pokracuj s 5 |
||||
; DEChGAFB |
||||
ldi r16, 0b00000001 ;katody DECGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN5: |
||||
cpi r17,5 ;je r17 = 5? |
||||
brne dec7segN4 ;neni -> pokracuj s 4 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000001 ;katody DCGAF na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN4: |
||||
cpi r17,4 ;je r17 = 4? |
||||
brne dec7segN3 ;neni -> pokracuj s 3 |
||||
; DEChGAFB |
||||
ldi r16, 0b11000100 ;katody CGFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN3: |
||||
cpi r17,3 ;je r17 = 3? |
||||
brne dec7segN2 ;neni -> pokracuj s 2 |
||||
; DEChGAFB |
||||
ldi r16, 0b01000010 ;katody DCGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN2: |
||||
cpi r17,2 ;je r17 = 2? |
||||
brne dec7segN1 ;neni -> pokracuj s 1 |
||||
; DEChGAFB |
||||
ldi r16, 0b00100010 ;katody DEGAB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN1: |
||||
cpi r17,1 ;je r17 = 1? |
||||
brne dec7segN0 ;neni -> pokracuj s 0 |
||||
; DEChGAFB |
||||
ldi r16, 0b11001110 ;katody CB na 0; H = 0, ale bude prepsano pri vystupu |
||||
rjmp dec7segReturn |
||||
dec7segN0: |
||||
; DEChGAFB |
||||
ldi r16, 0b00001000 ;katody DECAFB na 0; H = 0, ale bude prepsano pri vystupu |
||||
dec7segReturn: |
||||
ret |
@ -0,0 +1,80 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def i=r20 ;prvni citac, cita jen pro zpomaleni |
||||
.def j=r21 ;druhy citac, cita az do TOP, pak se oba vynulujou |
||||
.def top=r22 ;maximalni hodnota pro citac j -> vynulovani a dalsi faze |
||||
|
||||
.org 0x0000 ;RESET |
||||
rjmp RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow A |
||||
rjmp CASOVAC |
||||
|
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
LDI r16,0b11111110 ;smer pinu |
||||
OUT DDRB,r16 |
||||
|
||||
LDI r16,0 ;PullUpy |
||||
OUT PORTB,r16 |
||||
|
||||
ldi r16,(1<<CS01)|(1<<CS00) ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,(1<<WGM01) ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 ;povolit interrupt od preteceni |
||||
ori r16, (1<<OCIE0A) |
||||
out timsk0,r16 |
||||
|
||||
clr i ;nastavime pocatecni hodnoty |
||||
clr j |
||||
ldi top,2 |
||||
|
||||
SEI ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
in r16,PINB ;kontrola jestli je PINB0 zapnutej |
||||
sbrs r16, 0 |
||||
rjmp LOOP ;NE -> jdi na loop |
||||
ldi top,1 ;ANO -> nastavit top na 1 a vymazat citace |
||||
clr i |
||||
clr j |
||||
CEKANI: |
||||
ldi top,2 ;cekame na uvolneni, zatim se prepina s top=2 |
||||
in r16,PINB ;kontrola jestli je PINB0 vypnutej |
||||
sbrc r16, 0 |
||||
rjmp CEKANI |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
cpi top,40 |
||||
breq CASEND |
||||
inc i |
||||
cpi i,10 |
||||
brne CASEND |
||||
clr i |
||||
inc j |
||||
cp j,top |
||||
brne CASEND |
||||
inc top |
||||
clr i |
||||
clr j |
||||
in r16,PORTB |
||||
sbrs r16,1 |
||||
sbi PORTB,1 |
||||
sbrc r16,1 |
||||
cbi PORTB,1 |
||||
CASEND: |
||||
RETI |
||||
|
@ -0,0 +1,96 @@ |
||||
;pokus |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.def CNTt=r24 ;CNTt pro tecku |
||||
.def CNTc=r25 ;CNTc pro carku |
||||
.def POM=r16 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI POM,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,POM |
||||
|
||||
LDI POM,0B00000100 ;nastavi vystupni piny |
||||
OUT DDRB,POM |
||||
;PB0 tecka |
||||
;PB1 carka |
||||
;PB2 vystup |
||||
|
||||
LOOP: |
||||
IN r16,PINB ;dej do r16 stav PINB |
||||
SBRS r16,0 ;neni-li bit 0 v r16 1, vymaz CNTt |
||||
CLR CNTt ; |
||||
INC CNTt ;CNTt+1 |
||||
|
||||
IN r16,PINB ;dej do r16 stav PINB |
||||
SBRS r16,1 ;neni-li bit 1 v r16 1, vymaz CNTc |
||||
CLR CNTc ; |
||||
INC CNTc ;CNTc+1 |
||||
|
||||
CPI CNTt,100 ;je-li CNTt=100, |
||||
BREQ TECKA ;jdi na TECKA |
||||
|
||||
CPI CNTc,100 ;je-li CNTc=100, |
||||
BREQ CARKA |
||||
|
||||
RJMP LOOP ;jsi na LOOP |
||||
|
||||
|
||||
KONEC: |
||||
IN r16,PINB ;r16=PINB |
||||
SBRC r16,0b00000001 ;je-li bit 0 v r16 0, praskoc nasledujici |
||||
RJMP KONEC ;jdi na KONEC |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
|
||||
TECKA: |
||||
LDI r16,0b00000100 ;na PORTB dej 0b00000100 |
||||
OUT PORTB,r16 |
||||
RCALL CEKANI ;udelej 1x cekani |
||||
CLR r16 ;vynuluj r16 a dej ho do PORTB |
||||
OUT PORTB,r16 |
||||
RCALL CEKANI ;udelej 1x cekani - mezera mezi znaky |
||||
RJMP LOOP ;navrat na LOOP |
||||
|
||||
CARKA: |
||||
LDI r16,0b00000100 ;na PORTB dej 0b00000100 |
||||
OUT PORTB,r16 |
||||
RCALL CEKANI ;udelej 3x cekani |
||||
RCALL CEKANI |
||||
RCALL CEKANI |
||||
CLR r16 ;vymaz r16 a dej ho na PORTB |
||||
OUT PORTB,r16 |
||||
RCALL CEKANI ;udelej 1x cekani - mezera mezi znaky |
||||
RJMP LOOP |
||||
|
||||
|
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 30 |
||||
L1: DEC r16 ;cekaci smycka vnejsi - zacatek |
||||
LDI r17, 100 |
||||
L2: DEC r17 ; cekaci smycka stredni - zacatek |
||||
LDI r18, 130 |
||||
L3: DEC r18 ; cekaci smycka vnitrni - zacatek |
||||
CPI r18, 0 |
||||
BRNE L3 ; cekaci smycka vnitrni - konec |
||||
CPI r17, 0 |
||||
BRNE L2 ; cekaci smycka stredni - konec |
||||
CPI r16, 0 |
||||
BRNE L1 ;cekaci smycka vnejsi - konec |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat z rutiny do kodu |
||||
|
@ -0,0 +1,130 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def ze=r19 |
||||
.def pr=r20 |
||||
.def sc=r21 |
||||
.def te=r22 |
||||
.def kv=r23 |
||||
.def qi=r24 |
||||
.def divf=r25 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
CLI ;zakazat vsechna preruseni |
||||
|
||||
LDI r16,0b00011111 ;výstupní = 1 |
||||
OUT DDRB,r16 |
||||
|
||||
LDI r16,0 ;vypnout PullUp |
||||
OUT PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
ldi divf,2 |
||||
SEI ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc ze |
||||
cpi ze,100 |
||||
BRNE CASEND |
||||
clr ze |
||||
INC pr |
||||
CPi pr,10 |
||||
BRNE CASEND |
||||
clr pr |
||||
INC sc |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,0 |
||||
cbi portb,0 |
||||
SBRS r16,0 |
||||
sbi portb,0 |
||||
|
||||
CP sc,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
inc te |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,1 |
||||
cbi portb,1 |
||||
SBRS r16,1 |
||||
sbi portb,1 |
||||
|
||||
CP te,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
inc kv |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,2 |
||||
cbi portb,2 |
||||
SBRS r16,2 |
||||
sbi portb,2 |
||||
|
||||
CP kv,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
inc qi |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,4 |
||||
cbi portb,4 |
||||
SBRS r16,4 |
||||
sbi portb,4 |
||||
CP qi,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
clr qi |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,3 |
||||
cbi portb,3 |
||||
SBRS r16,3 |
||||
sbi portb,3 |
||||
|
||||
|
||||
CASEND: |
||||
RETI |
||||
|
@ -0,0 +1,87 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def cnt=r18 |
||||
.def cm0=r19 |
||||
.def cm1=r20 |
||||
.def cm2=r21 |
||||
.def chc=r22 |
||||
.def dirs=r23 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
ldi r16,low(RAMEND) ;nastavi stack pointer |
||||
out SPL,r16 |
||||
|
||||
cli ;zakazat vsechna preruseni |
||||
|
||||
ldi r16,0b00011111 ;výstupní = 1 |
||||
out DDRB,r16 |
||||
|
||||
ldi r16,0 ;vypnout PullUp |
||||
out PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/32 |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,20 ;overflow 22 |
||||
out OCR0A,r16 ; |
||||
|
||||
in r16, TIMSK0 ;interrupt enable |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
ldi cm0,32 ;R |
||||
ldi cm1,16 ;G |
||||
ldi cm2,0 ;B |
||||
clr cnt |
||||
clr chc |
||||
ldi dirs,0b00000000 |
||||
|
||||
sei ;zapnout globalne interrupt |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc cnt |
||||
|
||||
cpi cnt,32 |
||||
brne nov |
||||
|
||||
clr cnt |
||||
cbi portb,0 |
||||
cbi portb,1 |
||||
cbi portb,2 |
||||
inc chc |
||||
cpi chc,255 |
||||
brne nov |
||||
|
||||
|
||||
|
||||
nov: |
||||
cp cnt,cm0 |
||||
brne not0 |
||||
sbi portb,0 |
||||
|
||||
not0: cp cnt,cm1 |
||||
brne not1 |
||||
sbi portb,1 |
||||
|
||||
not1: cp cnt,cm2 |
||||
brne not2 |
||||
sbi portb,2 |
||||
not2: |
||||
CASEND: |
||||
reti |
||||
|
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.hex" -d "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.obj" -e "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.eep" -m "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.map" "C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><ProjectName>EEPROM_nahoda</ProjectName><Created>14-Sep-2007 21:26:15</Created><LastEdit>14-Sep-2007 21:30:30</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>14-Sep-2007 21:26:15</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>EEPROM_nahoda.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm</EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATtiny13.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\</Folder><RelPath>EEPROM_nahoda.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>EEPROM_nahoda</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\EEPROM_nahoda.asm</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>EEPROM_nahoda.asm</FileName><Status>1</Status></File00000></Files><Workspace><File00000><Position>197 71 1026 566</Position><LineCol>108 0</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,108 @@ |
||||
;EEPROM_nahoda |
||||
;pokud je stisknuto tlacitko PB0, |
||||
;hrozne rychle se z EEPROM ctou hodnoty na adresach 0-3 |
||||
;a davaji se na PORTB |
||||
;Vypada to pak, jako by se pri drzeni tlacitka rozsvitily obe ledky PB1 a PB2, |
||||
;ale po pusteni tlacitka na nich zustane 'nahodna' kombinace 1 a 0. |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.def CNT=r20 |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
LDI r16,0b00000110 ;nastavi I/O nohy |
||||
OUT DDRB,r16 |
||||
|
||||
LOOP: |
||||
RCALL cekani ;zavolej cekani pro zpomaleni celeho programu |
||||
IN r16,PINB ;Porovnej stav PB0 s 1 a pokud neni rovno, jdi na LOOP |
||||
ANDI r16,0b00000001 |
||||
CPI r16,0b00000001 |
||||
BRNE LOOP |
||||
|
||||
MOV r17,CNT ;do r17 (adresovy registr) dej CNT |
||||
RCALL EEread ;zavolej cteni z EEPROM - adresa je r17, do r16 se ulozi data. |
||||
OUT PORTB,r16 ;posli data z r16 ven |
||||
|
||||
INC CNT ;inkrementuj CNT |
||||
CPI CNT,4 ;pokud je mensi nez 4, jdi na loop |
||||
BRLT LOOP |
||||
CLR CNT ;jinak vynuluj CNT |
||||
RJMP LOOP ;a jdi na LOOP |
||||
|
||||
; |
||||
;EEread je funkce pro cteni z EEPROM |
||||
;do r17 se ulozi adresa, |
||||
;zavola se EEread |
||||
;a v r16 se objevi hodnota, ktera je na adrese. |
||||
EEread: |
||||
SBIC EECR,1 |
||||
RJMP EEread ;cekani dokud neni EEPROM ready |
||||
|
||||
OUT EEARL, r17 ;ulozit adresu z r17 |
||||
SBI EECR,0 ;nastavenim EERE zacina cteni |
||||
IN r16,EEDR ;cteni dat z EEDR do r16 |
||||
|
||||
RET |
||||
;zapis do EEPROM, v R17 je ADRESA, v R16 jsou DATA |
||||
EEwrite: |
||||
SBIC EECR,EEPE |
||||
RJMP EEwrite ;cekani dokud neni EEPROM ready |
||||
|
||||
LDI r16, 0 ;nastavit programovaci mod |
||||
OUT EECR, r16 |
||||
|
||||
OUT EEARL, r17 ;dej adresu z r17 do EEARL |
||||
OUT EEDR, r16 ;dej data z r16 do EEDR |
||||
SBI EECR,EEMPE ;master program enable |
||||
SBI EECR,EEPE ;program enable |
||||
|
||||
RET |
||||
|
||||
;cekaci cyklus |
||||
CEKANI: |
||||
PUSH r18 ;ulozit pouzivane registry do STACKU |
||||
PUSH r17 |
||||
PUSH r16 |
||||
|
||||
LDI r16, 3 |
||||
L1: DEC r16 ;cekaci smycka vnejsi - zacatek |
||||
LDI r17, 3 |
||||
L2: DEC r17 ; cekaci smycka stredni - zacatek |
||||
LDI r18, 3 |
||||
L3: DEC r18 ; cekaci smycka vnitrni - zacatek |
||||
CPI r18, 0 |
||||
BRNE L3 ; cekaci smycka vnitrni - konec |
||||
CPI r17, 0 |
||||
BRNE L2 ; cekaci smycka stredni - konec |
||||
CPI r16, 0 |
||||
BRNE L1 ;cekaci smycka vnejsi - konec |
||||
|
||||
POP r16 ;nacist puvodni obsah registru ze STACKU |
||||
POP r17 |
||||
POP r18 |
||||
|
||||
RET ;navrat do hlavniho programu |
||||
|
||||
.eseg ;zacatek ESEGu |
||||
.org 0x00 ;adresa 0 |
||||
.DB 0b00000000 ;tady se definujou byty postupne podle adres. |
||||
.DB 0b00000010 |
||||
.DB 0b00000100 |
||||
.DB 0b00000110 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,2 @@ |
||||
:0400000000020406F0 |
||||
:00000001FF |
@ -0,0 +1,289 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm Fri Sep 14 21:26:55 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
DEF CNT r20 |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG cekani 00000030 |
||||
CSEG EEread 00000021 |
||||
CSEG EEwrite 00000027 |
||||
CSEG L1 00000034 |
||||
CSEG L2 00000036 |
||||
CSEG L3 00000038 |
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATTINY13"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_nahoda\EEPROM_nahoda.asm" Position="197 71 1026 566" LineCol="48 12" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,32 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATtiny13</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.hex</FILE> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.eep</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>19</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>26</LINE></LOOP> |
||||
<cekani><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>73</LINE></cekani> |
||||
<EEread><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>48</LINE></EEread> |
||||
<EEwrite><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>58</LINE></EEwrite> |
||||
<L1><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>79</LINE></L1> |
||||
<L2><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>81</LINE></L2> |
||||
<L3><FILE>C:\Documents and Settings\Ondra\Plocha\AVR\EEPROM_nahoda\EEPROM_nahoda.asm</FILE><LINE>83</LINE></L3> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1,2 @@ |
||||
@ECHO OFF |
||||
"C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe" -S "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\labels.tmp" -fI -W+ie -o "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.hex" -d "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.obj" -e "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.eep" -m "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.map" "C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm" |
@ -0,0 +1 @@ |
||||
<AVRStudio><MANAGEMENT><Created>06-Sep-2007 20:57:13</Created><LastEdit>13-Sep-2007 21:45:27</LastEdit><ProjectType>0</ProjectType><Created>06-Sep-2007 20:57:13</Created><Version>4</Version><Build>4, 13, 0, 528</Build><Created>08-Sep-2007 21:57:32</Created><LastEdit>08-Sep-2007 21:57:32</LastEdit><ProjectType>0</ProjectType><Created>08-Sep-2007 21:57:32</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName><ICON>208</ICON><ProjectName>EEPROM_access</ProjectName><Created>10-Sep-2007 21:52:01</Created><LastEdit>10-Sep-2007 21:52:01</LastEdit><ICON>208</ICON><ProjectType>0</ProjectType><Created>10-Sep-2007 21:52:01</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>Atmel AVR Assembler</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>EEPROM_access.obj</ObjectFile><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</EntryFile><ObjectFile></ObjectFile><EntryFile></EntryFile><ObjectFile></ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_PART>ATtiny13</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><CURRENT_PART>ATmega16.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND></IO_EXPAND><REGISTERNAMES></REGISTERNAMES><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATtiny13.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND></IO_EXPAND><REGISTERNAMES></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AvrAssembler><Folder>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\</Folder><RelPath>EEPROM_access.asm</RelPath><EntryFile>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</EntryFile><IncludePath>C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes</IncludePath><V2IncludePath></V2IncludePath><V2Parameters></V2Parameters><FileType>I</FileType><ObjectName>EEPROM_access</ObjectName><Wrap>0</Wrap><ErrorAsWarning>0</ErrorAsWarning><MapFile>1</MapFile><ListFile>0</ListFile><Version1>0</Version1><PreCompile></PreCompile><PostCompile></PostCompile><SourceFiles>,</SourceFiles></AvrAssembler><ProjectIncludeDirs><Dirs><Dir>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</Dir></Dirs></ProjectIncludeDirs><ProjectFiles><Files><Name>\EEPROM_access.asm</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>EEPROM_access.asm</FileName><Status>257</Status></File00000></Files><Workspace><File00000><Position>197 71 1026 566</Position><LineCol>100 0</LineCol><State>Maximized</State></File00000></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
@ -0,0 +1,49 @@ |
||||
;program cyklicky nacita z EEPROM adresy:0x00 hodnotu (0b00000101) a dava ji do PORTB. |
||||
|
||||
.include "tn13def.inc" |
||||
|
||||
.cseg |
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
|
||||
.org 0x0010 ;zacatek vlastniho programu |
||||
|
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
LDI r16,0b00000111 |
||||
OUT DDRB,r16 |
||||
|
||||
LOOP: |
||||
LDI r17,0 |
||||
RCALL EEread |
||||
OUT PORTB,r16 |
||||
RJMP LOOP |
||||
|
||||
; |
||||
;EEread je funkce pro cteni z EEPROM |
||||
;do r17 se ulozi adresa, |
||||
;zavola se EEread |
||||
;a v r16 se objevi hodnota, ktera je na adrese. |
||||
EEread: |
||||
SBIC EECR,1 |
||||
RJMP EEread ;cekani dokud neni EEPROM ready |
||||
|
||||
OUT EEARL, r17 ;ulozit adresu z r17 |
||||
SBI EECR,0 ;nastavenim EERE zacina cteni |
||||
IN r16,EEDR ;cteni dat z EEDR do r16 |
||||
|
||||
RET |
||||
|
||||
|
||||
.eseg |
||||
.org 0x00 |
||||
.DB 0b00000101 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,2 @@ |
||||
:0100000005FA |
||||
:00000001FF |
@ -0,0 +1,283 @@ |
||||
|
||||
AVRASM ver. 2.1.12 C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm Thu Sep 13 21:48:45 2007 |
||||
|
||||
|
||||
EQU SIGNATURE_000 0000001e |
||||
EQU SIGNATURE_001 00000090 |
||||
EQU SIGNATURE_002 00000007 |
||||
EQU SREG 0000003f |
||||
EQU SPL 0000003d |
||||
EQU GIMSK 0000003b |
||||
EQU GIFR 0000003a |
||||
EQU TIMSK0 00000039 |
||||
EQU TIFR0 00000038 |
||||
EQU SPMCSR 00000037 |
||||
EQU OCR0A 00000036 |
||||
EQU MCUCR 00000035 |
||||
EQU MCUSR 00000034 |
||||
EQU TCCR0B 00000033 |
||||
EQU TCNT0 00000032 |
||||
EQU OSCCAL 00000031 |
||||
EQU TCCR0A 0000002f |
||||
EQU DWDR 0000002e |
||||
EQU OCR0B 00000029 |
||||
EQU GTCCR 00000028 |
||||
EQU CLKPR 00000026 |
||||
EQU WDTCR 00000021 |
||||
EQU EEAR 0000001e |
||||
EQU EEDR 0000001d |
||||
EQU EECR 0000001c |
||||
EQU PORTB 00000018 |
||||
EQU DDRB 00000017 |
||||
EQU PINB 00000016 |
||||
EQU PCMSK 00000015 |
||||
EQU DIDR0 00000014 |
||||
EQU ACSR 00000008 |
||||
EQU ADMUX 00000007 |
||||
EQU ADCSRA 00000006 |
||||
EQU ADCH 00000005 |
||||
EQU ADCL 00000004 |
||||
EQU ADCSRB 00000003 |
||||
EQU MUX0 00000000 |
||||
EQU MUX1 00000001 |
||||
EQU ADLAR 00000005 |
||||
EQU REFS0 00000006 |
||||
EQU ADPS0 00000000 |
||||
EQU ADPS1 00000001 |
||||
EQU ADPS2 00000002 |
||||
EQU ADIE 00000003 |
||||
EQU ADIF 00000004 |
||||
EQU ADATE 00000005 |
||||
EQU ADSC 00000006 |
||||
EQU ADEN 00000007 |
||||
EQU ADCH0 00000000 |
||||
EQU ADCH1 00000001 |
||||
EQU ADCH2 00000002 |
||||
EQU ADCH3 00000003 |
||||
EQU ADCH4 00000004 |
||||
EQU ADCH5 00000005 |
||||
EQU ADCH6 00000006 |
||||
EQU ADCH7 00000007 |
||||
EQU ADCL0 00000000 |
||||
EQU ADCL1 00000001 |
||||
EQU ADCL2 00000002 |
||||
EQU ADCL3 00000003 |
||||
EQU ADCL4 00000004 |
||||
EQU ADCL5 00000005 |
||||
EQU ADCL6 00000006 |
||||
EQU ADCL7 00000007 |
||||
EQU ADTS0 00000000 |
||||
EQU ADTS1 00000001 |
||||
EQU ADTS2 00000002 |
||||
EQU ADC1D 00000002 |
||||
EQU ADC3D 00000003 |
||||
EQU ADC2D 00000004 |
||||
EQU ADC0D 00000005 |
||||
EQU ACME 00000006 |
||||
EQU ACIS0 00000000 |
||||
EQU ACIS1 00000001 |
||||
EQU ACIE 00000003 |
||||
EQU ACI 00000004 |
||||
EQU ACO 00000005 |
||||
EQU ACBG 00000006 |
||||
EQU AINBG 00000006 |
||||
EQU ACD 00000007 |
||||
EQU AIN0D 00000000 |
||||
EQU AIN1D 00000001 |
||||
EQU EEARL 0000001e |
||||
EQU EEAR0 00000000 |
||||
EQU EEAR1 00000001 |
||||
EQU EEAR2 00000002 |
||||
EQU EEAR3 00000003 |
||||
EQU EEAR4 00000004 |
||||
EQU EEAR5 00000005 |
||||
EQU EEDR0 00000000 |
||||
EQU EEDR1 00000001 |
||||
EQU EEDR2 00000002 |
||||
EQU EEDR3 00000003 |
||||
EQU EEDR4 00000004 |
||||
EQU EEDR5 00000005 |
||||
EQU EEDR6 00000006 |
||||
EQU EEDR7 00000007 |
||||
EQU EERE 00000000 |
||||
EQU EEWE 00000001 |
||||
EQU EEPE 00000001 |
||||
EQU EEMWE 00000002 |
||||
EQU EEMPE 00000002 |
||||
EQU EERIE 00000003 |
||||
EQU EEPM0 00000004 |
||||
EQU EEPM1 00000005 |
||||
EQU SREG_C 00000000 |
||||
EQU SREG_Z 00000001 |
||||
EQU SREG_N 00000002 |
||||
EQU SREG_V 00000003 |
||||
EQU SREG_S 00000004 |
||||
EQU SREG_H 00000005 |
||||
EQU SREG_T 00000006 |
||||
EQU SREG_I 00000007 |
||||
EQU SP0 00000000 |
||||
EQU SP1 00000001 |
||||
EQU SP2 00000002 |
||||
EQU SP3 00000003 |
||||
EQU SP4 00000004 |
||||
EQU SP5 00000005 |
||||
EQU SP6 00000006 |
||||
EQU SP7 00000007 |
||||
EQU ISC00 00000000 |
||||
EQU ISC01 00000001 |
||||
EQU SM0 00000003 |
||||
EQU SM1 00000004 |
||||
EQU SE 00000005 |
||||
EQU PUD 00000006 |
||||
EQU PORF 00000000 |
||||
EQU EXTRF 00000001 |
||||
EQU BORF 00000002 |
||||
EQU WDRF 00000003 |
||||
EQU CAL0 00000000 |
||||
EQU CAL1 00000001 |
||||
EQU CAL2 00000002 |
||||
EQU CAL3 00000003 |
||||
EQU CAL4 00000004 |
||||
EQU CAL5 00000005 |
||||
EQU CAL6 00000006 |
||||
EQU CLKPS0 00000000 |
||||
EQU CLKPS1 00000001 |
||||
EQU CLKPS2 00000002 |
||||
EQU CLKPS3 00000003 |
||||
EQU CLKPCE 00000007 |
||||
EQU DWDR0 00000000 |
||||
EQU DWDR1 00000001 |
||||
EQU DWDR2 00000002 |
||||
EQU DWDR3 00000003 |
||||
EQU DWDR4 00000004 |
||||
EQU DWDR5 00000005 |
||||
EQU DWDR6 00000006 |
||||
EQU DWDR7 00000007 |
||||
EQU SPMEN 00000000 |
||||
EQU PGERS 00000001 |
||||
EQU PGWRT 00000002 |
||||
EQU RFLB 00000003 |
||||
EQU CTPB 00000004 |
||||
EQU PORTB0 00000000 |
||||
EQU PB0 00000000 |
||||
EQU PORTB1 00000001 |
||||
EQU PB1 00000001 |
||||
EQU PORTB2 00000002 |
||||
EQU PB2 00000002 |
||||
EQU PORTB3 00000003 |
||||
EQU PB3 00000003 |
||||
EQU PORTB4 00000004 |
||||
EQU PB4 00000004 |
||||
EQU PORTB5 00000005 |
||||
EQU PB5 00000005 |
||||
EQU DDB0 00000000 |
||||
EQU DDB1 00000001 |
||||
EQU DDB2 00000002 |
||||
EQU DDB3 00000003 |
||||
EQU DDB4 00000004 |
||||
EQU DDB5 00000005 |
||||
EQU PINB0 00000000 |
||||
EQU PINB1 00000001 |
||||
EQU PINB2 00000002 |
||||
EQU PINB3 00000003 |
||||
EQU PINB4 00000004 |
||||
EQU PINB5 00000005 |
||||
EQU GICR 0000003b |
||||
EQU PCIE 00000005 |
||||
EQU INT0 00000006 |
||||
EQU PCIF 00000005 |
||||
EQU INTF0 00000006 |
||||
EQU PCINT0 00000000 |
||||
EQU PCINT1 00000001 |
||||
EQU PCINT2 00000002 |
||||
EQU PCINT3 00000003 |
||||
EQU PCINT4 00000004 |
||||
EQU PCINT5 00000005 |
||||
EQU TOIE0 00000001 |
||||
EQU OCIE0A 00000002 |
||||
EQU OCIE0B 00000003 |
||||
EQU TOV0 00000001 |
||||
EQU OCF0A 00000002 |
||||
EQU OCF0B 00000003 |
||||
EQU OCR0_0 00000000 |
||||
EQU OCR0_1 00000001 |
||||
EQU OCR0_2 00000002 |
||||
EQU OCR0_3 00000003 |
||||
EQU OCR0_4 00000004 |
||||
EQU OCR0_5 00000005 |
||||
EQU OCR0_6 00000006 |
||||
EQU OCR0_7 00000007 |
||||
EQU WGM00 00000000 |
||||
EQU WGM01 00000001 |
||||
EQU COM0B0 00000004 |
||||
EQU COM0B1 00000005 |
||||
EQU COM0A0 00000006 |
||||
EQU COM0A1 00000007 |
||||
EQU TCNT0_0 00000000 |
||||
EQU TCNT0_1 00000001 |
||||
EQU TCNT0_2 00000002 |
||||
EQU TCNT0_3 00000003 |
||||
EQU TCNT0_4 00000004 |
||||
EQU TCNT0_5 00000005 |
||||
EQU TCNT0_6 00000006 |
||||
EQU TCNT0_7 00000007 |
||||
EQU CS00 00000000 |
||||
EQU CS01 00000001 |
||||
EQU CS02 00000002 |
||||
EQU WGM02 00000003 |
||||
EQU FOC0B 00000006 |
||||
EQU FOC0A 00000007 |
||||
EQU PSR10 00000000 |
||||
EQU TSM 00000007 |
||||
EQU WDP0 00000000 |
||||
EQU WDP1 00000001 |
||||
EQU WDP2 00000002 |
||||
EQU WDE 00000003 |
||||
EQU WDCE 00000004 |
||||
EQU WDP3 00000005 |
||||
EQU WDTIE 00000006 |
||||
EQU WDTIF 00000007 |
||||
EQU LB1 00000000 |
||||
EQU LB2 00000001 |
||||
EQU CKSEL0 00000000 |
||||
EQU CKSEL1 00000001 |
||||
EQU SUT0 00000002 |
||||
EQU SUT1 00000003 |
||||
EQU CKDIV8 00000004 |
||||
EQU WDTON 00000005 |
||||
EQU EESAVE 00000006 |
||||
EQU SPIEN 00000007 |
||||
EQU RSTDISBL 00000000 |
||||
EQU BODLEVEL0 00000001 |
||||
EQU BODLEVEL1 00000002 |
||||
EQU DWEN 00000003 |
||||
EQU SELFPRGEN 00000004 |
||||
DEF XH r27 |
||||
DEF XL r26 |
||||
DEF YH r29 |
||||
DEF YL r28 |
||||
DEF ZH r31 |
||||
DEF ZL r30 |
||||
EQU FLASHEND 000001ff |
||||
EQU IOEND 0000003f |
||||
EQU SRAM_START 00000060 |
||||
EQU SRAM_SIZE 00000040 |
||||
EQU RAMEND 0000009f |
||||
EQU XRAMEND 00000000 |
||||
EQU E2END 0000003f |
||||
EQU EEPROMEND 0000003f |
||||
EQU EEADRBITS 00000006 |
||||
EQU PAGESIZE 00000010 |
||||
EQU INT0addr 00000001 |
||||
EQU PCI0addr 00000002 |
||||
EQU OVF0addr 00000003 |
||||
EQU ERDYaddr 00000004 |
||||
EQU ACIaddr 00000005 |
||||
EQU OC0Aaddr 00000006 |
||||
EQU OC0Baddr 00000007 |
||||
EQU WDTaddr 00000008 |
||||
EQU ADCCaddr 00000009 |
||||
EQU INT_VECTORS_SIZE 0000000a |
||||
CSEG RESET 00000010 |
||||
CSEG LOOP 00000014 |
||||
CSEG EEread 00000018 |
@ -0,0 +1 @@ |
||||
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATTINY13"/><Files><File00000 Name="C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm" Position="197 71 1026 566" LineCol="28 47" State="Maximized"/></Files></AVRWorkspace> |
@ -0,0 +1,27 @@ |
||||
<ASSEMBLER_INFO> |
||||
<VERSION>2.1.12</VERSION> |
||||
<DEVICE>ATtiny13</DEVICE> |
||||
<WORKING_DIR>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access</WORKING_DIR> |
||||
<INCLUDE_PATH> |
||||
<DIR>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes</DIR> |
||||
</INCLUDE_PATH> |
||||
<SOURCE_FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</SOURCE_FILE> |
||||
<INCLUDED_FILES> |
||||
<FILE>C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc</FILE> |
||||
</INCLUDED_FILES> |
||||
<OBJECT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.obj</FILE> |
||||
</OBJECT_FILES> |
||||
<HEX_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.hex</FILE> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.eep</FILE> |
||||
</HEX_FILES> |
||||
<OUTPUT_FILES> |
||||
<FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.map</FILE> |
||||
</OUTPUT_FILES> |
||||
<LABELS> |
||||
<RESET><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>12</LINE></RESET> |
||||
<LOOP><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>19</LINE></LOOP> |
||||
<EEread><FILE>C:\Documents and Settings\Ondra\Dokumenty\AVR projekty\t13-EEPROM_access\EEPROM_access.asm</FILE><LINE>30</LINE></EEread> |
||||
</LABELS> |
||||
</ASSEMBLER_INFO> |
@ -0,0 +1,130 @@ |
||||
;pracuje jako 5-ti bitovy binarni citac |
||||
;vystupy 3 a 4 jsou prohozene kvuli desce |
||||
.device attiny13 |
||||
.def ze=r19 |
||||
.def pr=r20 |
||||
.def sc=r21 |
||||
.def te=r22 |
||||
.def kv=r23 |
||||
.def qi=r24 |
||||
.def divf=r25 |
||||
|
||||
.org 0x0000 ;RESET |
||||
RJMP RESET ;skok na start po resetu |
||||
.org 0x0006 ;TC0 overflow |
||||
RJMP CASOVAC |
||||
.org 0x0007 |
||||
rjmp casovac |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
CLI ;zakazat vsechna preruseni |
||||
|
||||
LDI r16,0b00011111 ;výstupní = 1 |
||||
OUT DDRB,r16 |
||||
|
||||
LDI r16,0 ;vypnout PullUp |
||||
OUT PORTB,r16 |
||||
|
||||
ldi r16,0b00000011 ;TC0 prescaler na 64 |
||||
out TCCR0B,r16 ;4800000/64=75000Hz |
||||
|
||||
ldi r16,0b00000010 ;TC0 je v rezimu CTC |
||||
out TCCR0A,r16 |
||||
|
||||
ldi r16,75 ;Compare Match 0 A je 75 |
||||
out OCR0A,r16 ;75000/75=1000Hz interrupt |
||||
|
||||
in r16, TIMSK0 |
||||
ORI r16, 0b00000100 |
||||
out timsk0,r16 |
||||
|
||||
clr r16 |
||||
clr r17 |
||||
clr r18 |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
ldi divf,2 |
||||
SEI ;Global Interrupt Enable |
||||
|
||||
LOOP: |
||||
rjmp LOOP ;skok na loop |
||||
|
||||
CASOVAC: |
||||
inc ze |
||||
cpi ze,100 |
||||
BRNE CASEND |
||||
clr ze |
||||
INC pr |
||||
CPi pr,10 |
||||
BRNE CASEND |
||||
clr pr |
||||
INC sc |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,0 |
||||
cbi portb,0 |
||||
SBRS r16,0 |
||||
sbi portb,0 |
||||
|
||||
CP sc,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
inc te |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,1 |
||||
cbi portb,1 |
||||
SBRS r16,1 |
||||
sbi portb,1 |
||||
|
||||
CP te,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
inc kv |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,2 |
||||
cbi portb,2 |
||||
SBRS r16,2 |
||||
sbi portb,2 |
||||
|
||||
CP kv,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
inc qi |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,4 |
||||
cbi portb,4 |
||||
SBRS r16,4 |
||||
sbi portb,4 |
||||
CP qi,divf |
||||
BRNE CASEND |
||||
clr pr |
||||
clr sc |
||||
clr te |
||||
clr kv |
||||
clr qi |
||||
|
||||
in r16,PORTB |
||||
SBRC r16,3 |
||||
cbi portb,3 |
||||
SBRS r16,3 |
||||
sbi portb,3 |
||||
|
||||
|
||||
CASEND: |
||||
RETI |
||||
|
@ -0,0 +1,53 @@ |
||||
.device attiny13 |
||||
.def CNT=r25 |
||||
.def LED=r24 |
||||
|
||||
.org 0x0000 ;zacatek kodu |
||||
RJMP RESET ;skok na start po resetu |
||||
|
||||
.org 0x0010 |
||||
RESET: |
||||
LDI r16,low(RAMEND) ;nastavi stack pointer |
||||
OUT SPL,r16 |
||||
|
||||
CLI ;zakazat vsechna preruseni |
||||
|
||||
LDI LED,0 |
||||
|
||||
LDI r16,0b11111110 ;PB2 je vystupni, PB0 vstupni |
||||
OUT DDRB,r16 |
||||
|
||||
LDI r16,0 ;vypnout PullUp |
||||
OUT PORTB,r16 |
||||
|
||||
LOOP: |
||||
IN r16,PINB ;dej do r16 stav PINB |
||||
ANDI r16,0b00000001 |
||||
CPI r16,1 ;neni-li to 1, jdi na STORNO |
||||
BRNE STORNO |
||||
INC CNT ;CNT+1 |
||||
CPI CNT,50 ;neni-li CNT=100, jdi na LOOP |
||||
BRNE LOOP |
||||
|
||||
IN r16,PORTB ;r16=PORTB (vystupni port) |
||||
LDI r17,0b00000100 ;vyxoruj r16 s 0b00000100 |
||||
EOR r16,R17 |
||||
OUT PORTB,R16 ;a vysledek dej na PORTB |
||||
|
||||
KONEC: |
||||
IN r16,PINB ;cekani na vstup nuly do PINB0 |
||||
ANDI r16,0b00000001 |
||||
CPI r16,0 |
||||
BRNE KONEC ;neni-li r16=0, jdi na KONEC |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
STORNO: |
||||
LDI CNT,0 ;do CNT dej 0 |
||||
RJMP LOOP ;jdi na LOOP |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,5 @@ |
||||
# AVR Projects |
||||
|
||||
This repository holds my AVR projects. They're mostly too small to be worth a separate repository. |
||||
|
||||
Any code here is free to use in your projects, according to the MIT license. |
@ -0,0 +1,437 @@ |
||||
//Imitace casovane bomby, Ondrej Hruska (c) 2010-2012
|
||||
//-------------------------------------------------
|
||||
// Zapojeni:
|
||||
// +------u------+
|
||||
// reset --+ /RST Vcc +-- napajeni +5V
|
||||
// Anoda jednotek --+ PD0 PB7 +-- segment D
|
||||
// Anoda desitek --+ PD1 PB6 +-- sedment E
|
||||
// (nezapojeno) --+ XT2 PB5 +-- segment C
|
||||
// (nezapojeno) --+ XT1 PB4 +-- segment H
|
||||
// drat --+ PD2 PB3 +-- segment G
|
||||
// drat --+ PD3 PB2 +-- segment A
|
||||
// drat --+ PD4 PB1 +-- segment F
|
||||
// drat --+ PD5 PB0 +-- segment B
|
||||
// GND --+ GND PD6 +-- output signal (vybuch)
|
||||
// +-------------+
|
||||
//
|
||||
// Nazvy segmentu na displeji:
|
||||
// ---A---
|
||||
// | |
|
||||
// F B
|
||||
// | |
|
||||
// ---G---
|
||||
// | |
|
||||
// E C
|
||||
// | |
|
||||
// ---D--- H
|
||||
//
|
||||
|
||||
/*
|
||||
|
||||
Ports: |
||||
|
||||
PORTB - segments |
||||
|
||||
PD0 anode L |
||||
PD1 anode H |
||||
PD2 w0 |
||||
PD3 w1 |
||||
PD4 w2 |
||||
PD5 w3 |
||||
PD6 BOMB |
||||
PD7 -nc- |
||||
|
||||
|
||||
*/ |
||||
|
||||
|
||||
#include <avr/io.h> |
||||
#include <avr/interrupt.h> |
||||
#include <stdint.h> |
||||
#include <stdlib.h> |
||||
#include <util/delay_basic.h> |
||||
#include <avr/eeprom.h> |
||||
#include <avr/sleep.h> |
||||
|
||||
void updateDisplayBuffer(); |
||||
void ports_init(); |
||||
void timer_init(); |
||||
void multiplex(uint8_t times); |
||||
void boom(); |
||||
void halt(); |
||||
void init_animation(); |
||||
|
||||
|
||||
/*FUSES =
|
||||
{ |
||||
.low = 0xE4, |
||||
.high = 0xDF |
||||
};*/ |
||||
|
||||
|
||||
/** initial number of intervals */ |
||||
#define INIT_MINS 60 |
||||
|
||||
/** seconds in one interval */ |
||||
#define INIT_MAX 60 |
||||
|
||||
|
||||
/** seconds in one interval */ |
||||
#define RAPID_MAX 8 |
||||
|
||||
/** seconds in one interval */ |
||||
#define RAPID_COUNT 5 |
||||
|
||||
|
||||
|
||||
/* MACROS */ |
||||
|
||||
/** set one hertz interrupt */ |
||||
#define timer_enable() TIMSK=(1<<OCIE1A) |
||||
|
||||
/** disable timer interrupt */ |
||||
#define timer_disable() TIMSK=0 |
||||
|
||||
|
||||
|
||||
// segments DEChGAFB
|
||||
#define B (1<<0) |
||||
#define F (1<<1) |
||||
#define A (1<<2) |
||||
#define G (1<<3) |
||||
#define H (1<<4) |
||||
#define C (1<<5) |
||||
#define E (1<<6) |
||||
#define D (1<<7) |
||||
|
||||
// anodes
|
||||
#define AL 1 |
||||
#define AH 0 |
||||
|
||||
// wires
|
||||
#define W0 2 |
||||
#define W1 3 |
||||
#define W2 4 |
||||
#define W3 5 |
||||
|
||||
//bomb pin
|
||||
#define BM 6 |
||||
|
||||
// pin groups
|
||||
#define WIRES ((1<<W0)|(1<<W1)|(1<<W2)|(1<<W3)) |
||||
#define ANODES ((1<<AL)|(1<<AH)) |
||||
#define BOMB (1<<BM) |
||||
#define SEGMENTS 0xFF |
||||
|
||||
|
||||
uint8_t num2seg[10]; // array for num -> 7seg translation
|
||||
|
||||
#define BLANK 0 |
||||
|
||||
|
||||
/* VARIABLES */ |
||||
|
||||
uint8_t EEMEM wireset; |
||||
|
||||
uint8_t volatile cnt; // time counter (countdown)
|
||||
uint8_t volatile cnt_interval; // current interval counter in seconds
|
||||
uint8_t volatile cnt_interval_max; // length of current interval in seconds
|
||||
|
||||
uint8_t disp_H; // display buffer - ones
|
||||
uint8_t disp_L; // tens
|
||||
|
||||
uint8_t volatile wires; |
||||
uint8_t volatile last_wires; |
||||
uint8_t is_one_digit; |
||||
|
||||
uint8_t wire_shutdown; //absolute mask
|
||||
uint8_t wire_boom; |
||||
//remaining two are for RAPID COUNTDOWN (30 s)
|
||||
|
||||
|
||||
|
||||
|
||||
/* INTERRUPT VECTORS */ |
||||
|
||||
/** one second interrupt */ |
||||
ISR(TIMER1_COMPA_vect){ |
||||
|
||||
cnt_interval++; |
||||
|
||||
if(!is_one_digit) disp_H ^= H; |
||||
disp_L ^= H; |
||||
|
||||
if(cnt_interval >= cnt_interval_max){ |
||||
cnt_interval=0; |
||||
cnt--; |
||||
//to tens and ones
|
||||
updateDisplayBuffer(); |
||||
} |
||||
|
||||
//time over?
|
||||
if(cnt==0){ |
||||
boom(); |
||||
} |
||||
} |
||||
|
||||
/** MAIN */ |
||||
int main() |
||||
{ |
||||
cnt = INIT_MINS; |
||||
cnt_interval = 0; |
||||
cnt_interval_max = INIT_MAX; |
||||
is_one_digit = 0; |
||||
disp_H = 0; |
||||
disp_L = 0; |
||||
last_wires = WIRES; |
||||
|
||||
|
||||
num2seg[0] = A|B|C|D|E|F; |
||||
num2seg[1] = B|C; |
||||
num2seg[2] = A|B|G|E|D; |
||||
num2seg[3] = A|B|G|C|D; |
||||
num2seg[4] = F|G|B|C; |
||||
num2seg[5] = A|F|G|C|D; |
||||
num2seg[6] = A|C|D|E|F|G; |
||||
num2seg[7] = A|B|C; |
||||
num2seg[8] = A|B|C|D|E|F|G; |
||||
num2seg[9] = A|B|C|D|F|G; |
||||
|
||||
timer_disable(); |
||||
timer_init(); |
||||
timer_reset(); |
||||
|
||||
ports_init(); |
||||
init_animation(); |
||||
|
||||
last_wires = ~(PIND & WIRES); |
||||
|
||||
//wire set
|
||||
//read wireset number
|
||||
uint8_t wireset_r = eeprom_read_byte((uint8_t*)&wireset); |
||||
//go to next one, reset if >11
|
||||
wireset_r++; |
||||
if(wireset_r>=12) wireset_r=0; |
||||
//store new value
|
||||
eeprom_write_byte((uint8_t*)&wireset,wireset_r); |
||||
|
||||
//select wires for wireset
|
||||
uint8_t ws_boom[12] = {(1<<W1), (1<<W0), (1<<W2), (1<<W0), (1<<W3), (1<<W0), (1<<W1), (1<<W1), (1<<W3), (1<<W2), (1<<W2), (1<<W3)}; |
||||
uint8_t ws_shutdown[12] = {(1<<W0), (1<<W3), (1<<W1), (1<<W2), (1<<W2), (1<<W1), (1<<W3), (1<<W2), (1<<W1), (1<<W0), (1<<W3), (1<<W0)}; |
||||
|
||||
wire_boom = ws_boom[wireset_r]; |
||||
wire_shutdown = ws_shutdown[wireset_r]; |
||||
|
||||
|
||||
updateDisplayBuffer(); |
||||
timer_enable(); |
||||
sei(); |
||||
|
||||
|
||||
uint8_t diff; |
||||
|
||||
|
||||
while(1){ |
||||
multiplex(50); |
||||
//check wire
|
||||
wires = ~(PIND & WIRES); |
||||
diff = wires ^ last_wires; |
||||
|
||||
//wire changed
|
||||
if(diff != 0){ |
||||
|
||||
//shutdown wire was connected last time
|
||||
if( (last_wires & wire_shutdown) != 0 && (diff & wire_shutdown) != 0){ |
||||
//shutdown wire!
|
||||
halt(); |
||||
exit(0); |
||||
|
||||
}else if( (last_wires & wire_boom) != 0 && (diff & wire_boom) != 0){ |
||||
//bomb launched!
|
||||
boom(); |
||||
exit(0); |
||||
|
||||
}else{ |
||||
//rapid
|
||||
if(cnt_interval_max > RAPID_MAX){ |
||||
cnt_interval_max = RAPID_MAX; |
||||
|
||||
if(cnt>RAPID_COUNT){ |
||||
cnt = RAPID_COUNT; |
||||
cnt_interval = 0; |
||||
timer_reset(); |
||||
updateDisplayBuffer(); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
} |
||||
last_wires = wires; |
||||
} |
||||
|
||||
cli(); |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
/** put corrent segments into display buffer (from cnt) */ |
||||
void updateDisplayBuffer(){ |
||||
div_t foo = div((int)cnt,10); |
||||
//keep decimal dots
|
||||
disp_H = (disp_L & H) | num2seg[foo.quot]; |
||||
disp_L = (disp_L & H) | num2seg[foo.rem]; |
||||
if(foo.quot == 0){ |
||||
disp_H = 0; |
||||
is_one_digit = 1; |
||||
}else{ |
||||
is_one_digit = 0; |
||||
} |
||||
} |
||||
|
||||
|
||||
/** show display, repeat "times" x */ |
||||
void multiplex(uint8_t times){ |
||||
for(; times>0; times--){ |
||||
|
||||
PORTB = ~disp_L; // TENS segments; common anode, needs invert
|
||||
PORTD &= ~ANODES; // reset anodes
|
||||
PORTD |= (1<<AL); // turn TENS anode on
|
||||
_delay_loop_1(255); // wait
|
||||
|
||||
|
||||
PORTB = ~disp_H; // ONES segments; common anode, needs invert
|
||||
PORTD &= ~ANODES; // reset anodes
|
||||
PORTD |= (1<<AH); // turn ONES anode on
|
||||
_delay_loop_1(255); // wait
|
||||
|
||||
} |
||||
PORTB = ~BLANK; //display off
|
||||
} |
||||
|
||||
void multiplex_pwm(uint8_t times, uint8_t delay){ |
||||
for(; times>0; times--){ |
||||
|
||||
PORTB = ~disp_L; // TENS segments; common anode, needs invert
|
||||
PORTD &= ~ANODES; // reset anodes
|
||||
PORTD |= (1<<AL); // turn TENS anode on
|
||||
_delay_loop_1(255-delay); // wait
|
||||
|
||||
|
||||
PORTD &= ~(1<<AL); |
||||
_delay_loop_1(delay); |
||||
|
||||
|
||||
PORTB = ~disp_H; // ONES segments; common anode, needs invert
|
||||
PORTD &= ~ANODES; // reset anodes
|
||||
PORTD |= (1<<AH); // turn ONES anode on
|
||||
_delay_loop_1(255-delay); // wait
|
||||
|
||||
PORTD &= ~(1<<AH); |
||||
_delay_loop_1(delay); |
||||
|
||||
} |
||||
PORTB = ~BLANK; //display off
|
||||
} |
||||
|
||||
|
||||
/** the boom */ |
||||
void boom(){ |
||||
|
||||
cli(); |
||||
|
||||
PORTD |= BOMB; //activate bomb
|
||||
PORTD &= ~WIRES; // turn off wire pullups
|
||||
|
||||
disp_H = 0b01010101; |
||||
disp_L = 0b10101010; |
||||
|
||||
while(1){ |
||||
disp_H ^= 0xff; |
||||
disp_L ^= 0xff; |
||||
|
||||
longmpx(); |
||||
} |
||||
|
||||
// PORTD |= ANODES; // turn both anodes on
|
||||
// PORTB = 0x00; // all segments on
|
||||
// __asm__("cli");
|
||||
|
||||
exit(0); |
||||
} |
||||
|
||||
|
||||
/** the boom */ |
||||
void halt(){ |
||||
|
||||
|
||||
|
||||
PORTD &= ~WIRES; |
||||
|
||||
for(uint8_t volatile pause=0; pause < 0xff; pause++){ |
||||
multiplex_pwm(40,pause); |
||||
} |
||||
|
||||
//animation
|
||||
|
||||
PORTD = (1<<AL); // higher part
|
||||
PORTB = ~H; // show one dot
|
||||
|
||||
timer_disable(); |
||||
cli(); |
||||
|
||||
for(;;){} |
||||
|
||||
exit(0); |
||||
} |
||||
|
||||
/** set up ports */ |
||||
void ports_init(){ |
||||
|
||||
DDRB = SEGMENTS; // segments to output
|
||||
PORTB = SEGMENTS; // turned off (cathodes!)
|
||||
|
||||
DDRD = ANODES|BOMB; // set outputs
|
||||
PORTD = WIRES; // enable wire pullups
|
||||
|
||||
} |
||||
|
||||
|
||||
/** set timer1 to one hertz */ |
||||
void timer_init(){ |
||||
TCCR1A = 0; |
||||
TCCR1B=(1<<WGM12)|(1<<CS12); |
||||
OCR1AH=0b01111010; |
||||
OCR1AL=0b00010010; |
||||
} |
||||
|
||||
/** clear timer */ |
||||
void timer_reset(){ |
||||
TCNT0 = 0; |
||||
} |
||||
|
||||
void longmpx(){ |
||||
for(uint8_t i=2; i>0; i--){ |
||||
multiplex(250); |
||||
} |
||||
} |
||||
|
||||
/** animation on startup */ |
||||
void init_animation(){ |
||||
|
||||
disp_H = BLANK; |
||||
disp_L = BLANK; |
||||
for(uint8_t i=0; i<10; i++){ |
||||
disp_H ^= 0xff; |
||||
disp_L ^= 0xff; |
||||
|
||||
longmpx(); |
||||
} |
||||
|
||||
disp_H = BLANK; |
||||
disp_L = BLANK; |
||||
|
||||
_delay_loop_1(255); |
||||
} |
@ -0,0 +1,74 @@ |
||||
PRG = main
|
||||
|
||||
MCU_TARGET = attiny2313
|
||||
OPTIMIZE = 2
|
||||
|
||||
|
||||
LFUSE = 0xE4
|
||||
HFUSE = 0xDF
|
||||
|
||||
|
||||
|
||||
|
||||
DEFS =-std=gnu99 -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding --combine -fwhole-program -fno-inline-small-functions -fno-split-wide-types -fno-tree-scev-cprop -Wl,--relax,--gc-sections
|
||||
CC = avr-gcc
|
||||
OBJCOPY = avr-objcopy
|
||||
OBJDUMP = avr-objdump
|
||||
|
||||
OBJ = $(PRG).o
|
||||
|
||||
override CFLAGS = -g2 -Wall -O$(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
|
||||
|
||||
# program: $(PRG).elf lst hex
|
||||
#
|
||||
|
||||
all: $(PRG).elf lst eeprom |
||||
|
||||
$(PRG).elf: $(OBJ) |
||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||
avr-size -C -d --mcu=$(MCU_TARGET) $(PRG).elf
|
||||
|
||||
lst: $(PRG).lst |
||||
|
||||
%.lst: %.elf |
||||
$(OBJDUMP) -h -S $< > $@
|
||||
|
||||
hex: $(PRG).hex lst |
||||
|
||||
%.hex: %.elf |
||||
$(OBJCOPY) -j .text -j .data -O ihex $< $@
|
||||
|
||||
|
||||
install: wflash wfuses |
||||
|
||||
install_ee: weeprom |
||||
install_fl: wflash |
||||
install_fu: wfuses |
||||
|
||||
|
||||
wflash: $(PRG).hex |
||||
avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -B 16 -U flash:w:$(PRG).hex
|
||||
|
||||
|
||||
wfuses: |
||||
avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -B 16 -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m
|
||||
|
||||
|
||||
weeprom: ehex |
||||
avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -B 16 -U lfuse:w:$(LFUSE):m -U eeprom:w:$(PRG)_eeprom.hex
|
||||
|
||||
ee: ehex |
||||
eeprom: ehex |
||||
|
||||
ehex: $(PRG)_eeprom.hex |
||||
|
||||
%_eeprom.hex: %.elf |
||||
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
|
||||
|
||||
|
||||
clean: |
||||
rm -f *.o $(PRG).elf *.hex *.lst *~
|
||||
|
||||
term: |
||||
avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -B 16 -t
|
||||
|
@ -0,0 +1,69 @@ |
||||
PRG = main
|
||||
|
||||
MCU_TARGET = attiny13
|
||||
OPTIMIZE = 2
|
||||
|
||||
HZ = 9600000UL
|
||||
|
||||
|
||||
LFUSE = 0x7A
|
||||
HFUSE = 0xFF
|
||||
|
||||
|
||||
|
||||
|
||||
DEFS =-std=gnu99 -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -fwhole-program -fno-inline-small-functions -fno-split-wide-types -fno-tree-scev-cprop -Wl,--relax,--gc-sections
|
||||
CC = avr-gcc
|
||||
OBJCOPY = avr-objcopy
|
||||
OBJDUMP = avr-objdump
|
||||
|
||||
OBJ = $(PRG).o
|
||||
|
||||
override CFLAGS = -g2 -Wall -O$(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) -DF_CPU=$(HZ)
|
||||
|
||||
# program: $(PRG).elf lst hex
|
||||
#
|
||||
|
||||
$(PRG).elf: $(OBJ) |
||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||
avr-size -C -d --mcu=$(MCU_TARGET) $(PRG).elf
|
||||
|
||||
lst: $(PRG).lst |
||||
|
||||
%.lst: %.elf |
||||
$(OBJDUMP) -h -S $< > $@
|
||||
|
||||
hex: $(PRG).hex lst |
||||
|
||||
build: hex ehex |
||||
|
||||
%.hex: %.elf |
||||
$(OBJCOPY) -j .text -j .data -O ihex $< $@
|
||||
|
||||
|
||||
wflash: hex |
||||
sudo avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -U flash:w:$(PRG).hex
|
||||
|
||||
|
||||
wfuses: |
||||
sudo avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m
|
||||
|
||||
|
||||
weeprom: ehex |
||||
sudo avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -U lfuse:w:$(LFUSE):m -U eeprom:w:$(PRG)_eeprom.hex
|
||||
|
||||
ee: ehex |
||||
eeprom: ehex |
||||
|
||||
ehex: $(PRG)_eeprom.hex |
||||
|
||||
%_eeprom.hex: %.elf |
||||
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
|
||||
|
||||
|
||||
clean: |
||||
rm -f *.o $(PRG).elf *.hex *.lst *~
|
||||
|
||||
term: |
||||
sudo avrdude -P usb -c dragon_isp -p $(MCU_TARGET) -t
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue