(no subject)
6/4/20 21:58![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
;**************************************************************************=
;* d00dieLab production support email 48mail@gmail.ru
;* MCU: AVR ATmega48PA 16.000 mHz
;* set fuse (avrdude)
;* Date 05/04/2020
////////////////////////////////////////////////////////////////////////////
;* * * h i s t o r y * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//000 first start, print 48
//010 запущен двигатель с таблицей положения ротора
//012 ах много. в кои то веки сделана процедура печати. и два первых экрана.
//013 в менющке адд
//016 полные три меню. надо переделать скан кнопки, видимо с отслеживанием отпускания.
//020 полуфинал. лишнеe отрезанное лежит в папке temz.
//021 подрезан код и подлизаны каменты.
//022 сделан переход на следующий разряд при вводе по отпусканию кнопки экодера
//024 чуть улучшен скан поворота ротора сраного китайского энкодера, я его дом труба шатал
////////////////////////////////////////////////////////////////////hardware
// input pb0 encoder phase a
// input pb1 encoder phase b
// input pb2 encoder button
// input pb3 button "fine -"
// input pb4 button "fine +"
// input pb5 optointerrupter "end of cut"
// output pb6 cut motor on
// output pb7 step motor "step"
// r2 delay
// r3 delay
;r18 > в r18 загружается выводимый байт,
; в r18 загружается ASCII код символа, который будет отображен,
; из r18 транслируется в шину программный SPI.
;r28
;r29
;r30
;r31
.include "m48PAdef.inc"
.def ph_cou=r13
.def temp=r16
.def ttemp=r17
.def reglcd=r19
.def xo=r20
.def ox=r21
.def xooo=r22
.def oxoo=r23
.def ooxo=r24
.def ooox=r25
.def flags=r26
// ooooxooo было событе на энкодере. приемник обязан сбросить этот флаг.
// oooooxoo было нажатие кнопки энкодера
// ooooooxo был поворот якоря влево
// ooooooox был поворот якоря вправо
.cseg
.org 0
rjmp reset ; MCU: AVR ATmega328p
reti //jmp irq_at ; EXT_INT0 ; IRQ0 !!!! 0x0004
reti ;EXT_INT1 ; IRQ1 0x000!
reti ;PCINT0 ; PCINT0 0x0006
reti ;PCINT1 ; PCINT1 0x0008
reti ;PCINT2 ; PCINT2 0x000A
reti ;WDT ; Watchdog Timer 0x000C
reti ;TIM2_COMPA ; Timer2 Compare channel A 0x000E
reti ;TIM2_COMPB ; Timer2 Compare channel B 0x0010
reti ;TIM2_OVF ; Timer2 Overflow 0x0012
reti ;TIM1_CAPT ; Timer1 Capture 0x0014
reti ;TIM1_COMPA ; Timer1 Compare channel A 0x0016
reti ;TIM1_COMPB ; Timer1 Compare channel B 0x0018
reti ;TIM1_OVF ; Timer1 Overflow 0x001A
reti ;t0_int ; Timer0 Compare channel A 0x001C
reti ;TIM0_COMPB ; Timer0 Compare channel B 0x001E
reti ;TIM0_OVF ; Timer0 Overflow 0x0020
reti ;SPI_STC ; SPI Transfer Complete 0x0022
reti ;USART_RXC ; USART, RX Complete 0x0024
reti ;USART_UDRE ; USART, UDR Empty 0x0026
reti ;USART_TXC ; USART, TX Complete 0x0028
reti ;ADC ; ADC Conversion Complete 0x002A
reti ;EE_RDY ; EEPROM Ready 0x002C
reti ;ANA_COMP ; Analog Comparator 0x002E
reti ;TWI ; 2-wire Serial Interface 0x0030
reti ;SPM_RDY ; Store Program Memory Ready 0x0032
reset: cli
ldi temp,high(RAMEND) ; Main program start
out sph,temp ; Set Stack Pointer to top of RAM
ldi temp,low(RAMEND)
out spl,temp
rcall d10m
cli
ldi temp,high(RAMEND) ; Main program start
out sph,temp ; Set Stack Pointer to top of RAM
ldi temp,low(RAMEND)
out spl,temp
rcall clsreg // сброс регистров на всяк случай
rcall ini_io // настройка портов;
//============================================================== ; 1-вывод, -0 ввод
rcall rclk_0
rcall sclk_0
rcall d100m
rcall inilcd
rcall d100m
rcall hello // приветствие
rcall clssl // приветствие
rcall m_fine // fine tune step motor - "fine tune < * > exit@"
rcall clr80
rcall clrc0
rcall clr94
rcall clrd4
rcall xxzzzz // печать
rcall xxoooo // ввод
rcall clr80
rcall clrc0
rcall clr94
rcall clrd4
rcall zzxxxx // печать
rcall ooxxxx // ввод
rcall clr80
rcall clrc0
rrr: rcall step
rjmp rrr
rcall d1s
rcall d1s
//*******************************************************************************************
main: // вывод надписей на LCD
//*******************************************************************************************
zxzxzx: //ldi reglcd,0xc0 // вывод в позицию 00
/// rcall tx_dir
// in reglcd,pind
// ldi temp,7
// and reglcd,temp
// ldi temp,0x30
// add reglcd,temp
// rcall txdata // вывод байта
prncou: ldi reglcd,0x8d // вывод показанй счетчика
rcall tx_dir
ldi temp,0x30 // константа лоя преобразования значения разряда в код ASCII
mov r0,temp
ldi reglcd,0x3d
rcall txdata
pr_reg: ldi reglcd,0x8e // вывод показанй счетчика
rcall tx_dir
// mov reglcd,xo
// rcall tx_30
// mov reglcd,ox
// rcall tx_30
// mov reglcd,xooo
// rcall tx_30
// mov reglcd,oxoo
// rcall tx_30
// mov reglcd,ooxo
// rcall tx_30
// mov reglcd,ooox
// rcall tx_30
step: inc ph_cou
ldi zl,low (semist*2) ; загружаем регистр Z адресом метки .. semi step or full step
ldi zh,high(semist*2) ; загружаем регистр Z адресом метки
clr temp // создаем регистр равный 0
add zl,ph_cou ; (zl) формируем адрес положительного смещения
adc zh,temp ; (zh)
clr temp // обесточиваем двигатель
out portc,temp
lpm temp,z // берем из таблицы байт
out portc,temp // и передаем его в порт.
rcall d200u
rcall d1m
ret
// rcall co_inc
// rcall co_dec
// процедура проверки кнопки энкодера. устанавливает в регисстре флагов xxxx11xx.
// процедура вызывающая эту процедуру обязана сбросить эти флаги.
//enc_pr: sbis pind,2 // если бит =1 то через команду пауза и перепроверка.
// ret
// rcall d1m
// sbis pind,2
// ret
// sbr flags,0b00000100 // было нажатие. устанавливаем биты и выход.
// ret
// процедура проверки поворота якоря энкодера. устанавливает в регистре флагов
// xxxx1010 (влево) или xxxx1001 (вправо).
// процедура вызывающая эту процедуру обязана сбросить эти флаги.
enc_lr: rcall inb1b0 // загружаем байт в temp
cpi temp,0 // chfdybdftv c 0
brne l_or_r // не ноль. начинаем ловить направление.
ret // ноль, поворота из исходного не было. выход.
// якорь повернут.
// ожидаем поворот якоря в среднее положение с замкнутыми обеми контактами
l_or_r: rcall inb1b0 // загружаем байт в temp
cpi temp,3
brne l_or_r // еще не в центре (xxxxxx11). перейти и ждать еще если не равно
// равно. якорь в центре. теперь отлавливаем уход из центра- неравентство трем.
exit11: rcall p1us
rcall inb1b0 // получаем байт из порта и сброс лишних битов
cpi temp,3
breq exit11 // якорь все еше в центре, снова скан
// вышли на край
mov ttemp,temp // сохраняем направление и ждем поворот якоря в исходное
wait00: rcall inb1b0 // получаем байт из порта и сброс лишних битов
cpi temp,0
brne wait00
// ветка "якорь в исходном"
mov temp,ttemp // якорь в исходном. извлекаем и обрабатываем.
sbrc temp,1
rjmp down22
sbr flags,0b00001010
ret
down22: sbrc temp,0
ret
sbr flags,0b00001001
ret
inb1b0: // получение и загрузка в temp из порта pind - xxxx xx??
in temp,pind //получаем байт из порта
nop//rcall p1us
cbr temp,0b11111100 //сброс лишних битов
ret
// вызов передачи управляющей команды - ldi reglcd,(команда) call tx_dir
// вызов передачи байта данных - ldi reglcd,(байт) call txdata
///////////////////////////////////////////////////////////////////////////////////////
; настройка 44780===============================================
; LCD SERIAL MODULE ====================================================
// LCD hd44780===========================================================
;..............................................
; 4 RS 1: Data Input 0: Instruction code input
; 6 E 1,1>0 Enable Signal
;11 DB0
;12 DB1
;13 DB2
;14 DB3
;Instruction Code
; RS D7 D6 D5 D4 D3 D2 D1 D0
;Clear Display 0 0 0 0 0 0 0 0 1
;Return Home 0 0 0 0 0 0 0 1 *
;Entry Mode Set 0 0 0 0 0 0 1 I/D S
;Display ON/OFF 0 0 0 0 0 1 D C B
;Cursor and Display Shift 0 0 0 0 1 S/C R/L * * ???
;Function Set 0 0 0 1 DL N F * *
;Set CG RAM address 0 0 1 A A A A A A
;Set DD RAM address 0 1 A A A A A A A
;Write data to CG or DD RAM 1 D D D D D D D D
// code 0x0d= cursor on мигание
// code 0x0e= cursor on подчеркивание
// code 0x0c= cursor off
// http://avrprog.blogspot.com/2013/04/lcd1602com.html
// адресация знакомест стекляшки 2004
// 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93
// c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3
// 94 95 96 97...
// d4
inilcd:; Power ON, Wait more than 15ms
rcall d100m
; 01. Can't check BF before this instruction 0 0 1 1 Function set (8-bit interface)
ldi reglcd,3
swap reglcd
rcall txtune;rcall tx_cmd
; Wait more than 4.1ms
rcall p4_75m
; 02. Can't check BF before this instruction 0 0 1 1 Function set (8-bit interface)
ldi reglcd,3
swap reglcd
rcall txtune;tx_cmd
; Wait more than 100us
rcall p108us
; 03. Can't check BF before this instruction 0 0 1 1 Function set (8-bit interface)
ldi reglcd,3
swap reglcd
rcall txtune;tx_cmd
; BF can be checked after the following
; instructions. When BF is not checked,
; the waiting time between instructions
; is longer than the execution time.
; (See Instruction set)
; 04.
; 0 0 1 0 Function set (to 4-bit interface)
rcall p108us
ldi reglcd,2
swap reglcd
rcall txtune;tx_cmd
;'''''''''''''''''''''''''''''''''''''''''
; 4bits+4bits
;[4-bit Interface Specify display lines and character font ]
;These cannot be changed afterwards
; 0 0 1 0
; N F * * Function set
rcall d1m
ldi reglcd,2
swap reglcd
rcall txtune;rcall tx_cmd
rcall d100u
ldi reglcd,8
swap reglcd
rcall txtune;rcall tx_cmd
; 0 0 0 0
; 1 0 0 0 Display OFF
rcall d1m
ldi reglcd,0
swap reglcd
rcall txtune;rcall tx_cmd
rcall d100u
ldi reglcd,12
swap reglcd
rcall txtune;rcall tx_cmd
; 0 0 0 0
; 0 0 0 1 Display ON
rcall d1m
ldi reglcd,0
swap reglcd
rcall txtune;rcall tx_cmd
rcall d100u
ldi reglcd,1
swap reglcd
rcall txtune;rcall tx_cmd
; 0 0 0 0
; 0 1 I/D S entry mode set. end of initialisation
rcall d1m
ldi reglcd,0
swap reglcd
rcall txtune;rcall tx_cmd
rcall d100u
ldi reglcd,7
swap reglcd
rcall txtune;rcall tx_cmd
ret ;
; LCD SERIAL MODULE ====================================================
// передача данных в SPI at 74hc595.
// подпрограммы:
// txdata - передача данных из reglcd
// tx_dir - передача команды из reglcd
// txtune - передача тетрады при инициализации из reglcd
// tx7654 - передача четырех (старших) бит
// tx74er - передача 4х бит со стробом и rs
// lc - строб параллельной записи
// sc - строб последовательной записи
// pc4- данные, pc3- строб, pc1- защелкивание данных
// с в о п ы
tx_30: ldi temp,0x30
add reglcd,temp
rjmp txdata
tx_dir: clt ; сбросить флаг Т
rjmp tx_dt
txdata: set ; установить флаг Т
// байт у нас в rхх. вывод на ногу pc4. RS=1 (Данные) RS=0 (Команда)
tx_dt: rcall rclk_0
rcall sclk_0
// передача старшего байта
push reglcd
rcall tx74er
pop reglcd
// передача младшего байта
push reglcd
swap reglcd
rcall tx74er
pop reglcd
ret
//11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
txtune: clt ; сбросить флаг Т
rcall rclk_0
rcall sclk_0
rcall tx74er
ret
//12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
// посылка пакета с единицей
tx74er: push reglcd
rcall tx7654 //передача 4х бит
rcall data_1 // 1 в пин 6 - параллельный строб 44780
rcall sc // строб записи пятого бита.
BRTS sett // перейти, если это данные
rcall data_0 // это передается команда
rjmp rest
sett: rcall data_1 // это данные
rest: rcall sc // строб записи шестого бита.
rcall lc // параллельный строб 74595. защелкивание.
pop reglcd
// посылка пакета с нолем
push reglcd
rcall tx7654 //передача 4х бит
rcall data_0 // 0 в пин 6 - параллельный строб 44780
rcall sc // строб записи пятого бита.
BRTS settt // перейти, если это данные
rcall data_0 // это передается команда
rjmp restt
settt: rcall data_1 // это данные
restt: rcall sc // строб записи шестого бита.
rcall lc // параллельный строб 74595. защелкивание.
pop reglcd
// посылка пакета с единицей
push reglcd
rcall tx7654 //передача 4х бит
rcall data_1 // 1 в пин 6 - параллельный строб 44780
rcall sc // строб записи пятого бита.
BRTS setttt // перейти, если это данные
rcall data_0 // это передается команда
rjmp resttt
setttt: rcall data_1 // это данные
resttt: rcall sc // строб записи шестого бита.
rcall lc // параллельный строб 74595. защелкивание.
pop reglcd
ret
//13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
tx7654: sbrs reglcd,7 // устанавливается бит
rjmp jmp00
rcall data_1
rjmp jmp10
jmp00: rcall data_0
jmp10: rcall sc
rol reglcd //сдвиг всех на бит вправо
sbrs reglcd,7 // устанавливается бит
rjmp jmp01
rcall data_1
rjmp jmp11
jmp01: rcall data_0
jmp11: rcall sc
rol reglcd //сдвиг всех на бит вправо
sbrs reglcd,7 // устанавливается бит
rjmp jmp02
rcall data_1
rjmp jmp12
jmp02: rcall data_0
jmp12: rcall sc
rol reglcd //сдвиг всех на бит вправо
sbrs reglcd,7 // устанавливается бит
rjmp jmp03
rcall data_1
rjmp jmp13
jmp03: rcall data_0
jmp13: rcall sc
ret
//adding 2017
sc: rcall rclk_1 ; строб последовательной записи =1
rcall rclk_0 ; строб последовательной записи в исходное
ret
lc: rcall sclk_1 ; строб параллельной записи =1
rcall sclk_0 ; строб параллельной записи в исходное
ret
data_1: sbi portb,4 ;set data pin 74595
nop
nop
ret
data_0: cbi portb,4 ;clear data pin 74595
nop
nop
ret
rclk_1: sbi portb,3 ;set rclk pin 74595
nop
nop
ret
rclk_0: cbi portb,3 ;clear rclk pin 74595
nop
nop
ret
sclk_1: sbi portb,5 ;set sclk pin 74595
nop
nop
ret
sclk_0: cbi portb,5 ;clear sclk pin 74595
nop
nop
ret
p4_75m: ldi r16,86
mov r14,r16
ldi r16,50
mov r15,r16
p48m: dec r14
brne p48m
dec r15
brne p48m
ldi r16,86
mov r14,r16
ldi r16,50
mov r15,r16
p49m: dec r14
brne p49m
dec r15
brne p49m
ret
p1us:
nop
nop
nop
nop
nop
nop
nop
nop
ret
p108us: ldi r16,32 ;
mov r14,r16
ldi r16,2
mov r15,r16
p108: dec r14
brne p108
dec r15
brne p108
nop
ldi r16,27 ;
mov r14,r16
ldi r16,2
mov r15,r16
p109: dec r14
brne p109
dec r15
brne p109
nop
ret
// end of LCD hd44780 №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
; END LCD SERIAL MODULE ====================================================
;* * * * * * * * * call section * * * * * * * * *
d100u: ldi temp,19 ; 99.94us, 1599 clk
mov r2,temp
ldi temp,3
mov r3,temp
subc1c: dec r2
brne subc1c
dec r3
brne subc1c
ret
d1m: rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
ret
d200u: rcall d100u
rcall d100u
ret
d500u: rcall d100u
rcall d100u
rcall d100u
rcall d100u
rcall d100u
ret
d10m: rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
rcall d1m
ret
d100m: rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
rcall d10m
ret
d03s: rcall d100m
rcall d100m
rcall d100m
ret
d1s: rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
rcall d100m
ret
//////////////////////////////////////////
ini_io: ldi temp,0b00111000
sts 0x24,temp ; настройка ddrb , =1= - это на вывод.
nop
ldi temp,0
sts 0x25,temp ; portb
nop
ldi temp,0b00001111
sts 0x27,temp ; настройка ddrc
nop
ldi temp,0
out portc,temp
nop
ldi temp,0b11000000 ;
sts 0x2a,temp ; настройка ddrd
nop
ldi temp,0
sts 0x2b,temp ; portd
nop
ret
clsreg: clr r0
clr r1
clr r2
clr r3
clr r4
clr r5
clr r6
clr r7
clr r8
clr r9
clr r10
clr r11
clr r12
clr r13
clr r14
clr r15
clr r16
clr r17
clr r18
clr r19
clr xo
clr ox
clr xooo
clr oxoo
clr ooxo
clr ooox
clr r26
clr r27
clr r28
clr r29
clr r30
clr r31
ret
.cseg
fullst:
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
.db 0x08, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08, 0x01, 0x04, 0x02, 0x08
semist:
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
.db 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02, 0x0a, 0x08, 0x09
cls20: .db " @"
doodie: .db " d00dielab ltd @"
presen: .db " presents : @"
stop: .db " StopCutter @"
for: .db " for Idea Print @"
//: .db "@"
fine: .db "fine tune < * > exit@"
loops1: .db " Enter the number --------------------@"
loops2: .db " of spring loops: @"
loops3: .db " 00 > @"
items1: .db " Enter number --------------------@"
items2: .db " of items: @"
items3: .db " 0000 > @"
mode1: .db "mode:@"
mode2: .db "auto < * > manual@"
ss1: .db "Save settings?@"
ss2: .db "No < * > Yes@"
cutoff: .db "cut off=@"
leftto: .db "left to cut=@"
//: .db "@"
//: .db "@"
//: .db "@"
//: .db "@"
//: .db "@"
//: .db "@"
//: .db "@"
//: .db "@"
hello: ldi reglcd,0x80 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (doodie*2) // загружаем адрес выводимой последовательности
ldi zh,high(doodie*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
rcall d1s
ldi reglcd,0xc0 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (presen*2) // загружаем адрес выводимой последовательности
ldi zh,high(presen*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
rcall d1s
ldi reglcd,0x94
rcall tx_dir
ldi zl,low (stop*2) //
ldi zh,high(stop*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
rcall d1s
ldi reglcd,0xd4
rcall tx_dir
ldi zl,low (for*2) //
ldi zh,high(for*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ret
clssl:
rcall d1s
rcall d100m
rcall d100m
rcall clrd4
rcall d100m
rcall d100m
rcall clr94
rcall d100m
rcall d100m
rcall clrc0
rcall d100m
rcall d100m
rcall clr80
ret
clr80: ldi reglcd,0x80
rcall tx_dir
ldi zl,low (cls20*2) //
ldi zh,high(cls20*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
clrc0: ldi reglcd,0xc0
rcall tx_dir
ldi zl,low (cls20*2) //
ldi zh,high(cls20*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
clr94: ldi reglcd,0x94
rcall tx_dir
ldi zl,low (cls20*2) //
ldi zh,high(cls20*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
clrd4: ldi reglcd,0xd4
rcall tx_dir
ldi zl,low (cls20*2) //
ldi zh,high(cls20*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
m_fine: // точный ручной поворот ротора шаговогот\ двигателя
ldi reglcd,0xc0 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (fine*2) // загружаем адрес выводимой последовательности
ldi zh,high(fine*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ldi reglcd,0xca // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
// если нажата кнопка, то один шаг двигателя и пауза.
scanfi: sbis pind,0x02 // нажата ли кнопка?
rjmp noprss // на ветку проверки ротора
rcall d10m // похоже нажата. перепроверим.
sbis pind,0x02 // нажата ли кнопка?
rjmp scanfi //
rcall d100m //
rcall step //
//rcall step //два шага при полушаговом режиме?
rcall d100m //
//rcall d100m //
rjmp scanfi //
noprss: sbis pind,0 //
rjmp scanfi //
// повернуто. курсор офф
rcall d100m
rcall d100m
rcall d100m
ldi reglcd,0xca // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0c // курсор oф
rcall tx_dir
ldi reglcd,0xce // адрес знакоvеста
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
noeexx: rcall d1m
sbis pind,0x02
rjmp scn002
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp exfine
scn002: sbis pind,0
rjmp noeexx
rcall d10m
ldi reglcd,0xce // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0c // курсор oф
rcall tx_dir
ldi reglcd,0xca // адрес знакоvеста
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rcall d100m
rjmp scanfi
exfine: ldi reglcd,0x0c // курсор oф
rcall tx_dir
ldi reglcd,0xc0
rcall tx_dir
ldi zl,low (cls20*2) //
ldi zh,high(cls20*2) //
lpm reglcd,z+ //
cpi reglcd,0x40
breq (pc+3) //
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret
xxzzzz: // ввод к0личества звеньев
ldi reglcd,0x80 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (loops1*2) // загружаем адрес выводимой последовательности
ldi zh,high(loops1*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ldi reglcd,0xc0 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (loops2*2) // загружаем адрес выводимой последовательности
ldi zh,high(loops2*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ldi reglcd,0xd4 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (loops3*2) // загружаем адрес выводимой последовательности
ldi zh,high(loops3*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
zzxxxx: // ввод к0личества пружин
ldi reglcd,0x80 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (items1*2) // загружаем адрес выводимой последовательности
ldi zh,high(items1*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ldi reglcd,0xc0 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (items2*2) // загружаем адрес выводимой последовательности
ldi zh,high(items2*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
nop//----------------------------------------------------------------------
ldi reglcd,0xd4 // устанавливаем позицию вывода.
rcall tx_dir // и шлем его в стекляшку
ldi zl,low (items3*2) // загружаем адрес выводимой последовательности
ldi zh,high(items3*2) // из метки.
lpm reglcd,z+ // берем из .db последовательности байт символа
cpi reglcd,0x40 // проверяем, не собака ли.
breq (pc+3) // если собака, то выход вниз на метку "end?"
rcall txdata // передача в стекляшку символа
rjmp (pc-4) // и так далее.
ret//----------------------------------------------------------------------
xxoooo: nop
nex_00: rcall d100m
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir /////////////////////////////////////////////////////////////
//testxo: sbis pind,0x02 // кнопка нажата?
// rjmp scxo
// rcall d1m
// sbis pind,2
// rjmp scxo
// rjmp nex_01
testxo: sbis pind,0x02 // кнопка нажата?
rjmp scxo
rcall d1m
sbis pind,2
rjmp scxo
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp nex_01
scxo: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp testxo // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp decxo // на декремент
cpi xo,9 // проверка на перелет 9и.
breq endxo
inc xo // ветка инкремента
rjmp endxo
decxo: sbrs flags,0x00
rjmp endxo
cpi xo,0
breq endxo
dec xo
endxo: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
mov reglcd,xo // вывод текущего значения
rcall tx_30
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp testxo
nex_01: rcall d100m
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
testox: sbis pind,0x02 // кнопка нажата?
rjmp scox
rcall d1m
sbis pind,2
rjmp scox
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp nex_03
scox: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp testox // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp decox // на декремент
// ветка инкремента
cpi ox,9 // проверка на перелет 9и.
breq endox
inc ox // был перелет. возвращаем как было.
rjmp endox
decox: sbrs flags,0x00
rjmp endox
cpi ox,0
breq endox
dec ox
endox: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
mov reglcd,ox // вывод текущего значения
rcall tx_30
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp testox
nex_03: rcall d100m
ldi reglcd,0xe0 // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
sc03: sbis pind,0x02
rjmp sc03
rcall d1m
sbis pind,2
rjmp sc03
rcall d100m
ldi reglcd,0x0c // курсор on
rcall tx_dir /////////////////////////////////////////////////////////////
ret
////////////////////////////////////////////////////////////////////////////////////
ooxxxx: nop
n_xooo: rcall d100m
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir /////////////////////////////////////////////////////////////
ttxooo: sbis pind,0x02 // кнопка нажата?
rjmp scxooo
rcall d1m
sbis pind,2
rjmp scxooo
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp n_oxoo
scxooo: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp ttxooo // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp d_xooo // на декремент
// ветка инкремента
cpi xooo,9 // проверка на перелет 9и.
breq e_xooo
inc xooo // был перелет. возвращаем как было.
rjmp e_xooo
d_xooo: sbrs flags,0x00
rjmp e_xooo
cpi xooo,0
breq e_xooo
dec xooo
e_xooo: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
mov reglcd,xooo // вывод текущего значения
rcall tx_30
ldi reglcd,0xdb // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp ttxooo
///////////////////////////
n_oxoo: rcall d100m
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
ttoxoo: sbis pind,0x02 // кнопка нажата?
rjmp scoxoo
rcall d1m
sbis pind,2
rjmp scoxoo
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp n_ooxo
scoxoo: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp ttoxoo // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp d_oxoo // на декремент
// ветка инкремента
cpi oxoo,9 // проверка на перелет 9и.
breq e_oxoo
inc oxoo // был перелет. возвращаем как было.
rjmp e_oxoo
d_oxoo: sbrs flags,0x00
rjmp e_oxoo
cpi oxoo,0
breq e_oxoo
dec oxoo
e_oxoo: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
mov reglcd,oxoo // вывод текущего значения
rcall tx_30
ldi reglcd,0xdc // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp ttoxoo
////////////////////////////////////////////////////////////////////////////////
n_ooxo: rcall d100m
ldi reglcd,0xdd // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir /////////////////////////////////////////////////////////////
ttooxo: sbis pind,0x02 // кнопка нажата?
rjmp scooxo
rcall d1m
sbis pind,2
rjmp scooxo
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp n_ooox
scooxo: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp ttooxo // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp d_ooxo // на декремент
// ветка инкремента
cpi ooxo,9 // проверка на перелет 9и.
breq e_ooxo
inc ooxo // был перелет. возвращаем как было.
rjmp e_ooxo
d_ooxo: sbrs flags,0x00
rjmp e_ooxo
cpi ooxo,0
breq e_ooxo
dec ooxo
e_ooxo: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xdd // адрес знакоместа
rcall tx_dir
mov reglcd,ooxo // вывод текущего значения
rcall tx_30
ldi reglcd,0xdd // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp ttooxo
///////////////////////////
n_ooox: rcall d100m
ldi reglcd,0xde // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
ttooox: sbis pind,0x02 // кнопка нажата?
rjmp scooox
rcall d1m
sbis pind,2
rjmp scooox
rcall d100m
sbic pind,2
rjmp (pc-2)
rjmp n_exit
scooox: rcall enc_lr // проверка был ли поворот
sbrs flags,0x03 //
rjmp ttooox // не было. снова на проверку.
// был поворот
sbrs flags,0x01 // да- увеличить или уменьшить.
rjmp d_ooox // на декремент
// ветка инкремента
cpi ooox,9 // проверка на перелет 9и.
breq e_ooox
inc ooox // был перелет. возвращаем как было.
rjmp e_ooox
d_ooox: sbrs flags,0x00
rjmp e_ooox
cpi ooox,0
breq e_ooox
dec ooox
e_ooox: cbr flags,0b00001011// действие обработано, сброс флагов
ldi reglcd,0xde // адрес знакоместа
rcall tx_dir
mov reglcd,ooox // вывод текущего значения
rcall tx_30
ldi reglcd,0xde // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
rjmp ttooox
////////////////////////////////////////////////////////////////////////////////
n_exit: rcall d100m
ldi reglcd,0xe0 // адрес знакоместа
rcall tx_dir
ldi reglcd,0x0d // курсор on
rcall tx_dir
scxxxx: sbis pind,0x02
rjmp scxxxx
rcall d1m
sbis pind,2
rjmp scxxxx
rcall d100m
ldi reglcd,0x0c // курсор off
rcall tx_dir /////////////////////////////////////////////////////////////
ret
/////////////////////////////////////////////////////////////////////////////////////
; хрень всякая, не особо нужная, валяется ниже этой строки.
//.cseg
//anchor: // OSR1AH-OSR1AL(0x00), OSR1AH-OSR1AL(0x01), OSR1AH-OSR1AL(0x02), OSR1AH-OSR1AL(0x03).............
//.db 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07 ; 00-07
//.db 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x0f ; 08-0f
//.db 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17 ; 10-17
//.db 0x18, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x1b, 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f ; 18-1f
//.db 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27 ; 20-27
//.db 0x28, 0x28, 0x29, 0x29, 0x2a, 0x2a, 0x2b, 0x2b, 0x2c, 0x2c, 0x2d, 0x2d, 0x2e, 0x2e, 0x2f, 0x2f ; 28-2f
//.db 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x37 ; 30-37
//.db 0x38, 0x38, 0x39, 0x39, 0x3a, 0x3a, 0x3b, 0x3b, 0x3c, 0x3c, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f ; 38-3f
//.db 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x44, 0x44, 0x45, 0x45, 0x46, 0x46, 0x47, 0x47 ; 40-47
//.db 0x48, 0x48, 0x49, 0x49, 0x4a, 0x4a, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4e, 0x4e, 0x4f, 0x4f ; 48-4f
//.db 0x50, 0x50, 0x51, 0x51, 0x52, 0x52, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x56, 0x56, 0x57, 0x57 ; 50-57
//.db 0x58, 0x58, 0x59, 0x59, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f ; 58-5f
//.db 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67 ; 60-67
//.db 0x68, 0x68, 0x69, 0x69, 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6f, 0x6f ; 68-6f
//.db 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77 ; 70-77
//.db 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f ; 78-7f
//.db 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87 ; 80-87
//.db 0x88, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8d, 0x8d, 0x8e, 0x8e, 0x8f, 0x8f ; 88-8f
//.db 0x90, 0x90, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x94, 0x94, 0x95, 0x95, 0x96, 0x96, 0x97, 0x97 ; 90-97
//.db 0x98, 0x98, 0x99, 0x99, 0x9a, 0x9a, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, 0x9e, 0x9e, 0x9f, 0x9f ; 98-ff
//.db 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa6, 0xa6, 0xa7, 0xa7 ; a0-a7
//.db 0xa8, 0xa8, 0xa9, 0xa9, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf, 0xaf ; a8-af
//.db 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb7, 0xb7 ; b0-b7
//.db 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbf, 0xbf ; b8-bf
//.db 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc2, 0xc3, 0xc3, 0xc4, 0xc4, 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc7 ; c0-c7
//.db 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xca, 0xcb, 0xcb, 0xcc, 0xcc, 0xcd, 0xcd, 0xce, 0xce, 0xcf, 0xcf ; c7-cf
//.db 0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd5, 0xd6, 0xd6, 0xd7, 0xd7 ; d0-d7
//.db 0xd8, 0xd8, 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, 0xde, 0xde, 0xdf, 0xdf ; d8-df
//.db 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe4, 0xe5, 0xe5, 0xe6, 0xe6, 0xe7, 0xe7 ; e0-e7
//.db 0xe8, 0xe8, 0xe9, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xed, 0xee, 0xee, 0xef, 0xef ; e8-ef
//.db 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7, 0xf7 ; f0-f7
//.db 0xf8, 0xf8, 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xff, 0xff ; f8-ff
//// n o t e s
//nozero: ldi zl,low(de_pos*2) ; загружаем регистр Z адресом метки
// ldi zh,high(de_pos*2) ; загружаем регистр Z адресом метки
// push catcou
// clr r0
// add zl,catcou ; (zl) формируем адрес положительного смещения
// adc zh,r0 ; (zh)
// pop catcou
// lpm catout,z
//dc7: ldi zl,low(decode*2) ; загружаем регистр Z адресом метки
// ldi zh,high(decode*2) ; загружаем регистр Z адресом метки
// clr inttmp
// add zl,anodes ; (zl) формируем адрес положительного смещения
// adc zh,inttmp ; (zh)
// lpm anodes,z // данные, которые будут записаны в порт; загрузка из программной памяти (p.320)в r29
///////////////////////////////////////////////////////////////////
// 6-разрядный десятичный счетчик, результат равен +1 или -1,
// в зависимости от точки входа.
co_inc: sbrc r3,7 // точка входа в процедуру "+1"
rjmp co_d2i
rjmp co_i2i ; counter inc, 1й вход
co_dec: rcall tstnul // точка входа в процедуру "+1"
brne tstneg
sbr r16,0b10000000
mov r3,r16
rjmp co_i2i
tstneg: sbrs r3,7
rjmp co_d2i
rjmp co_i2i
co_i2i: inc ooox ; +1 counter inc, 2й вход
cpi ooox,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr ooox ; ветка "был перенос в старший разряд"
inc ooxo ;
cpi ooxo,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr ooxo ; ветка "был перенос в старший разряд"
inc oxoo
cpi oxoo,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr oxoo ; ветка "был перенос в старший разряд"
inc xooo ;
cpi xooo,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr xooo ; ветка "был перенос в старший разряд"
inc ox
cpi ox,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr ox ; ветка "был перенос в старший разряд"
inc xo ; \--\--\
cpi xo,10 ; = 10?
brne ex_i2i ; на выход если нет переноса
clr xo ; ветка "был перенос в старший разряд"
; тут ветка "число получилось больше чем 999999"
ex_i2i: rcall wr_eep
ret
co_d2i:
cpi ooox,0 ; поднять Z, если 0000 0000
brne exit0 ; перейти, если не 0
ori ooox,9 ; ветка "был "0", занимаем из старшего разряда"
cpi ooxo,0
brne exit1 ; перейти, если не 0000 0000
ori ooxo,9
cpi oxoo,0 ; поднять Z, если 0000 0000
brne exit2 ; перейти, если не 0
ori oxoo,9 ; ветка "был "0", занимаем из старшего разряда"
cpi xooo,0 ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! error
brne exit3 ; перейти, если не 0
ori xooo,9
cpi ox,0 ; поднять Z, если 0000 0000
brne exit4 ; перейти, если не 0000 0000
ori ox,9 ; ветка "был "0", занимаем из старшего разряда"
cpi xo,0 ; поднять Z, если 0000 0000
brne exit5 ; перейти, если не 0000 0000
ori xo,9 ; ветка "был "0", занимаем из старшего разряда"
;************************; тут явно нет корректного окончания.
exit0: dec ooox
rjmp exittt
exit1: dec ooxo
rjmp exittt
exit2: dec oxoo
rjmp exittt
exit3: dec xooo
rjmp exittt
exit4: dec ox
rjmp exittt
exit5: dec xo
rjmp exittt
exittt: rcall tstnul
brne none_0
cbr r16,0b10000000
mov r3,r16
none_0: rcall wr_eep
ret
wr_eep: ret
;---------------------- ?????????????????????????????????????
tstnul: clr r16
or r16,xo
or r16,ox
or r16,xooo
or r16,oxoo
or r16,ooxo
or r16,ooox
cpi r16,0
ret
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;* * * * * * * * * call section * * * * * * * * *
// r16 перетирается
// 17 пока хз зачем
// 18 нельзя перетирать за пределами обработчика, биты 0 и 1 - флаги.
compar: clr r16 ; тестируем биты оптодатчика, и,
sbic pind,0 ; устанавливаем соответствующие битам порта
sbr r16,0b00010000 ; те же биты в регистре
sbic pind,1 ;
sbr r16,0b00100000 ;
;
com r16 ; инверсия данных с порта.
andi r16,0x30 ; сброс ненужниых битов.(исходное - 00??0000) - 2016- сомнительно!!
mov r17,r18 ; в r17 копируем r18.
// далее видимо биты 1 и 0 хранят состояние предыдущей обработки прерывания
andi r17,0x30 ; сброс ненужниых битов. ...0/1/2/30 30 30
cpse r16,r17 ; сравнить предыдущее с текущим., пропустить если равны
rjmp ch_p45 ; если изменился порт, то по метке
ret // не было изменения состояния порта, выход.
ch_p45: mov r17,r18 ; копируем регистр с флагами в r17
lsl r17 ; сдвиг старого значения порта на два бита
lsl r17
andi r17,0xc0 ; сброс лишних бит, в r16 b7 b6 старое значение порта
or r17,r16 ; получилась новая тетрада
andi r18,0x03 ; в r18 затереть всё кроме флагов
or r18,r17 ; r18 загружен, флаги возвращены.
mov r16,r18
lsl r16
lsl r16
or r16,r18
andi r16,0xc0
cpi r16,0xc0
brlo yyeess
ret ; выходы если больше или равно, те. вход или выход из оптопар.
yyeess: sbrc r18,4 ; Rr,b Пропустить если бит в регистре очищен
rcall code1
sbrc r18,5
rcall code2
sbrc r18,6
rcall code4
sbrc r18,7
rcall code8
ret
code1: sbrs r18,0 ; SBRS Rr,b Пропустить если бит в регистре установлен
ret
cbr r18,0b00000001 ; валим флаг
rcall co_dec // вызов декремента десятичных счетчиков
ret
code2: sbrs r18,1 ; SBRS Rr,b Пропустить если бит в регистре установлен
ret
cbr r18,0b00000010 ; валим флаг
rcall co_inc // вызов инкремента десятичных счетчиков
ret
code4: sbr r18,0b00000010
ret
code8: sbr r18,0b00000001
ret
Tags: