Разработка системы сбора данных на базе МК АТ90S2313. Написание программного обеспечения для генерации дискретного треугольного сигнала и изменения значения частоты сигнала по каналу RS-232 в диапазоне 500-1000 Гц, страница 3

.DEF ZL=r30                     ; для адресации элементов таблицы из Flash

.DEF ZH=r31                     ; для адресации элементов таблицы из Flash

.DEF count=r20                 ; счётчик

.cseg
.org 0
rjmp Reset    
rjmp INT_0
rjmp INT_1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

INT_0:
INT_1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti

reset:
seti
ldi r25,low(RAMEND)             ;инициализируем стек
out SPL,r25

RCALL Init

pusto:                     ;нагоняем время
          nop
          nop
          nop
          rjmp pusto
rjmp PC

Init:     ;Инициализация

        ldi r25,0               ;инициализация таймера 0

        out TCCR0,r25                  

        ldi r25,2               ;разрешение прерывания по переполнению Т0

        out TIMSK,r25

        sei                     ;установка глобального флага разрешения прерываний

          ldi      temp, 0b00000100

          out     DDRD, temp                                       

          ldi r25,25            ;9600 бит/c при fclk=4МГц
          out UBRR,r25

clr r25               ;Настроить порт D на ввод
out ddrd,r25


ldi r25,0x02          ;задаем цикл

receive:

in r21,pind             ;считываем из порта частоту сигнала

bst r21,7
bld r22,0

bst r21,6
bld r22,1

bst r21,5
bld r22,2

bst r21,4
bld r22,3

bst r21,3
bld r22,4

bst r21,2
bld r22,5

bst r21,1
bld r22,6

bst r21,0
bld r22,7

cpi r25, 0x02                   ;сравнили с 2
breq copy              ;если равно перешли на copy
copy:

mov r23,r22           ;скопировали в другой регистр

dec r25                 

cpi r25, 0x00                  

brne receive

ldi mc,11

ldi mp,r23

RCALL mult

mult: clr XH

         ldi count,8

         lsr mp

m_1: brcc m_2

         add XH,mc

m_2: ror XH

         ror XL

         dec count

         brne m_1

         ret

clr count

ldi dd,1

ldi dv,r15

RCALL div

div: sub drem,drem

       ldi         count,9

d_1: rol dd

        dec count

        brne d_2

        ret

d_2: rol drem

        sub drem,dv

        brcc d_3

        add drem,dv

        clc

        rjmp d_1

d_3: sec

        rjmp d_1

        ret

mov r13,r18

tim0: ldi ZH,HIGH(ORD*2)

          ldi ZL,LOW(ORD*2)

          lpm

          adiw ZL,1          

          ldi r12,11

          out pind,r0

          out pind,r13         

          dec r12

          cpi r12, 0   ; проверяем не прошел ли полный период

          brne endtick

          breq tim0                                  

endtick:

          ldi temp , 53  ; увеличем число тактов чтоб переполнение случилось раньше

          in r2 , TCNT0  ;

          add r2 ,temp

          out TCNT0, r2      

          sei

reti

.CSEG

ORD: .DB  0,51,102,153,204,255,204,153,102,51,0

7. Список используемых ресурсов:

1.PDF документация на микроконтроллер AT90S2313 www.ATMEL.com

2.PDF документация на интерфейс RS 232 www.ANALOG.com

3. www.amtel.ru

4. www.chipinfo.ru

5. www.shema.ru

6. www.rtcs.ru

7.www.gaw.ru