- •Постановка задачи
- •Методика решения
- •Прототипы
- •Устройство и принцип работы Микроконтроллеры в общем
- •Микроконтроллер в утройстве
- •Описание выводов
- •Организация памяти
- •Хранение текста
- •Описание выводов
- •Управление памятью
- •Вывод текста
- •Подключение
- •Предложения по применению
- •Технические характеристики
- •.Db " Downloading aborted! " Программа на компьютере Основная форма (frmMain)
- •Форма передачи (frmSend)
Предложения по применению
Применяться такое устройство может везде, где нужен некоторый текст и при этом размеры критичны. Например, это устройство можно брать с собой в дорогу, предварительно записав в него часть какой-нибудь книги. В это, устройство как минимум, поместится 16 страниц формата А4, написанного шрифтом номер 10. Также это устройство можно использовать как шпаргалку.
Выводы
На мой взгляд, получилось довольно удобное устройство для чтения небольших текстов, которое возможно совершенствовать в будущем, улучшая программу в микроконтроллере и для компьютера. Также в будущем для хранения текста можно будет воспользоваться более современными накопителями информации, такими как: MultiMediaCard,SecureDigital. Сегодня они очень малы в размерах и велики в ёмкостях, что и является их основным достоинством, и они имеют относительно простой интерфейс.
Вторым, и более важным выводом я считаю получения опыта в разработке устройств, основанных на однокристальных микроконтроллерах, и опыта работы в программной среде AccelEDA, специализированной на разработке электронных схем и различной обработки их.
Технические характеристики
Питание: 4 батарейки типа “ААА”
Потребляемый ток: 12 мА
Микроконтроллер (нормальный/спящий) 5/0.8 мА
Память 5 мА
ЖКИ (без подсветки/с подсветкой) 2/25 мА
Операционная система для ПО: Windows95/98
Интерфейс связи с компьютером: RS232
Скорость передачи данных (в среднем) 2 Кбайт/с
Кодировка текста: Windows
Объём памяти: 64 Кбайт
Габаритные размеры (д/в/ш мм): 105 х 55 х 26
Библиография
“8-bit AVR microcontroller with 2K byte of in-system programmable flash AT90S2313”, “2-wire serial EEPROM 512K AT24C512”, “Instruction set”, 1999-2002 г.г. Atmel
“The I2C-bus and how to use it”, 1995 г. Philips Semiconductors
“HD44780U”, 1998 г. Hitachi
“KS0066U”, 1999 г. Samsung
“БЭК” 8-е издание, 1999 г. Корнюхин
Программа в микроконтроллере
CheatReader.asm
;Programm for CheatReader by Kiki
;Version 1.0, need parameters: 4MHz oscillator
.nolist
.include "2313DEF.asm"
.list
.def temp =r25
.def data =r24
.def data1 =r23
.def buttons =r17
.def curCHIP =r19
.def PACCL =r15
.def PACCH =r14
.def PACML =r13
.def PACMH =r12
;I n t e r r u p t h a n d l i n g
.cseg
rjmp RESET ;reset
.org 6
rjmp tmr0int
.org $B
;I n i t i a l i z a t i o n p a r t
RESET: clr buttons ;clearing variables
sbi ACSR,7 ;disable Analog Comparator
ldi temp,RAMEND ;preparing stack pointer
out SPL,temp
ldi temp,2
out TIMSK,temp
ldi temp,5
out TCCR0,temp
ser temp ;preparing ports
out DDRB,temp
ldi temp,0b1000001
out DDRD,temp
ldi temp,0b0111110
out PORTD,temp
clr del
clr del1
ldi del2,2 ;delay before LCD init
rcall delay
rcall PC204_init
clr YL ;Y for data in 24C512
clr YH
ldi curCHIP,0b10100000
rcall i2c_addrinit
ldi data,low(msg_greet*2)
ldi data1,high(msg_greet*2)
rcall msgout
clr del1
ldi del2,40
rcall delay
sei
;M a i n b o d y o f t h e p r o g r a m m
loop: rcall I2C_pgread
rcall PC204_scrprnt
butwait:clr del1 ;Button press waiting
ldi del2,4
rcall delay
rcall wtfbtn
;Buttons handling
cpi buttons,4 ;Button 3
brne nxtcmd1
tst YH
brne fstcmd
cpi YL,80
breq butwait
fstcmd: sbiw YH:YL,60
sbiw YH:YL,60
sbiw YH:YL,40
rcall i2c_addrinit
rjmp loop
nxtcmd1:cpi buttons,8 ;Button 4
brne nxtcmd3
rjmp loop
nxtcmd3:cpi buttons,1 ;Button 1
brne nxtcmd4
cpi YL,80
brne jmptbeg
tst YH
breq butwait
jmptbeg:clr YL
clr YH
rcall i2c_addrinit
rjmp loop
nxtcmd4:cpi buttons,3 ;Button 1+2
brne nxtcmd5 ;Data receive
clr del1
ldi del2,20
rcall delay
ldi data,low(msg_actload*2)
ldi data1,high(msg_actload*2)
rcall msgout
rcall UART_getch
mov PACMH,data
rcall UART_putch
rcall UART_getch
mov PACML,data
rcall UART_putch
ldi data,low(msg_load*2)
ldi data1,high(msg_load*2)
rcall msgout
clr YL
clr YH
clr PACCL
clr PACCH
pacrecv:mov data,PACCL
rcall UART_putch
rcall UART_packrcv
sbrs buttons,1
rjmp noabort
ldi data,1 ;1 means - "download abort"
rcall UART_putch
clr YL
clr YH
rcall I2C_addrinit
ldi data,low(msg_ldabort*2)
ldi data1,high(msg_ldabort*2)
rcall msgout
ldi del2,30
rcall delay
rcall PC204_clear
rjmp loop
noabort:rcall I2C_pgwrite
ldi temp,1
add PACCL,temp
clr temp
adc PACCH,temp
cp PACCH,PACMH
brlo pacrecv
cp PACCL,PACML
brlo pacrecv
ldi data,low(msg_loaddn*2)
ldi data1,high(msg_loaddn*2)
rcall msgout
clr del1
ldi del2,30
rcall delay
clr YL
clr YH
rcall I2C_addrinit
rcall PC204_clear
rjmp loop
nxtcmd5:rjmp butwait ;Other...
;P r o c e d u r e s
wtfbtn: tst buttons
breq wtfbtn
ret
tmr0int:in buttons,PIND
lsr buttons
lsr buttons
com buttons
andi buttons,$F
reti
;U n i t s i n c l u d i n g
.include "PC2004.asm" ; to control LCD PC2004
.include "I2C_24C512.asm" ; to control AT24C512
.include "UART.asm" ; for communicationing CheatReader with PC
.include "Delays.asm" ; delays
.include "DATA.asm" ; of text data
.exit
Модуль PC2004.asm
;parameters: data1:(x)(x)(x)(x)(x)(x)(x)(RS)-RS bit, data-DB0~DB7
.def symbcnt =r18
.equ E =6
.equ RS =1
.equ PC204l2p0 =$C0
.equ PC204l3p0 =$94
.equ PC204l4p0 =$d4
PC204_write:
cbi PORTD,RS ;RS = 0
sbi DDRD,RS
sbrc data1,0 ;setting him or not
sbi PORTD,RS
bst data1,0 ;storing him in T-bit
ldi del,8 ;init bit-counter
mov temp,data
clr data1
PC_swp:ror temp ;swapping highest with lowest bits in data
rol data1 ; according the scheme of CheatReader
dec del
brne PC_swp
out PORTB,data1 ;outputting
sbi PORTD,E
nop
cbi PORTD,E
clr data1 ;restoring RS-bit
bld data1,0
ret
PC204_init: ;display initialization
clr data1
ldi data,$38 ;8-bit interf, 2-line display
rcall PC204_write
rcall symb_del
ldi data,1 ;clearing
rcall PC204_write
ldi del1,8
ldi del2,1
rcall delay
ldi data,$C ;switching on, cursor is blinking
rcall PC204_write
rcall symb_del
ret
PC204_scrprnt:
cli
clr symbcnt ;full screen output
ldi ZL,$60
PC204_cyc:
inc symbcnt
ld data,Z+ ;loading indirect byte to data
tst data
brne PC204nz
ldi data,$CD
PC204nz:cpi data,10 ;Special chars converting
brne PC204o1
ldi data,$FE
rjmp PC204n
PC204o1:cpi data,13
brne PC204o2
ldi data,$FE
ldi temp,$20
st Z,temp
rjmp PC204n
PC204o2:cpi data,9 ;Tab symb 2 paragraph symb
brne PC204o3
ldi data,$FD
rjmp PC204n
PC204o3:cpi data,$5C ;"\" -> "/"
brne PC204o4
ldi data,$2F
rjmp PC204n
PC204o4:cpi data,$7E ;"~"
brne PC204o5
ldi data,$E9
rjmp PC204n
PC204o5:cpi data,$7B ;"{" -> "<<"
brne PC204o6
ldi data,$C8
rjmp PC204n
PC204o6:cpi data,$7D ;"}" -> ">>"
brne PC204o7
ldi data,$C9
rjmp PC204n
PC204o7:cpi data,$7C ;"|"
brne PC204t1
ldi data,$D1
rjmp PC204n
PC204t1:cpi data,$C0 ;$80 for CP866
brlo PC204n
;cpi data,$B0
;brsh PC204t2
push ZL
push ZH
ldi ZL,low(tab1*2)
ldi ZH,high(tab1*2)
subi data,$C0 ;$80 for CP866
add ZL,data
brcc PC204nc
inc ZH
PC204nc:lpm
pop ZH
pop ZL
mov data,r0
rjmp PC204n
PC204n: ldi data1,1 ;setting RS = 1
rcall PC204_write ;printing symbol
rcall symb_del ;waiting some
cpi symbcnt,20 ;jumping from line to line
brne PC204ntst1
ldi data,PC204l2p0
rcall PC204_goto
PC204ntst1:
cpi symbcnt,40
brne PC204ntst2
ldi data,PC204l3p0
rcall PC204_goto
PC204ntst2:
cpi symbcnt,60
brne PC204ntst3
ldi data,PC204l4p0
rcall PC204_goto
PC204ntst3:
cpi symbcnt,80
breq PC204dn
rjmp PC204_cyc
PC204dn:sei
ret
PC204_clear:
push data
push data1
clr data1
ldi data,1
rcall PC204_write
ldi del1,8
ldi del2,1
rcall delay
pop data1
pop data
ret
PC204_goto:
clr data1
rcall PC204_write
rcall symb_del
ret
msgout: rcall PC204_clear
ldi symbcnt,$60
msgloop:mov ZL,data
mov ZH,data1
lpm
adiw ZH:ZL,1
mov data,ZL
mov data1,ZH
mov ZL,symbcnt
st Z,r0
inc symbcnt
cpi symbcnt,$B0
brne msgloop
rcall PC204_scrprnt
ret
Модуль I2C_24C512.asm
.equ SCL = 0 ; SCL Pin number
.equ SDA = 1 ; SDA Pin number
I2C_start:
sbi DDRD,SDA
sbi PORTD,SDA ;making start condition...
sbi PORTD,SCL
cbi PORTD,SDA
cbi PORTD,SCL
ret
I2C_write:
sbi DDRD,SDA ;setting direction to "write"
ldi temp,8 ;initializing bit-counter
I2C_ntw:cbi PORTD,SDA
rol data ;rotating left through Carry
brcc I2C_ov ;if data bit is low skip next op
sbi PORTD,SDA ;writing current bit...
I2C_ov: sbi PORTD,SCL
nop
nop
nop
cbi PORTD,SCL
dec temp
brne I2C_ntw ;if 8 bits were tr-f-ed then get ack
rol data ;getting ACK
sbi PORTD,SDA ;setting SDA
cbi DDRD,SDA ;setting direction to read
sbi PORTD,SCL ;making strobe...
nop
nop
I2Cwait:sbic PIND,SDA ;if there is no ack then wait
rjmp I2Cwait
cbi PORTD,SCL
ret
I2C_read:
cbi DDRD,SDA ;setting direction of SDA pin to "read"
sbi PORTD,SDA
clr data ;clearing data buffer
ldi temp,8 ;initializing bit-counter
clc
I2C_ntr:rol data ;rotating left data buffer
nop
sbi PORTD,SCL ;making strobe
nop
sbic PIND,SDA ;reading SDA in carry
ori data,1 ;setting carry if SDA is high
nop
cbi PORTD,SCL
dec temp
brne I2C_ntr ;if 8 bits were tr-f-ed then get ack
;putting ACK
sbi DDRD,SDA ;setting direction of SDA pin to "write"
cbi PORTD,SDA ;sending "0" as acknowledge...
brtc I2Cack
sbi PORTD,SDA
I2Cack: sbi PORTD,SCL
nop
nop
cbi PORTD,SCL
ret
I2C_pgread:
rcall I2C_start
mov data,curCHIP
ori data,1
rcall I2C_write
ldi ZL,$60 ;setting begining RAM address to $60
clt
I2Crdloop:
rcall I2C_read
st Z+,data
cpi ZL,$AF
brne I2Crdloop
set
rcall I2C_read
st Z+,data
rcall I2C_stop
adiw YH:YL,60
adiw YH:YL,20
ret
I2C_pgwrite:
rcall I2C_start
mov data,curCHIP
rcall I2C_write
mov data,YH
rcall I2C_write
mov data,YL
rcall I2C_write
ldi ZL,$60 ;setting begining RAM address to $60
I2Cwrloop:
ld data,Z+
rcall I2C_write
cpi ZL,$A0
brne I2Cwrloop
rcall I2C_stop
adiw YH:YL,32
adiw YH:YL,32
ldi del1,100
ldi del2,1
rcall delay
ret
I2C_addrinit:
rcall I2C_start
mov data,curCHIP
rcall I2C_write
mov data,YH
rcall I2C_write
mov data,YL
rcall I2C_write
rcall I2C_stop
ret
I2C_stop:
sbi DDRD,SDA ;setting direction of SDA pin to "write"
cbi PORTD,SDA
sbi PORTD,SCL ;setting SCL high
sbi PORTD,SDA ;setting SDA high
cbi PORTD,SCL ;release SCL
ret
Модуль UART.asm
;parameters: data-receive/transmitt data byte
.equ RxD=5
.equ TxD=4
.equ HBIT=11 ;11
.equ BIT=21 ;21
UART_getch:
clt
brid UARTnoint1
set
cli
UARTnoint1:
ldi temp,8 ;8 data bit
clr data
sbi PORTD,RxD
cbi DDRD,RxD
UART_wt:sbic PIND,RxD ;Wait for start bit(0)
rjmp UART_wt
ldi del,HBIT ;half-bit delay
UART_d1:dec del
brne UART_d1
UART_gc:ldi del,BIT ;bit belay
UART_d2:dec del
brne UART_d2
clc ;clearing carry
sbic PIND,RxD ;if RX pin low then skip setting carry
sec ;
ror data ;rotating bit through carry into data
dec temp
brne UART_gc
nop
ldi del,HBIT ;half-bit delay
UART_d5:dec del
brne UART_d5
brtc UARTdsint1
sei
UARTdsint1:
ret
UART_putch:
clt
brid UARTnoint2
set
cli
UARTnoint2:
ldi temp,9 ;8 data + 1 start bit
sbi PORTD,TxD
sbi DDRD,TxD
clc
rjmp UARTstb
UART_pc:ror data ;rotating bit through carry into data
UARTstb:brcc UARTov1 ;watching to the carry and setting
sbi PORTD,TxD ; TxD-bit if carry is
UARTov1:brcs UARTov2
cbi PORTD,TxD ; and clearing TxD-bit if not
UARTov2:ldi del,BIT-1 ;bit belay
UART_d3:dec del
brne UART_d3
dec temp
brne UART_pc
ror data
sbi PORTD,TxD
ldi del,BIT ;stop bit belay
UART_d4:dec del
brne UART_d4
brtc UARTdsint2
sei
UARTdsint2:
ret
UART_packrcv:
ldi ZL,$60
UARTpgl:rcall UART_getch
st Z+,data
cpi ZL,$A0
brne UARTpgl
ret
Delays.asm
.def del =r22
.def del1 =r21
.def del2 =r20
symb_del:
ldi del,45
ldi del1,1
ldi del2,1
rcall delay
ret
delay: dec del ;3-byte delay
brne delay
dec del1
brne delay
dec del2
brne delay
ret
Модуль DATA.asm
.cseg
;Russian alphabet table: ABVGD...
; abvgd...
tab1: .db $41,$A0,$42,$A1,$E0,$45,$A3,$A4,$A5,$A6,$4B,$A7,$4D,$48,$4F,$A8,$50,$43,$54,$A9,$AA,$58,$E1,$AB,$AC,$E2,$AD,$AE,$62,$AF,$B0,$B1
.db $61,$B2,$B3,$B4,$E3,$65,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$6F,$BE,$70,$63,$BF,$79,$E4,$78,$E5,$C0,$C1,$E6,$C2,$C3,$C4,$C5,$C6,$C7,$CD,$B5
;Greetings message:
msg_greet:
.db "-=made by KikiWare=- 20 Greetings! 03 "
.db $42,$61,$63," ",$BE,$70,$B8,$B3,$65,$BF,$63,$BF,$B3,$79,$65,$BF," CheatReader v1.0 "
;"Downloading data..."
msg_load:
.db " Downloading data... Press 2 to abort "
;"Downloading is done."
msg_loaddn:
.db " Downloading is done. "
;"Download mode..."
msg_actload:
.db " Download mode is on.Waiting for begin... "
;"Downloading aborted..."
msg_ldabort: