Вс мар 18, 2018 17:06:35
Вс мар 18, 2018 17:24:27
Вс мар 18, 2018 17:39:33
Вс мар 18, 2018 17:45:29
Вс мар 18, 2018 18:44:58
Пн мар 19, 2018 09:14:14
Пн мар 19, 2018 09:53:38
Пн мар 19, 2018 13:38:42
Пн мар 19, 2018 14:15:24
Пн мар 19, 2018 17:18:32
Пн мар 19, 2018 18:36:26
Пн мар 19, 2018 22:22:37
Вт мар 20, 2018 09:41:56
Вт мар 20, 2018 15:14:06
Вт мар 20, 2018 19:17:42
AVRASM ver. 2.1.42 D:\AVR_projekt\tiny13prj\tn13.asm Tue Mar 20 20:14:39 2018
D:\AVR_projekt\tiny13prj\tn13.asm(69): Including file 'C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc'
D:\AVR_projekt\tiny13prj\tn13.asm(72): Including file 'D:\AVR_projekt\tiny13prj\librus\map_def_t13.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(73): Including file 'D:\AVR_projekt\tiny13prj\librus\mac_t13.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(90): Including file 'D:\AVR_projekt\tiny13prj\librus\hs_init.txt'
D:\AVR_projekt\tiny13prj\tn13.asm(91): Including file 'D:\AVR_projekt\tiny13prj\librus\sekmetr.txt'
; hider file for ATtiny13 chip
; version 1.02 KOBRA softvare
; for version2 assembler!
;----------
;
; Projekt _______
; Filename ______
; File version __
; Autor _________
;
;----------
; основная конфигурация:
;
; CKDIV8=0 (по умолчанию внутр. rc-генератор 9,6 МГц
; clkps 3-0 = 0011 /коэффициент деления=8/ )
; изменение значения в слове конфигурации
; затрудняет дальнейшее репрограммирование ИС
; предпочтительно изменение коэффициента в clkps 3-0 программой пользователя!!!
; SUT1:SUT0=10(умолч.max) определяет длительность задержки сброса
; режим работы тактового генератора :
; CKSEL1:CKSEL0=10 (умолч.) внутр.r-c генератор 9,6МГц
; 01 внутр. r-c генератор 4,8МГц
;
; ВНИМАНИЕ!!!
; В области сигнатуры ATtiny13A размещаются два байта
; калибровочных констант для внутреннего RC генератора.
; Старший байт по адресу 0х00 содержит калибровочную константу
; для работы генератора на частоте 9.6 MHz. Данная константа
; будет автоматически загружена в OSCCAL по окончании сигнала сброса.
; Автоматическая загрузка калибровочной константы
; для работы генератора на частоте 4.8 MHz НЕ ВЫПОЛНЯЕТСЯ!
; Чтение, хранение и загрузка калибровочной константы
; для работы внутреннего RC генератора на частоте 4.8 MHz
; должны выполняться прикладной программой.
; Калибровочная константа для работы генератора на частоте 4,8 MHz
; размещена в старшем байте поадресу 0х01 в области сигнатур.
;
; DWEN=1 отладка gebugWire запрещена (0-разрешена)
; EESAVE=1 общее сирание и EEPROM - 1 стирает, 0 не стирает
; SPIEN=0 последовательное программирование разрешено (1-запрещено)
; WDTON=1 WDT может быть выключен программно (0-всегда включен)
; SELFPRGEN=1 самопрограммирование (команда SPM) запрещено (0-разрешено)
; BODLEVEL1:BODLEVEL0=11 (выключена)
; порог срабатывания схемы BOR (обязательно восстановить то, что было до программирования,
;если не предусмотренно иное значение согласно прикладной программы)
; RSTDISBL=1 вывод RST как вход сброса (0- только при наличии "высоковольтного программатора!!!)
;
;конфигурационные ячейки могут быть записаны только при помощи
;программатора,а прочитаны как программатором,так и командой LPM.
;общее стирание ИС на содержимое конфигурационных ячеек не влияет
;_____
;
; выбрана текущая конфигурация проэкта:
;
; CKDIV8=0 (по умолчанию внутр. rc-генератор 9,6 МГц
; clkps 3-0 = 0011 /коэффициент деления=8/ )
; SUT1:SUT0=10 (умолч.max) определяет длительность задержки сброса
; CKSEL1:CKSEL0=10 (умолч.) внутр.r-c генератор 9,6МГц
; DWEN=1 отладка gebugWire запрещена
; EESAVE=1 общее сирание и EEPROM - 1 стирает
; SPIEN=0 последовательное программирование разрешено
; WDTON=1 WDT может быть выключен программно
; SELFPRGEN=1 самопрограммирование (команда SPM) запрещено
; BODLEVEL1:BODLEVEL0=11 (выключена)
; RSTDISBL=1 вывод RST как вход сброса (0- только при наличии "высоковольтного программатора!!!)
;----------
.list
; ----------
.include "librus\map_def_t13.txt" ; файл объявленных имен, бит и констант
; "map_def_t13.txt" файл объявленных имен, бит и констант (шаблон)
;
;----------
; variable definitions
;(таблица обьявленных имен)
;_____
;таблица обьявленных имен - пользовательские константы
;
; .equ name/label = const / expr
; define datas
.equ port_out = PORTB ; порт вывода (по усмотрению)
.equ DATO_ln = 0 ; линия вывода данных прямой уровень
.equ CLC_ln = 1 ; линия строб-импульса активный уровень 1
.equ WR_ln = 2 ; линия строба записи активный уровень 1
.equ sg_A = 0 ; позиционный номер сегмента sg_A
.equ sg_B = 1 ; позиционный номер сегмента sg_B
.equ sg_C = 2 ; позиционный номер сегмента sg_C
.equ sg_D = 3 ; позиционный номер сегмента sg_D
.equ sg_E = 4 ; позиционный номер сегмента sg_E
.equ sg_F = 5 ; позиционный номер сегмента sg_F
.equ sg_G = 6 ; позиционный номер сегмента sg_G
.equ sg_H = 7 ; позиционный номер сегмента sg_H (запятая)
.equ DISP0 = 0 ; позиционный номер дисплейной матрицы единиц секунд
.equ DISP1 = 1 ; позиционный номер дисплейной матрицы десятков секунд
.equ DISP2 = 2 ; позиционный номер дисплейной матрицы единиц минут (сотен)
.equ DISP3 = 3 ; позиционный номер дисплейной матрицы десятков минут (тысяч)
.equ over60 = 60 ; константа переполнения "более 59" единиц
.equ div150 = 150 ; константа для OCR0A
.equ tik_tak = 1<<CS01 ; константа пуска Т0
; системная частота *8
.equ cnts_l = 200 ; константа младшего счетчика досчета секундомера
.equ cnts_h = 5 ; константа старшего счетчика досчета секундомера
;_____
;таблица обьявленных имен - переназначение регистров РОН
;
; регистры R26-R31 заранее объявлены как X,Y и Z
; R31:R30=ZH:ZL (Z)
; R29:R28=YH:YL (Y)
; R27:R26=XH:XL (X) ;
;
.def Bh = r25 ; регистр (полный)
.def Bl = r24 ; регистр (полный)
.def flags = r23 ; регистр (полный (tmp7)) systems flags
.def tmp6 = r22 ; регистр (полный)
.def tmp5 = r21 ; регистр (полный)
.def tmp4 = r20 ; регистр (полный)
.def tmp3 = r19 ; регистр (полный)
.def tmp2 = r18 ; регистр (полный)
.def tmp1 = r17 ; регистр (полный)
.def tmp0 = r16 ; регистр (полный)
.def shr_sreg = r15 ; регистр (урезан) РВХ SREG
.def tic_cnth = r14 ; регистр (урезан (regn)) старший счетчик досчета секундомера
.def tic_cntl = r11 ; регистр (урезан (regn)) младший счетчик досчета секундомера
; .def regn = r10 ; регистр (урезан)
; .def regn = r9 ; регистр (урезан)
; .def regn = r8 ; регистр (урезан)
; .def regn = r7 ; регистр (урезан) dark_zh
; .def regn = r6 ; регистр (урезан) dark_zl
; .def regn = r5 ; регистр (урезан) dark_yh
; .def regn = r4 ; регистр (урезан) dark_yl
; .def regn = r3 ; регистр (урезан) dark_xh
; .def regn = r2 ; регистр (урезан) dark_xl
; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
;_____
;таблица обьявленных имен - секция флагов пользователя
;
; .equ name/label = expr
;
; флаги в регистре flags
.equ tim_tik = 0 ; передаточный флаг генератора тайм-сетки
.equ en_sek = 1 ; флаг "счет секундомера разрешен"
.equ min_plus = 2 ; флаг "требуется приращение счетчика минут"
;_____
;таблица обьявленных имен - секция определенных данных (ОЗУ)
;
.dseg
.org SRAM_START
;
; label: .byte expr
000060 sekond: .byte 1 ; счетчик секунд
000061 minut: .byte 1 ; счетчик минут
000062 vram: .byte 4 ; буфер вывода (сегментный код)
;_____
;таблица обьявленных имен - секция определенных данных (EEPROM)
;
.eseg
; label: .byte expr
.include "librus\mac_t13.txt" ; файл описания макросов
; "mac_t13.txt" ; файл описания макросов (шаблон)
;
.macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром"
eor @0,@1 ; вызывается как xchrr rd,rs
eor @1,@0
eor @0,@1
.endmacro
;
.macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/"
ldi @0l,low(@1) ; вызывается как ldwi rp,0xnnnn или ldiw rp,name (где name=0xnnnn, rp=x,y,z)
ldi @0h,high(@1)
.endmacro
;
.macro strob ; строб-импульс поддержки данных загрузчика 595
sbi PORTB,CLC_ln
nop
cbi PORTB,CLC_ln
nop
.endmacro
;
.macro trsbt ; пересылка бита
sbrs tmp0,@0 ; вызывается как trsbt number где number = номер перемещаемого бита
cbi PORTB,DATO_ln
sbrc tmp0,@0
sbi PORTB,DATO_ln
nop
.endmacro
; вместо name project подставляется имя файла соответствующего проекта
; шаблоны имеют name project = proto
;_____
.listmac ; раскрытие макросов в листинге (только функционал отладки)
;
.cseg
.org 0x000
irq_res:
000000 c009 rjmp init ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
.org OC0Aaddr
irq_t0:
000006 c027 rjmp tiks ; переход на обработчик прерывания tiks
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
;_____
.include "librus\hs_init.txt" ; файл начальной инициализации МК и софта
; файл начальной инициализации железа и софта
; "hs_init_1.txt"
.org (irq_res+int_vectors_size) ; обход блока векторов прерываний
init: ;блок начальной инициализации кристалла
;Собственно начало проекта надо делать с конфигурации ядра МК.
;Описываем просто словами чего хотим.
;----------
;Конфигурация ядра:
;Генератор - встроенный RC-генератор 9,6 МГц
;сброс определяем как power-on-reset
;Clkpr - Системный предделитель - <по умолчанию> (/8) не трогаем
;Osccal - не трогаем - для 9,6 МГц будет загружен автоматически
;Система BOD определена фузее-битами
;WDT отключен с возможностью программного включения
; - определяется выбранным набором фузее бит
;----------
;АЦП отключен по умолчанию
;Didr0 = 0 по умолчанию
;Указатель стека автоматически загружается адресом конца ОЗУ
;----------
;отключить аналоговый компаратор
00000a 9a47 sbi ACSR,ACD
;Режимы порта вывода настраиваем соответственно задаче.
00000b ef08 ldi tmp0,~(1<<DATO_ln | 1<<CLC_ln | 1<<WR_ln)
00000c bb08 out PORTB,tmp0 ; защелки выходных сигналов приводим к 0
00000d 9500 com tmp0
00000e bb07 out DDRB,tmp0 ; выводы настраиваем как выходы
; с исходным уровнем =0
; поскольку по умолчанию MCUCR.PUD=0 то для остальных выводов
; сконфигурированных как входы с содержимым защелок =1
; будет реализована "подтяжка к 1"
; настраиваем режим СТС таймера Т0
; генерация прерывания по OCF0A каждые 0,001S
00000f e906 ldi tmp0,div150
000010 bf06 out OCR0A,tmp0 ; загрузка константы досчета
000011 2700 clr tmp0
000012 bf02 out TCNT0,tmp0
000013 bf03 out TCCR0B,tmp0
000014 e002 ldi tmp0,1<<WGM01
000015 bd0f out TCCR0A,tmp0 ; константы загружены, режим СТС установлен
; таймер в отстанове/ожидании
; Конфигурируем прерывания
000016 e004 ldi tmp0,1<<OCIE0A
000017 bf09 out TIMSK0,tmp0
; остается только разрешить прерывания
; sei
; и запустить таймер
; ldi tmp0,tik_tak
; out TCCR0B,tmp0
;----------
;
; загружаем начальные параметры для работы секундомера
; "soft init"
sf_init:
000018 ec08 ldi tmp0,cnts_l ; cnts_l=200
000019 2eb0 mov tic_cntl,tmp0 ; загрузка младшего счетчика досчета
00001a e005 ldi tmp0,cnts_h ; cnts_h=5
00001b 2ee0 mov tic_cnth,tmp0 ; загрузка старшего счетчика досчета
+
00001c e6a0 +ldi xl , low ( sekond )
00001d e0b0 +ldi xh , high ( sekond )
ldiw x,sekond
00001e 2700 clr tmp0
00001f 930d st x+,tmp0
000020 930d st x+,tmp0
000021 930d st x+,tmp0
000022 930d st x+,tmp0
000023 930d st x+,tmp0
000024 930d st x+,tmp0 ; очистка ОЗУ
000025 d055 rcall print ; очистка/гашение дисплея
000026 6072 sbr flags,1<<en_sek ; разрешаем счет en_sek=1
000027 9478 sei ; прерывания разрешены
000028 e002 ldi tmp0,tik_tak
000029 bf03 out TCCR0B,tmp0 ;таймер активирован
wt_stop:
00002a ff70 sbrs flags,tim_tik
00002b cffe rjmp wt_stop
00002c d003 rcall sekmetr ; при tim_tik=1 отработать приращение секундомера
00002d cffc rjmp wt_stop
;
;----------
; собственно заглушка обработчика прерывания
tiks:
00002e 6071 sbr flags,1<<tim_tik ; установка передаточного флага tim_tik=1
00002f 9518 reti
.include "librus\sekmetr.txt" ; секундомер
; файл подпрограммы секундомера
; "sekmetr.txt"
;
; вход по rcall sekmetr
;
sekmetr:
000030 7f7e cbr flags,1<<tim_tik ; сброс передаточного флага тайм-сетки
000031 ff71 sbrs flags,en_sek ; исполнение только при en_sek=1
000032 9508 ret ; выход при запрете счета - en_sek=0
000033 94ba dec tic_cntl ; tic_cntl=tic_cntl-1
000034 f009 brbs SREG_Z,loop_cntsh
000035 9508 ret ; выход, если нет переопустошения tic_cntl
loop_cntsh:
000036 ec08 ldi tmp0,cnts_l ; cnts_l=200
000037 2eb0 mov tic_cntl,tmp0 ; перезагрузка младшего счетчика досчета
000038 94ea dec tic_cnth ; tic_cnth=tic_cnth-1
000039 f009 brbs SREG_Z,loop_cntss
00003a 9508 ret ; выход, если нет переопустошения tic_cnth
loop_cntss:
00003b e005 ldi tmp0,cnts_h ; cnts_h=5
00003c 2ee0 mov tic_cnth,tmp0 ; перезагрузка старшего счетчика досчета
sek_plus:
00003d 9100 0060 lds tmp0,sekond ; читаем секундомер
00003f 9503 inc tmp0 ; tmp0=tmp0+1
000040 330c cpi tmp0,over60 ; неразрушающее сравнение с константой
000041 f010 brbs SREG_C,point11 ; при С =1 счетчик менее 60 - идем к point11
; при С =0 имеем переполнение: tmp0=>60
000042 2700 clr tmp0 ; сбросить темп0
000043 6074 sbr flags,1<<min_plus ; установить флаг приращения минут и идем к point11
point11:
000044 9300 0060 sts sekond,tmp0 ; возвращаем значение в секундомер
+
000046 e6a2 +ldi xl , low ( vram )
000047 e0b0 +ldi xh , high ( vram )
ldiw x,vram ; загрузка начала видеоОЗУ в указатель Xh:Xl
000048 d00e rcall decod ; отрабатываем перекодировку в разрядах секунд
000049 ff72 sbrs flags,min_plus ; если приращения для счетчика
00004a c00a rjmp point12 ; минут небыло продолжаем от point12
00004b 7f7b cbr flags,1<<min_plus ; min_plus=0
minuta:
00004c 9100 0061 lds tmp0,minut ; читаем счетчик минут
00004e 9503 inc tmp0 ; tmp0=tmp0+1
00004f 330c cpi tmp0,over60 ; неразрушающее сравнение с константой
000050 f008 brbs SREG_C,point14 ; при С =1 счетчик менее 60 - идем к point14
; при С =0 имеем переполнение: tmp0=>60
000051 2700 clr tmp0 ; и перенос в счетчик часов при наличии
point14:
000052 9300 0061 sts minut,tmp0 ; возвращаем значение в счетчик минут
; текущее значение в X соответствует vram+3
000054 d002 rcall decod ; отрабатываем перекодировку в разрядах минут
point12:
000055 d025 rcall print ; выполнить загрузчик регистрового файла
000056 9508 ret
;
;
;
;
;----------
; преобразование двоичного кода счетчика секунд/минут
; из байта в два байта сегментного кода, соответствующих десяткам и единицам
; его десятичного эквивалента
;
decod:
000057 2711 clr tmp1 ; очистка накопителя десятков
000058 2722 clr tmp2 ; создаем константу 0 для ADC
loop1:
000059 9513 inc tmp1 ; десятки +1
00005a 500a subi tmp0,10 ; подсчет десятков в tmp1
00005b f7e8 brcc loop1 ; jnc loop1 повторяем до переопустошения
00005c 951a dec tmp1 ; накопитель десятков -1
00005d 5f06 subi tmp0,-10 ; adi 10 восстановим единицы (они остались в tmp0)
00005e d003 rcall tbdt ; сегментный код по табличному декодеру со смещением из tmp0
00005f 2f01 mov tmp0,tmp1 ; повторяем для значения десятков
000060 d001 rcall tbdt
000061 9508 ret
tbdt:
+
000062 e6eb +ldi zl , low ( ss_table )
000063 e0f0 +ldi zh , high ( ss_table )
ldiw z,ss_table ; загрузка адреса начала таблицы декодера в указатель Zh:Zl
000064 0fe0 add zl,tmp0 ; получаем адрес сегментного кода
000065 1ff2 adc zh,tmp2
000066 0fee lsl zl
000067 1fff rol zh ; Z=Z*2
000068 9104 lpm tmp0,z ; читаем сегментный код
000069 930d st x+,tmp0 ; и грузим его в видео ОЗУ
00006a 9508 ret
;
;----------
; табличный перекодировщик тетрады 0N в соответствующий значению N сегментный код
;
ss_table:
00006b 003f .dw (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*0*/\
00006c 0006
00006d 005b (1<<sg_B | 1<<sg_C),/*1*/ (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_D | 1<<sg_E),/*2*/\
00006e 004f (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*3*/\
00006f 0066 (1<<sg_B | 1<<sg_C | 1<<sg_G | 1<<sg_F),/*4*/\
000070 006d (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*5*/\
000071 007d (1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D | 1<<sg_E),/*6*/\
000072 0007 (1<<sg_A | 1<<sg_B | 1<<sg_C),/*7*/\
000073 007f (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*8*/\
000074 006f (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_F | 1<<sg_G),/*9*/\
000075 0077 (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*A*/\
000076 007c (1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*b*/\
000077 0039 (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*C*/\
000078 005e (1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_G),/*d*/\
000079 0079 (1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*E*/\
00007a 0071 (1<<sg_A | 1<<sg_E | 1<<sg_F | 1<<sg_G)/*F*/
;
;
;----------
;
; загрузчик регистрового файла 4*595
; передача старшими битами вперед
; передается массив из четырех байт ОЗУ vram
; первым идет крайнее правое знакоместо
;
print:
+
00007b e6a2 +ldi xl , low ( vram )
00007c e0b0 +ldi xh , high ( vram )
ldiw x,vram ; загрузка начала видеоОЗУ в указатель Xh:Xl
00007d 910d ld tmp0,x+
00007e d00c rcall trs_595 ; DISP0 загружен
00007f 910d ld tmp0,x+
000080 d00a rcall trs_595 ; DISP1 загружен
000081 910d ld tmp0,x+
000082 d008 rcall trs_595 ; DISP2 загружен
000083 910d ld tmp0,x+
000084 d006 rcall trs_595 ; DISP3 загружен
000085 9ac2 sbi PORTB,WR_ln
000086 0000 nop
000087 0000 nop
000088 98c2 cbi PORTB,WR_ln
000089 0000 nop
00008a 9508 ret
;----------
; собственно пересылка байта из tmp0 в
; регистровый файл
; для уменьшения ошибок при вводе текста применены макросы
;
trs_595:
+
00008b ff07 +sbrs tmp0 , 7
00008c 98c0 +cbi PORTB , DATO_ln
00008d fd07 +sbrc tmp0 , 7
00008e 9ac0 +sbi PORTB , DATO_ln
00008f 0000 +nop
trsbt 7
+
000090 9ac1 +sbi PORTB , CLC_ln
000091 0000 +nop
000092 98c1 +cbi PORTB , CLC_ln
000093 0000 +nop
strob
+
000094 ff06 +sbrs tmp0 , 6
000095 98c0 +cbi PORTB , DATO_ln
000096 fd06 +sbrc tmp0 , 6
000097 9ac0 +sbi PORTB , DATO_ln
000098 0000 +nop
trsbt 6
+
000099 9ac1 +sbi PORTB , CLC_ln
00009a 0000 +nop
00009b 98c1 +cbi PORTB , CLC_ln
00009c 0000 +nop
strob
+
00009d ff05 +sbrs tmp0 , 5
00009e 98c0 +cbi PORTB , DATO_ln
00009f fd05 +sbrc tmp0 , 5
0000a0 9ac0 +sbi PORTB , DATO_ln
0000a1 0000 +nop
trsbt 5
+
0000a2 9ac1 +sbi PORTB , CLC_ln
0000a3 0000 +nop
0000a4 98c1 +cbi PORTB , CLC_ln
0000a5 0000 +nop
strob
+
0000a6 ff04 +sbrs tmp0 , 4
0000a7 98c0 +cbi PORTB , DATO_ln
0000a8 fd04 +sbrc tmp0 , 4
0000a9 9ac0 +sbi PORTB , DATO_ln
0000aa 0000 +nop
trsbt 4
+
0000ab 9ac1 +sbi PORTB , CLC_ln
0000ac 0000 +nop
0000ad 98c1 +cbi PORTB , CLC_ln
0000ae 0000 +nop
strob
+
0000af ff03 +sbrs tmp0 , 3
0000b0 98c0 +cbi PORTB , DATO_ln
0000b1 fd03 +sbrc tmp0 , 3
0000b2 9ac0 +sbi PORTB , DATO_ln
0000b3 0000 +nop
trsbt 3
+
0000b4 9ac1 +sbi PORTB , CLC_ln
0000b5 0000 +nop
0000b6 98c1 +cbi PORTB , CLC_ln
0000b7 0000 +nop
strob
+
0000b8 ff02 +sbrs tmp0 , 2
0000b9 98c0 +cbi PORTB , DATO_ln
0000ba fd02 +sbrc tmp0 , 2
0000bb 9ac0 +sbi PORTB , DATO_ln
0000bc 0000 +nop
trsbt 2
+
0000bd 9ac1 +sbi PORTB , CLC_ln
0000be 0000 +nop
0000bf 98c1 +cbi PORTB , CLC_ln
0000c0 0000 +nop
strob
+
0000c1 ff01 +sbrs tmp0 , 1
0000c2 98c0 +cbi PORTB , DATO_ln
0000c3 fd01 +sbrc tmp0 , 1
0000c4 9ac0 +sbi PORTB , DATO_ln
0000c5 0000 +nop
trsbt 1
+
0000c6 9ac1 +sbi PORTB , CLC_ln
0000c7 0000 +nop
0000c8 98c1 +cbi PORTB , CLC_ln
0000c9 0000 +nop
strob
+
0000ca ff00 +sbrs tmp0 , 0
0000cb 98c0 +cbi PORTB , DATO_ln
0000cc fd00 +sbrc tmp0 , 0
0000cd 9ac0 +sbi PORTB , DATO_ln
0000ce 0000 +nop
trsbt 0
+
0000cf 9ac1 +sbi PORTB , CLC_ln
0000d0 0000 +nop
0000d1 98c1 +cbi PORTB , CLC_ln
0000d2 0000 +nop
strob
0000d3 98c0 cbi PORTB,DATO_ln
0000d4 9508 ret
RESOURCE USE INFORMATION
----------
Notice:
The register and instruction counts are symbol table hit counts,
and hence implicitly used resources are not counted, eg, the
'lpm' instruction without operands implicitly uses r0 and z,
none of which are counted.
x,y,z are separate entities in the symbol table and are
counted separately from r26..r31 here.
.dseg memory usage only counts static data declared with .byte
ATtiny13A register use summary:
r0 : 0 r1 : 0 r2 : 0 r3 : 0 r4 : 0 r5 : 0 r6 : 0 r7 : 0
r8 : 0 r9 : 0 r10: 0 r11: 3 r12: 0 r13: 0 r14: 3 r15: 0
r16: 66 r17: 4 r18: 2 r19: 0 r20: 0 r21: 0 r22: 0 r23: 8
r24: 0 r25: 0 r26: 3 r27: 3 r28: 0 r29: 0 r30: 3 r31: 3
x : 11 y : 0 z : 1
Registers used: 12 out of 35 (34.3%)
ATtiny13A instruction use summary:
.lds : 0 .sts : 0 adc : 1 add : 1 adiw : 0 and : 0
andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 4
brcc : 1 brcs : 0 break : 0 breq : 0 brge : 0 brhc : 0
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
brne : 0 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 18 cbr : 2 clc : 0
clh : 0 cli : 0 cln : 0 clr : 6 cls : 0 clt : 0
clv : 0 clz : 0 com : 1 cp : 0 cpc : 0 cpi : 2
cpse : 0 dec : 3 eor : 0 icall : 0 ijmp : 0 in : 0
inc : 3 ld : 4 ldd : 0 ldi : 17 lds : 2 lpm : 2
lsl : 1 lsr : 0 mov : 5 movw : 0 neg : 0 nop : 27
or : 0 ori : 0 out : 8 pop : 0 push : 0 rcall : 11
ret : 8 reti : 1 rjmp : 5 rol : 1 ror : 0 sbc : 0
sbci : 0 sbi : 18 sbic : 0 sbis : 0 sbiw : 0 sbr : 3
sbrc : 8 sbrs : 11 sec : 0 seh : 0 sei : 1 sen : 0
ser : 0 ses : 0 set : 0 sev : 0 sez : 0 sleep : 0
spm : 0 st : 7 std : 0 sts : 2 sub : 0 subi : 2
swap : 0 tst : 0 wdr : 0
Instructions used: 32 out of 105 (30.5%)
ATtiny13A memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
----------
[.cseg] 0x000000 0x0001aa 378 32 410 1024 40.0%
[.dseg] 0x000060 0x000066 0 6 6 64 9.4%
[.eseg] 0x000000 0x000000 0 0 0 64 0.0%
Assembly complete, 0 errors, 0 warnings
Ср мар 21, 2018 07:30:19
A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock cycle.
Ср мар 21, 2018 10:16:00
Ср мар 21, 2018 12:49:30
Если правильно установить таймер, подгонять и обрабатывать не нужно.BOB51 писал(а):Так о точности в суперварианте речь ПОКА не идет - там и подгонку надо делать, и отработку реакции на прерывание учитывать.
Ср мар 21, 2018 13:13:28
tbdt:
ldiw z,(ss_table*2) ; загрузка адреса начала таблицы декодера в указатель Zh:Zl
add zl,tmp0 ; получаем адрес сегментного кода
adc zh,tmp2
; lsl zl
; rol zh ; Z=Z*2
lpm tmp0,z ; читаем сегментный код
st x+,tmp0 ; и грузим его в видео ОЗУ
ret
;
;----------
; табличный перекодировщик тетрады 0N в соответствующий значению N сегментный код
;
ss_table:
.db (1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*0*/\
(1<<sg_B | 1<<sg_C),/*1*/ (1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_D | 1<<sg_E),/*2*/\
(1<<sg_A | 1<<sg_B | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*3*/\
(1<<sg_B | 1<<sg_C | 1<<sg_G | 1<<sg_F),/*4*/\
(1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D),/*5*/\
(1<<sg_A | 1<<sg_F | 1<<sg_G | 1<<sg_C | 1<<sg_D | 1<<sg_E),/*6*/\
(1<<sg_A | 1<<sg_B | 1<<sg_C),/*7*/\
(1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*8*/\
(1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_F | 1<<sg_G),/*9*/\
(1<<sg_A | 1<<sg_B | 1<<sg_C | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*A*/\
(1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*b*/\
(1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F),/*C*/\
(1<<sg_B | 1<<sg_C | 1<<sg_D | 1<<sg_E | 1<<sg_G),/*d*/\
(1<<sg_A | 1<<sg_D | 1<<sg_E | 1<<sg_F | 1<<sg_G),/*E*/\
(1<<sg_A | 1<<sg_E | 1<<sg_F | 1<<sg_G)/*F*/
39 ldi tmp0,div150
29 .equ div150 = 150-2 ; константа для OCR0A
.macro trsbt ; пересылка бита
sbrs tmp0,@0 ; вызывается как trsbt number где number = номер перемещаемого бита
cbi PORTB,DATO_ln
sbrc tmp0,@0
sbi PORTB,DATO_ln
nop
.endmacro
Вс мар 25, 2018 10:30:47