Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CheatReader.doc
Скачиваний:
16
Добавлен:
30.04.2013
Размер:
329.73 Кб
Скачать

Предложения по применению

Применяться такое устройство может везде, где нужен некоторый текст и при этом размеры критичны. Например, это устройство можно брать с собой в дорогу, предварительно записав в него часть какой-нибудь книги. В это, устройство как минимум, поместится 16 страниц формата А4, написанного шрифтом номер 10. Также это устройство можно использовать как шпаргалку.

Выводы

На мой взгляд, получилось довольно удобное устройство для чтения небольших текстов, которое возможно совершенствовать в будущем, улучшая программу в микроконтроллере и для компьютера. Также в будущем для хранения текста можно будет воспользоваться более современными накопителями информации, такими как: MultiMediaCard,SecureDigital. Сегодня они очень малы в размерах и велики в ёмкостях, что и является их основным достоинством, и они имеют относительно простой интерфейс.

Вторым, и более важным выводом я считаю получения опыта в разработке устройств, основанных на однокристальных микроконтроллерах, и опыта работы в программной среде AccelEDA, специализированной на разработке электронных схем и различной обработки их.

Технические характеристики

Питание: 4 батарейки типа “ААА”

Потребляемый ток: 12 мА

Микроконтроллер (нормальный/спящий) 5/0.8 мА

Память 5 мА

ЖКИ (без подсветки/с подсветкой) 2/25 мА

Операционная система для ПО: Windows95/98

Интерфейс связи с компьютером: RS232

Скорость передачи данных (в среднем) 2 Кбайт/с

Кодировка текста: Windows

Объём памяти: 64 Кбайт

Габаритные размеры (д/в/ш мм): 105 х 55 х 26

Библиография

  1. “8-bit AVR microcontroller with 2K byte of in-system programmable flash AT90S2313”, “2-wire serial EEPROM 512K AT24C512”, “Instruction set”, 1999-2002 г.г. Atmel

  2. “The I2C-bus and how to use it”, 1995 г. Philips Semiconductors

  3. “HD44780U”, 1998 г. Hitachi

  4. “KS0066U”, 1999 г. Samsung

  5. “БЭК” 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: