parent
9c04c8f3f3
commit
868f28bff1
@ -1,29 +1,14 @@ |
|||||||
# Object files |
|
||||||
*.o |
*.o |
||||||
*.ko |
*.ko |
||||||
*.obj |
*.obj |
||||||
*.elf |
*.elf |
||||||
|
*.lst |
||||||
# Precompiled Headers |
*~ |
||||||
*.gch |
*.bak |
||||||
*.pch |
|
||||||
|
|
||||||
# Libraries |
|
||||||
*.lib |
*.lib |
||||||
*.a |
*.a |
||||||
*.la |
*.la |
||||||
*.lo |
*.lo |
||||||
|
|
||||||
# Shared objects (inc. Windows DLLs) |
|
||||||
*.dll |
|
||||||
*.so |
*.so |
||||||
*.so.* |
|
||||||
*.dylib |
|
||||||
|
|
||||||
# Executables |
|
||||||
*.exe |
|
||||||
*.out |
*.out |
||||||
*.app |
|
||||||
*.i*86 |
|
||||||
*.x86_64 |
|
||||||
*.hex |
*.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