Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
AVRASM ver. 2.1.9 D:\1\q.asm Sat Mar 31 12:02:01 2007D:\1\q.asm(5): Including file 'C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\1200def.inc'
.include "1200def.inc"
;***** Created: 2006-10-03 09:16 ******* Source: AT90S1200.xml ***********
;*************************************************************************
;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y
;*
;* Number : AVR000
;* File Name : "1200def.inc"
;* Title : Register/Bit Definitions for the AT90S1200
;* Date : 2006-10-03
;* Version : 2.24
;* Support E-mail : avr@atmel.com
;* Target MCU : AT90S1200
;*
;* DESCRIPTION
;* When including this file in the assembly program file, all I/O register
;* names and I/O register bit names appearing in the data book can be used.
;* In addition, the six registers forming the three data pointers X, Y and
;* Z have been assigned names XL - ZH. Highest RAM address for Internal
;* SRAM is also defined
;*
;* The Register names are represented by their hexadecimal address.
;*
;* The Register Bit names are represented by their bit number (0-7).
;*
;* Please observe the difference in using the bit names with instructions
;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc"
;* (skip if bit in register set/cleared). The following example illustrates
;* this:
;*
;* in r16,PORTB ;read PORTB latch
;* sbr r16,(1<;* out PORTB,r16 ;output to PORTB
;*
;* in r16,TIFR ;read the Timer Interrupt Flag Register
;* sbrc r16,TOV0 ;test the overflow flag (use bit#)
;* rjmp TOV0_is_set ;jump if set
;* ... ;otherwise do something else
;*************************************************************************
#ifndef _1200DEF_INC_
#define _1200DEF_INC_
#pragma partinc 0
; ***** SPECIFY DEVICE ***************************************************
.device AT90S1200
#pragma AVRPART ADMIN PART_NAME AT90S1200
.equ SIGNATURE_000 = 0x1e
.equ SIGNATURE_001 = 0x90
.equ SIGNATURE_002 = 0x01
#pragma AVRPART CORE CORE_VERSION V0
; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ SREG = 0x3f
.equ GIMSK = 0x3b
.equ TIMSK = 0x39
.equ TIFR = 0x38
.equ MCUCR = 0x35
.equ TCCR0 = 0x33
.equ TCNT0 = 0x32
.equ WDTCR = 0x21
.equ EEAR = 0x1e
.equ EEDR = 0x1d
.equ EECR = 0x1c
.equ PORTB = 0x18
.equ DDRB = 0x17
.equ PINB = 0x16
.equ PORTD = 0x12
.equ DDRD = 0x11
.equ PIND = 0x10
.equ ACSR = 0x08
; ***** BIT DEFINITIONS **************************************************
; ***** TIMER_COUNTER_0 **************
; TIMSK - Timer/Counter Interrupt Mask Register
.equ TOIE0 = 1 ; Timer/Counter0 Overflow Interrupt Enable
; TIFR - Timer/Counter Interrupt Flag register
.equ TOV0 = 1 ; Timer/Counter0 Overflow Flag
; TCCR0 - Timer/Counter0 Control Register
.equ CS00 = 0 ; Clock Select0 bit 0
.equ CS01 = 1 ; Clock Select0 bit 1
.equ CS02 = 2 ; Clock Select0 bit 2
; TCNT0 - Timer Counter 0
.equ TCNT00 = 0 ; Timer Counter 0 bit 0
.equ TCNT01 = 1 ; Timer Counter 0 bit 1
.equ TCNT02 = 2 ; Timer Counter 0 bit 2
.equ TCNT03 = 3 ; Timer Counter 0 bit 3
.equ TCNT04 = 4 ; Timer Counter 0 bit 4
.equ TCNT05 = 5 ; Timer Counter 0 bit 5
.equ TCNT06 = 6 ; Timer Counter 0 bit 6
.equ TCNT07 = 7 ; Timer Counter 0 bit 7
; ***** WATCHDOG *********************
; WDTCR - Watchdog Timer Control Register
.equ WDP0 = 0 ; Watch Dog Timer Prescaler bit 0
.equ WDP1 = 1 ; Watch Dog Timer Prescaler bit 1
.equ WDP2 = 2 ; Watch Dog Timer Prescaler bit 2
.equ WDE = 3 ; Watch Dog Enable
; ***** PORTB ************************
; PORTB - Port B Data Register
.equ PORTB0 = 0 ; Port B Data Register bit 0
.equ PB0 = 0 ; For compatibility
.equ PORTB1 = 1 ; Port B Data Register bit 1
.equ PB1 = 1 ; For compatibility
.equ PORTB2 = 2 ; Port B Data Register bit 2
.equ PB2 = 2 ; For compatibility
.equ PORTB3 = 3 ; Port B Data Register bit 3
.equ PB3 = 3 ; For compatibility
.equ PORTB4 = 4 ; Port B Data Register bit 4
.equ PB4 = 4 ; For compatibility
.equ PORTB5 = 5 ; Port B Data Register bit 5
.equ PB5 = 5 ; For compatibility
.equ PORTB6 = 6 ; Port B Data Register bit 6
.equ PB6 = 6 ; For compatibility
.equ PORTB7 = 7 ; Port B Data Register bit 7
.equ PB7 = 7 ; For compatibility
; DDRB - Port B Data Direction Register
.equ DDB0 = 0 ; Port B Data Direction Register bit 0
.equ DDB1 = 1 ; Port B Data Direction Register bit 1
.equ DDB2 = 2 ; Port B Data Direction Register bit 2
.equ DDB3 = 3 ; Port B Data Direction Register bit 3
.equ DDB4 = 4 ; Port B Data Direction Register bit 4
.equ DDB5 = 5 ; Port B Data Direction Register bit 5
.equ DDB6 = 6 ; Port B Data Direction Register bit 6
.equ DDB7 = 7 ; Port B Data Direction Register bit 7
; PINB - Port B Input Pins
.equ PINB0 = 0 ; Port B Input Pins bit 0
.equ PINB1 = 1 ; Port B Input Pins bit 1
.equ PINB2 = 2 ; Port B Input Pins bit 2
.equ PINB3 = 3 ; Port B Input Pins bit 3
.equ PINB4 = 4 ; Port B Input Pins bit 4
.equ PINB5 = 5 ; Port B Input Pins bit 5
.equ PINB6 = 6 ; Port B Input Pins bit 6
.equ PINB7 = 7 ; Port B Input Pins bit 7
; ***** PORTD ************************
; PORTD - Data Register, Port D
.equ PORTD0 = 0 ;
.equ PD0 = 0 ; For compatibility
.equ PORTD1 = 1 ;
.equ PD1 = 1 ; For compatibility
.equ PORTD2 = 2 ;
.equ PD2 = 2 ; For compatibility
.equ PORTD3 = 3 ;
.equ PD3 = 3 ; For compatibility
.equ PORTD4 = 4 ;
.equ PD4 = 4 ; For compatibility
.equ PORTD5 = 5 ;
.equ PD5 = 5 ; For compatibility
.equ PORTD6 = 6 ;
.equ PD6 = 6 ; For compatibility
; DDRD
.equ DDD0 = 0 ;
.equ DDD1 = 1 ;
.equ DDD2 = 2 ;
.equ DDD3 = 3 ;
.equ DDD4 = 4 ;
.equ DDD5 = 5 ;
.equ DDD6 = 6 ;
; PIND - Input Pins, Port D
.equ PIND0 = 0 ;
.equ PIND1 = 1 ;
.equ PIND2 = 2 ;
.equ PIND3 = 3 ;
.equ PIND4 = 4 ;
.equ PIND5 = 5 ;
.equ PIND6 = 6 ;
; ***** ANALOG_COMPARATOR ************
; ACSR - Analog Comparator Control And Status Register
.equ ACIS0 = 0 ; Analog Comparator Interrupt Mode Select bit 0
.equ ACIS1 = 1 ; Analog Comparator Interrupt Mode Select bit 1
.equ ACIE = 3 ; Analog Comparator Interrupt Enable
.equ ACI = 4 ; Analog Comparator Interrupt Flag
.equ ACO = 5 ; Analog Comparator Output
.equ ACD = 7 ; Analog Comparator Disable
; ***** CPU **************************
; SREG - Status Register
.equ SREG_C = 0 ; Carry Flag
.equ SREG_Z = 1 ; Zero Flag
.equ SREG_N = 2 ; Negative Flag
.equ SREG_V = 3 ; Two's Complement Overflow Flag
.equ SREG_S = 4 ; Sign Bit
.equ SREG_H = 5 ; Half Carry Flag
.equ SREG_T = 6 ; Bit Copy Storage
.equ SREG_I = 7 ; Global Interrupt Enable
; MCUCR - MCU Control Register
.equ ISC00 = 0 ; Interrupt Sense Control 0 bit 0
.equ ISC01 = 1 ; Interrupt Sense Control 0 bit 1
.equ SM = 4 ; Sleep Mode
.equ SE = 5 ; Sleep Enable
; ***** EXTERNAL_INTERRUPT ***********
; GIMSK - General Interrupt Mask Register
.equ INT0 = 6 ; External Interrupt Request 0 Enable
; ***** EEPROM ***********************
; EEAR - EEPROM Read/Write Access
.equ EEAR0 = 0 ; EEPROM Read/Write Access bit 0
.equ EEAR1 = 1 ; EEPROM Read/Write Access bit 1
.equ EEAR2 = 2 ; EEPROM Read/Write Access bit 2
.equ EEAR3 = 3 ; EEPROM Read/Write Access bit 3
.equ EEAR4 = 4 ; EEPROM Read/Write Access bit 4
.equ EEAR5 = 5 ; EEPROM Read/Write Access bit 5
.equ EEAR6 = 6 ; EEPROM Read/Write Access bit 6
; EEDR - EEPROM Data Register
.equ EEDR0 = 0 ; EEPROM Data Register bit 0
.equ EEDR1 = 1 ; EEPROM Data Register bit 1
.equ EEDR2 = 2 ; EEPROM Data Register bit 2
.equ EEDR3 = 3 ; EEPROM Data Register bit 3
.equ EEDR4 = 4 ; EEPROM Data Register bit 4
.equ EEDR5 = 5 ; EEPROM Data Register bit 5
.equ EEDR6 = 6 ; EEPROM Data Register bit 6
.equ EEDR7 = 7 ; EEPROM Data Register bit 7
; EECR - EEPROM Control Register
.equ EERE = 0 ; EEPROM Read Enable
.equ EEWE = 1 ; EEPROM Write Enable
; ***** LOCKSBITS ********************************************************
.equ LB1 = 0 ; Lockbit
.equ LB2 = 1 ; Lockbit
; ***** FUSES ************************************************************
; LOW fuse bits
; ***** CPU REGISTER DEFINITIONS *****************************************
;.def XH = r27
;.def XL = r26
;.def YH = r29
;.def YL = r28
;.def ZH = r31
;.def ZL = r30
; ***** DATA MEMORY DECLARATIONS *****************************************
.equ FLASHEND = 0x01ff ; Note: Word address
.equ IOEND = 0x003f
.equ SRAM_SIZE = 0
.equ RAMEND = 0x0000
.equ XRAMEND = 0x0000
.equ E2END = 0x003f
.equ EEPROMEND = 0x003f
.equ EEADRBITS = 6
#pragma AVRPART MEMORY PROG_FLASH 1024
#pragma AVRPART MEMORY EEPROM 64
#pragma AVRPART MEMORY INT_SRAM SIZE 0
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x0
; ***** INTERRUPT VECTORS ************************************************
.equ INT0addr = 0x0001 ; External Interrupt 0
.equ OVF0addr = 0x0002 ; Timer/Counter0 Overflow
.equ ACIaddr = 0x0003 ; Analog Comparator
.equ INT_VECTORS_SIZE = 4 ; size in words
#pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED break
#endif /* _1200DEF_INC_ */
; ***** END OF FILE ******************************************************
.def number = r10
.def ind_l = r11
.def ind_m = r12
.def ind_h = r13
.def if_l = r14
.def if_h = r15
.def fl_l = r16
.def fl_h =r17
.def work_l =r18
.def work_h =r19
.def temp =r20
.def temp1 =r21
.def loop = r22
.def flagtx =r23
.def glob = r24
.def mult_l = r25
.def mult_h = r26
.def fm_h = r27
.def fm_l = r28
.def temp16_l = r29
.def temp16_h = r30
.def dat_s= r31
;PORTb
.equ DN =0
.equ UP =1
.equ SCAN=2
.equ MEM1=3
.equ MEM2=4
.equ MEM3=5
.equ SAVE=6
;PORTd
.equ TX =0
.equ SQL =1
.equ DATA =2
.equ CL =3
.equ CE =4
.equ SK = 5
.equ DI = 6
.cseg
.org 0
000000 ef4f ldi temp, 0xFF
000001 bb48 out PORTB,temp ;порт B на ввод
000002 2744 clr temp
000003 bb47 out DDRB,temp
000004 e843 ldi temp, 0b10000011
000005 bb42 out PORTD, temp
000006 e74c ldi temp,0B01111100
000007 bb41 out DDRD,temp ;порт D на выход, кроме двух крайних разрядов SQL, TX
000008 24aa clr number
000009 2777 clr flagtx
00000a e540 ldi temp, 0x50
00000b d1d7 rcall pause_ro
;**************************
;**************************
00000c e040 ldi temp, fmin ;загружаем из памяти минимальную границу
00000d d1cf rcall EERead
00000e 2f14 mov fl_h, temp
00000f e041 ldi temp, fmin + 1
000010 d1cc rcall EERead
000011 2f04 mov fl_l, temp
000012 e042 ldi temp, fmax; загружаем максимальную границу
000013 d1c9 rcall EERead
000014 2fb4 mov fm_h, temp
000015 e043 ldi temp, fmax + 1
000016 d1c6 rcall EERead
000017 2fc4 mov fm_l, temp
000018 e044 ldi temp, if_freq;загружаем частоту ПЧ
000019 d1c3 rcall EERead
00001a 2ef4 mov if_h, temp
00001b e045 ldi temp, if_freq + 1
00001c d1c0 rcall EERead
00001d 2ee4 mov if_l, temp
00001e e046 ldi temp,ch1 ; загружаем значение из первой ячейки памяти в рабочую
00001f d1bd rcall EERead
000020 2f34 mov work_h, temp
000021 e047 ldi temp, ch1 +1
000022 d1ba rcall EERead
000023 2f24 mov work_l, temp
;***********************
;ручной ввод параметров
;***********************
000024 9bb3 sbis PINB,MEM1
000025 c005 rjmp vvodmin
000026 9bb4 sbis PINB,MEM2
000027 c00e rjmp vvodmax
000028 9bb5 sbis PINB,MEM3
000029 c017 rjmp vvodif
00002a c076 rjmp initial
00002b 9bb3 vvodmin:sbis PINB,MEM1
00002c cffe rjmp vvodmin
00002d 2f20 mov work_l, fl_l
00002e 2f31 mov work_h, fl_h
00002f ea00 ldi fl_l, 0xA0 ;минимальное значение частоты - 20 мГц
000030 e01f ldi fl_h, 0x0F
000031 e3c3 ldi fm_l, 0x33 ;максимальное - 65535 кГц
000032 e3b3 ldi fm_h, 0x33
000033 e041 ldi temp, 0x01
000034 2ea4 mov number, temp
000035 c015 rjmp vision
000036 9bb4 vvodmax:sbis PINB,MEM2
000037 cffe rjmp vvodmax
000038 2f2c mov work_l, fm_l
000039 2f3b mov work_h, fm_h
00003a ea00 ldi fl_l, 0xA0
00003b e01f ldi fl_h, 0x0F
00003c e3c3 ldi fm_l, 0x33
00003d e3b3 ldi fm_h, 0x33
00003e e042 ldi temp, 0x02
00003f 2ea4 mov number, temp
000040 c00a rjmp vision
000041 9bb5 vvodif:sbis PINB,MEM3
000042 cffe rjmp vvodif
000043 2d2e mov work_l, if_l
000044 2d3f mov work_h, if_h
000045 e500 ldi fl_l, 0x50; минимальное значение частоты - 400 кГц
000046 2711 clr fl_h
000047 e3c0 ldi fm_l, 0x30; максимальное значение - 22000 кГц
000048 e1b1 ldi fm_h, 0x11
000049 e043 ldi temp, 0x03
00004a 2ea4 mov number, temp
00004b d114 vision:rcall display
00004c e042 askkeys:ldi temp, 0x02
00004d d195 rcall pause_ro
00004e 9bb1 sbis PINB,UP
00004f c009 rjmp up_rout1
000050 9bb0 sbis PINB,DN
000051 c015 rjmp dn_rout1
000052 9bb3 sbis PINB,MEM1
000053 c020 rjmp savemin
000054 9bb4 sbis PINB,MEM2
000055 c02d rjmp savemax
000056 9bb5 sbis PINB,MEM3
000057 c03a rjmp saveif
000058 cff3 rjmp askkeys
000059 9bb1 up_rout1:sbis PINB,UP
00005a cffe rjmp up_rout1
00005b e041 ldi temp, 0x01
00005c 9488 clc
00005d 0f24 add work_l, temp ; увеличить на 1 значение в рабочей ячейке
00005e 2744 clr temp
00005f 1f34 adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
000060 17b3 cp fm_h, work_h; достгло ло значение старшего разряда макс?
000061 f749 brne vision; нет-выход
000062 172c cp work_l, fm_l; если да, проверяем младший разряд
000063 f338 brlo vision
000064 2f31 mov work_h, fl_h; дошло до конца - загружаем рабочую ячейку мин.
000065 2f20 mov work_l, fl_l; значением
000066 cfe4 rjmp vision
000067 9bb0 dn_rout1:sbis PINB,DN ; ждём отпускания кнопки
000068 cffe rjmp dn_rout1
000069 2744 clr temp
00006a 9488 clc
00006b 5021 subi work_l, 0x01;уменьшаем на 1 младший байт
00006c 0b34 sbc work_h, temp ; если был перенос, уменьшаем старший байт
00006d 1731 cp work_h, fl_h; дошло до конца?
00006e f6e1 brne vision; нет
00006f 1702 cp fl_l, work_l ; дошло до конца?
000070 f2d0 brlo vision; нет
000071 2f3b mov work_h, fm_h;если дошло, переписываем в рабочую ячейку
000072 2f2c mov work_l, fm_l;максимальное значение
000073 cfd7 rjmp vision
000074 99b3 savemin:sbic PINB, MEM1 ;если кнопку ещё удерживают,
000075 cfd5 rjmp vision
000076 99b6 sbic PINB, SAVE ;проверяем, нажата ли РЕП
000077 cffc rjmp savemin ; если РЕП отпущена, возврат
000078 9bb6 neotp1:sbis PINB, SAVE ; ждём, пока отпустят РЕП
000079 cffe rjmp neotp1
00007a e040 ldi temp, fmin ; записываем в память данные
00007b 2f53 mov temp1, work_h
00007c d15a rcall EEwrite
00007d e041 ldi temp, fmin+1
00007e 2f52 mov temp1, work_l
00007f d157 rcall EEwrite
000080 9bb3 vozv_1:sbis PINB, MEM1 ; когда отпущена МЕМ1, выход
000081 cffe rjmp vozv_1
000082 cfc8 rjmp vision
000083 99b4 savemax:sbic PINB, MEM2 ;если кнопку ещё удерживают,
000084 cfc6 rjmp vision
000085 99b6 sbic PINB, SAVE ;проверяем, нажата ли РЕП
000086 cffc rjmp savemax ; если РЕП отпущена, возврат
000087 9bb6 neotp2:sbis PINB, SAVE ; ждём, пока отпустят РЕП
000088 cffe rjmp neotp2
000089 e042 ldi temp, fmax ; записываем в память данные
00008a 2f53 mov temp1, work_h
00008b d14b rcall EEwrite
00008c e043 ldi temp, fmax+1
00008d 2f52 mov temp1, work_l
00008e d148 rcall EEwrite
00008f 9bb4 vozv_2:sbis PINB, MEM2 ; когда отпущена МЕМ1, выход
000090 cffe rjmp vozv_2
000091 cfb9 rjmp vision
000092 99b5 saveif:sbic PINB, MEM3 ;если кнопку ещё удерживают,
000093 cfb7 rjmp vision
000094 99b6 sbic PINB, SAVE ;проверяем, нажата ли РЕП
000095 cfed rjmp savemax ; если РЕП отпущена, возврат
000096 9bb6 neotp3:sbis PINB, SAVE ; ждём, пока отпустят РЕП
000097 cffe rjmp neotp3
000098 e044 ldi temp, if_freq ; записываем в память данные
000099 2f53 mov temp1, work_h
00009a d13c rcall EEwrite
00009b e045 ldi temp, if_freq+1
00009c 2f52 mov temp1, work_l
00009d d139 rcall EEwrite
00009e 9bb5 vozv_3:sbis PINB, MEM3 ; когда отпущена МЕМ1, выход
00009f cffe rjmp vozv_3
0000a0 cfaa rjmp vision
initial:
0000a1 d0be rcall display
0000a2 d0f6 rcall syntez
;***Опрос клавиш**********************
0000a3 e042 bigloop:ldi temp, 0x02
0000a4 d13e rcall pause_ro
0000a5 9bb1 sbis PINB,UP
0000a6 c00d rjmp up_rout
0000a7 9bb0 sbis PINB,DN
0000a8 c01a rjmp dn_rout
0000a9 9b80 sbis PIND,TX
0000aa c025 rjmp tx_rout
0000ab 9bb2 sbis PINB,SCAN
0000ac c02d rjmp scan_rout
0000ad 9bb3 sbis PINB,MEM1
0000ae c06f rjmp mem1_r
0000af 9bb4 sbis PINB,MEM2
0000b0 c083 rjmp mem2_r
0000b1 9bb5 sbis PINB,MEM3
0000b2 c097 rjmp mem3_r
0000b3 cfef rjmp bigloop
;***Обработка опроса клавиш ************************
0000b4 9bb1 up_rout:sbis PINB,UP
0000b5 cffe rjmp up_rout
0000b6 2744 clr temp
0000b7 9488 clc
0000b8 e041 ldi temp, 0x01
0000b9 0f24 add work_l, temp ; увеличить на 1 значение в рабочей ячейке
0000ba 2744 clr temp
0000bb 1f34 adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
0000bc 17b3 cp fm_h, work_h; достгло ло значение старшего разряда макс?
0000bd f719 brne initial; нет-выход
0000be 172c cp work_l, fm_l ; если да, проверяем младший разряд
0000bf f308 brlo initial
0000c0 2f31 mov work_h, fl_h; дошло до конца - загружаем рабочую ячейку мин.
0000c1 2f20 mov work_l, fl_l; значением
0000c2 cfde rjmp initial
0000c3 9bb0 dn_rout:sbis PINB,DN ; ждём отпускания кнопки
0000c4 cffe rjmp dn_rout
0000c5 2744 clr temp
0000c6 9488 clc
0000c7 5021 subi work_l, 0x01;уменьшаем на 1 младший байт
0000c8 0b34 sbc work_h, temp ; если был перенос, уменьшаем старший байт
0000c9 1731 cp work_h, fl_h ; дошло до конца?
0000ca f6b1 brne initial; нет
0000cb 1702 cp fl_l, work_l ; дошло до конца?
0000cc f2a0 brlo initial; нет
0000cd 2f3b mov work_h, fm_h;если дошло, переписываем в рабочую ячейку
0000ce 2f2c mov work_l, fm_l;максимальное значение
0000cf cfd1 rjmp initial
0000d0 e071 tx_rout:ldi flagtx,0x01 ;устанавливаем флаг передачи в 1
0000d1 e04b ldi temp, 0x0B
0000d2 2ea4 mov number, temp
0000d3 d08c rcall display
0000d4 d0c4 rcall syntez ;выдаём в синтезатор
0000d5 9b80 return: sbis PIND,TX ;ждём, пока отпустят кнопку
0000d6 cffe rjmp return
0000d7 2777 clr flagtx ;если кнопка отпущена, сбрасываем флаг
0000d8 24aa clr number
0000d9 cfc7 rjmp initial
scan_rout:
0000da 9bb2 sbis PINB,SCAN ;ждём, пока отпустят кнопку
0000db cffe rjmp scan_rout
0000dc 9488 scan_up:clc
0000dd e041 ldi temp,0x01
0000de 0f24 add work_l, temp ;увеличиваем
0000df 2744 clr temp
0000e0 1f34 adc work_h, temp ; если был перенос, увеличиваем на 1 старший разряд
0000e1 17b3 cp fm_h, work_h; достгло ло значение старшего разряда макс?
0000e2 f429 brne end3; нет-выход
0000e3 172c cp work_l, fm_l; если да, проверяем младший разряд
0000e4 f018 brlo end3
0000e5 2f31 mov work_h, fl_h; дошло до конца - загружаем рабочую ячейку мин.
0000e6 2f20 mov work_l, fl_l; значением
0000e7 f401 brne end3
0000e8 d077 end3:rcall display
0000e9 d0af rcall syntez
0000ea e044 ldi temp,0x04 ;задержка , определяет скорость сканирования
0000eb d0f7 rcall pause_ro
0000ec 99b2 nachopr:sbic PINB, SCAN ;если нажата SCAN, TX, UP, DN - выход из режима сканирования
0000ed c003 rjmp key1
0000ee 9bb2 voz1:sbis PINB, SCAN
0000ef cffe rjmp voz1
0000f0 cfb2 rjmp bigloop
0000f1 9980 key1:sbic PIND, TX
0000f2 c003 rjmp key2
0000f3 9b80 voz2:sbis PIND, TX
0000f4 cffe rjmp voz2
0000f5 cfad rjmp bigloop
0000f6 99b1 key2:sbic PINB, UP
0000f7 c003 rjmp key3
0000f8 9bb1 voz3:sbis PINB, UP
0000f9 cffe rjmp voz3
0000fa cfa8 rjmp bigloop
0000fb 99b0 key3:sbic PINB, DN
0000fc c003 rjmp key4
0000fd 9bb0 voz4:sbis PINB, DN
0000fe cffe rjmp voz4
0000ff cfa3 rjmp bigloop
000100 9981 key4:sbic PIND, SQL ;если не нажата ни одна кнопка,
000101 cfda rjmp scan_up ; продолжаем сканирование
000102 e480 ldi glob,0x40 ;подпрограмма обработки, если нажата SQL, ГЛОБ - задержка
000103 99b2 oprotp:sbic PINB, SCAN ; если нажата SCAN, TX, UP, DN - выход из режима сканирования
000104 c003 rjmp key11
000105 9bb2 voz11:sbis PINB, SCAN
000106 cffe rjmp voz11
000107 cf9b rjmp bigloop
000108 9980 key11:sbic PIND, TX
000109 c003 rjmp key21
00010a 9b80 voz21:sbis PIND, TX
00010b cffe rjmp voz21
00010c cf96 rjmp bigloop
00010d 99b1 key21:sbic PINB, UP
00010e c003 rjmp key31
00010f 9bb1 voz31:sbis PINB, UP
000110 cffe rjmp voz31
000111 cf91 rjmp bigloop
000112 99b0 key31:sbic PINB, DN
000113 c003 rjmp key41
000114 9bb0 voz41:sbis PINB, DN
000115 cffe rjmp voz41
000116 cf8c rjmp bigloop
000117 9b81 key41:sbis PIND, SQL ; если SQL всё ещё нажата,
000118 cfea rjmp oprotp ; ждём, пока что-нибудь нажмётся
000119 e044 ldi temp,0x04 ; если SQL отпущена, формируем паузу в сканировании
00011a d0c8 rcall pause_ro
00011b 958a dec glob ; пауза, пока не сбросится ГЛОБ
00011c f731 brne oprotp
00011d cfbe rjmp scan_up ; продолжаем сканирование
;*****************************
;работа с ячейками памяти
;****************************
00011e 99b3 mem1_r:sbic PINB, MEM1 ;если кнопку ещё удерживают,
00011f c00d rjmp readm1
000120 99b6 sbic PINB, SAVE ;проверяем, нажата ли SAVE
000121 cffc rjmp mem1_r ; если РЕП отпущена, возврат
000122 9bb6 neotpus1:sbis PINB, SAVE ; ждём, пока отпустят SAVE
000123 cffe rjmp neotpus1
000124 e046 ldi temp, ch1 ; записываем в память данные
000125 2f53 mov temp1, work_h
000126 d0b0 rcall EEwrite
000127 e047 ldi temp, ch1+1
000128 2f52 mov temp1, work_l
000129 d0ad rcall EEwrite
00012a 9bb3 vozv1:sbis PINB, MEM1 ; когда отпущена МЕМ1, выход
00012b cffe rjmp vozv1
00012c cf76 rjmp bigloop
00012d e046 readm1:ldi temp,ch1 ;чтение данных из памяти
00012e d0ae rcall EEread
00012f 2f34 mov work_h, temp
000130 e047 ldi temp, ch1+1
000131 d0ab rcall EEread
000132 2f24 mov work_l, temp
000133 cf6d rjmp initial
000134 99b4 mem2_r:sbic PINB, MEM2
000135 c00d rjmp readm2
000136 99b6 sbic PINB, SAVE
000137 cffc rjmp mem2_r
000138 9bb6 neotpus2:sbis PINB, SAVE
000139 cffe rjmp neotpus2
00013a e048 ldi temp, ch2
00013b 2f53 mov temp1, work_h
00013c d09a rcall EEwrite
00013d e049 ldi temp, ch2+1
00013e 2f52 mov temp1, work_l
00013f d097 rcall EEwrite
000140 9bb4 vozv2:sbis PINB, MEM2
000141 cffe rjmp vozv2
000142 cf60 rjmp bigloop
000143 e048 readm2:ldi temp,ch2
000144 d098 rcall EEread
000145 2f34 mov work_h, temp
000146 e049 ldi temp, ch2+1
000147 d095 rcall EEread
000148 2f24 mov work_l, temp
000149 cf57 rjmp initial
00014a 99b5 mem3_r:sbic PINB, MEM3
00014b c00d rjmp readm3
00014c 99b6 sbic PINB, SAVE
00014d cffc rjmp mem3_r
00014e 9bb6 neotpus3:sbis PINB, SAVE
00014f cffe rjmp neotpus3
000150 e04a ldi temp, ch3
000151 2f53 mov temp1, work_h
000152 d084 rcall EEwrite
000153 e04b ldi temp, ch3+1
000154 2f52 mov temp1, work_l
000155 d081 rcall EEwrite
000156 9bb5 vozv3:sbis PINB, MEM3
000157 cffe rjmp vozv3
000158 cf4a rjmp bigloop
000159 e04a readm3:ldi temp,ch3
00015a d082 rcall EEread
00015b 2f34 mov work_h, temp
00015c e04b ldi temp, ch3+1
00015d d07f rcall EEread
00015e 2f24 mov work_l, temp
00015f cf41 rjmp initial
;******отображение на дисплее******************
;************ преобразование коэфф.деления в частоту для вывода на индикатор**************
000160 2799 display:clr mult_l
000161 27aa clr mult_h
000162 e045 ldi temp, 0x05
000163 0f92 cycle:add mult_l, work_l
000164 1fa3 adc mult_h, work_h
000165 954a dec temp
000166 f7e1 brne cycle
000167 e1d0 ldi temp16_l, 0x10 ;определяем количество десятков тысяч
000168 e2e7 ldi temp16_h, 0x27
000169 d08e rcall decdig
00016a 3040 cpi temp, 0x00
00016b f409 brne nextdig1
00016c e04a ldi temp, 0x0A
00016d 2ed4 nextdig1:mov ind_h, temp
00016e eed8 ldi temp16_l, 0xE8 ;определяем количество тысяч
00016f e0e3 ldi temp16_h, 0x03
000170 d087 rcall decdig
000171 3040 cpi temp, 0x00
000172 f409 brne nextdig2
000173 e04a ldi temp, 0x0A
000174 2ec4 nextdig2:mov ind_m, temp
000175 94c2 swap ind_m
000176 e6d4 ldi temp16_l, 0x64 ;определяем количество сотен
000177 27ee clr temp16_h
000178 d07f rcall decdig
000179 3040 cpi temp, 0x00
00017a f409 brne nextdig3
00017b e04a ldi temp, 0x0A
00017c 0ec4 nextdig3:add ind_m, temp
00017d e0da ldi temp16_l, 0x0A; определяемколичество десятков
00017e 27ee clr temp16_h
00017f d078 rcall decdig
000180 3040 cpi temp, 0x00
000181 f409 brne nextdig4
000182 e04a ldi temp, 0x0A
000183 2eb4 nextdig4:mov ind_l, temp ; в конце операции в ячейках инд содержится
000184 94b2 swap ind_l;десятичное значение рабочей частоты
;mov temp,mult_l
000185 3090 cpi mult_l,0x00;нули заменены на А - для вывода на индикатор.
000186 f409 brne enddig
000187 e09a ldi mult_l,0x0A
000188 0eb9 enddig:add ind_l, mult_l
000189 2d4a mov temp, number
00018a d03a no_tx:rcall vyvdig
00018b d039 rcall vyvdig
00018c 2744 clr temp
00018d d037 rcall vyvdig
00018e d036 rcall vyvdig
00018f 2d4d mov temp, ind_h
000190 d034 rcall vyvdig
000191 d033 rcall vyvdig
000192 2d4c mov temp, ind_m
000193 d031 rcall vyvdig
000194 d030 rcall vyvdig
000195 2d4b mov temp, ind_l
000196 d02e rcall vyvdig
000197 d02d rcall vyvdig
000198 9508 ret
;*****ВВод информации в синтезатор******************
syntez: ;ret ;технологический возврат
000199 2f92 mov mult_l, work_l ; в противном случае прибавляем
00019a 2fa3 mov mult_h, work_h
00019b 3070 cpi flagtx,0x00
00019c f421 brne nosum ;если установлен флаг, не прибавляем ПЧ
00019d eef4 ldi dat_s,0b11100100;0xA4
00019e 0d9e add mult_l,if_l ;добавляем ПЧ, если надо
00019f 1daf adc mult_h,if_h
0001a0 c001 rjmp sum
0001a1 eef2 nosum:ldi dat_s,0b11100010;0xA2
0001a2 9892 sum:cbi PORTD,DATA
0001a3 9a94 sbi PORTD,CE ;разрешение записи
0001a4 e068 ldi loop, 0x08
0001a5 2f49 mov temp,mult_l
0001a6 9547 loop2:ror temp
0001a7 f010 brcs h_l
0001a8 9892 cbi PORTD, DATA
0001a9 c001 rjmp sync
0001aa 9a92 h_l:sbi PORTD, DATA
0001ab d040 sync:rcall pulse
0001ac 956a dec loop
0001ad f7c1 brne loop2
0001ae e068 ldi loop, 0x08
0001af 2f4a mov temp, mult_h
0001b0 9547 loop3:ror temp
0001b1 f010 brcs h_l1
0001b2 9892 cbi PORTD, DATA
0001b3 c001 rjmp sync1
0001b4 9a92 h_l1:sbi PORTD, DATA
0001b5 d036 sync1:rcall pulse
0001b6 956a dec loop
0001b7 f7c1 brne loop3
0001b8 e068 ldi loop, 0x08
0001b9 2f4f mov temp, dat_s
0001ba 9547 loop21:ror temp
0001bb f010 brcs h_l2
0001bc 9892 cbi PORTD, DATA
0001bd c001 rjmp sync2
0001be 9a92 h_l2:sbi PORTD, DATA
0001bf d02c sync2:rcall pulse
0001c0 956a dec loop
0001c1 f7c1 brne loop21
0001c2 9892 cbi PORTD, DATA ;CE
0001c3 9894 cbi PORTD, CE
0001c4 9508 ret
;***вывод цифры на индикатор***
vyvdig: ; ret ;технологический возврат
0001c5 e064 ldi loop,0x04
0001c6 1f44 byte_c:rol temp
0001c7 f010 brcs h_level
0001c8 9896 cbi PORTD,DI
0001c9 c001 rjmp synhro
0001ca 9a96 h_level:sbi PORTD,DI
0001cb 9a95 synhro:sbi PORTD,SK
0001cc e150 ldi temp1, 0x10;
0001cd d027 rcall zaderzh
0001ce 9895 cbi PORTD,SK
0001cf e250 ldi temp1, 0x20
0001d0 d024 rcall zaderzh
0001d1 956a dec loop
0001d2 f799 brne byte_c
0001d3 e450 ldi temp1, 0x40
0001d4 d020 rcall zaderzh
0001d5 9896 cbi PORTD, DI ;SK
0001d6 9508 ret
;*************************
; Запись в ЕЕПРОМ
;**************************
0001d7 99e1 EEwrite: sbic EECR, EEWE
0001d8 cffe rjmp EEwrite
0001d9 bb4e out EEAR, temp
0001da bb5d out EEDR, temp1
0001db 9ae1 sbi EECR, EEWE
0001dc 9508 ret
;***********************
; Чтение из памяти
;***********************
0001dd 99e1 EEread: sbic EECR,EEWE
0001de cffe rjmp EERead
0001df bb4e out EEAR,temp
0001e0 9ae0 sbi EECR,EERE
0001e1 b34d in temp,EEDR
0001e2 9508 ret
;*********************
; пауза
;*********************
pause_ro: ; ret ;технологический возврат
0001e3 ef5f ldi temp1, 0xFF
0001e4 ef6f retu1:ldi loop, 0xFF
0001e5 956a retu2:dec loop
0001e6 f7f1 brne retu2
0001e7 955a dec temp1
0001e8 f7d9 brne retu1
0001e9 954a dec temp
0001ea f7c1 brne pause_ro
0001eb 9508 ret
;*********************
; синхроимпульс
;*********************
0001ec 9a93 pulse:sbi PORTD, CL
0001ed e15f ldi temp1,0x1F
0001ee 955a zad1:dec temp1
0001ef f7f1 brne zad1
0001f0 9893 cbi PORTD, CL
0001f1 e15f ldi temp1,0x1F
0001f2 955a zad2:dec temp1
0001f3 f7f1 brne zad2
0001f4 9508 ret
zaderzh:;ret ;технологический возврат
0001f5 955a dec temp1
0001f6 f7f1 brne zaderzh
0001f7 9508 ret
;**********************************************
;подпрограмма пересчёта НЕХ- десятичное число
;**********************************************
0001f8 ef4f decdig:ldi temp,-1
0001f9 1b9d minus:sub mult_l, temp16_l
0001fa 0bae sbc mult_h, temp16_h
0001fb 9543 inc temp
0001fc f7e0 brsh minus
0001fd 0f9d add mult_l, temp16_l
0001fe 1fae adc mult_h, temp16_h
0001ff 9508 ret
.eseg
.org 0
fmin:
000000 2c
000001 88 .db 0x2C, 0x88 ;0x0F, 0xA0 ;20000/5=4000
fmax:
000002 2c
000003 ec .db 0x2c, 0xEC ;0x33, 0x33 ;65535/5=13107
if_freq:
000004 08
000005 5c .db 0x08, 0x5C ;10700/5=2140
ch1:
000006 2c
000007 88 .db 0x2C, 0x88
ch2:
000008 2c
000009 88 .db 0x2C, 0x88
ch3:
00000a 2c
00000b 88 .db 0x2C, 0x88
;ch4:
;.db 0x33, 0x32
00000c 73
00000d 74
00000e 65
00000f 70
000010 35 .db "step5"
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
AT90S1200 register use summary:
r0 : 0 r1 : 0 r2 : 0 r3 : 0 r4 : 0 r5 : 0 r6 : 0 r7 : 0
r8 : 0 r9 : 0 r10: 7 r11: 4 r12: 4 r13: 2 r14: 3 r15: 3
r16: 10 r17: 10 r18: 30 r19: 30 r20: 110 r21: 23 r22: 10 r23: 4
r24: 2 r25: 10 r26: 7 r27: 10 r28: 10 r29: 6 r30: 6 r31: 3
x : 0 y : 0 z : 0
Registers used: 22 out of 35 (62.9%)AT90S1200 instruction use summary:
adc : 6 add : 8 and : 0 andi : 0 asr : 0 bclr : 0
bld : 0 brbc : 0 brbs : 0 brcc : 0 brcs : 4 breq : 0
brge : 0 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 5
brlt : 0 brmi : 0 brne : 24 brpl : 0 brsh : 1 brtc : 0
brts : 0 brvc : 0 brvs : 0 bset : 0 bst : 0 cbi : 10
cbr : 0 clc : 5 clh : 0 cli : 0 cln : 0 clr : 17
cls : 0 clt : 0 clv : 0 clz : 0 com : 0 cp : 10
cpc : 0 cpi : 6 cpse : 0 dec : 12 eor : 0 in : 1
inc : 1 ld : 0 ldi : 80 lsl : 0 lsr : 0 mov : 58
neg : 0 nop : 0 or : 0 ori : 0 out : 7 rcall : 58
ret : 9 reti : 0 rjmp : 101 rol : 1 ror : 3 sbc : 3
sbci : 0 sbi : 9 sbic : 23 sbis : 45 sbr : 0 sbrc : 0
sbrs : 0 sec : 0 seh : 0 sei : 0 sen : 0 ser : 0
ses : 0 set : 0 sev : 0 sez : 0 sleep : 0 st : 0
sub : 1 subi : 2 swap : 2 tst : 0 wdr : 0
Instructions used: 29 out of 89 (32.6%)AT90S1200 memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x000400 1024 0 1024 1024 100.0%
[.dseg] 0x000000 0x000060 0 0 0 0 -
[.eseg] 0x000000 0x000011 0 17 17 64 26.6%Assembly complete, 0 errors, 0 warnings