Разработка преобразователя частоты входного сигнала в длительность импульса выходного сигнала на базе МК ATtiny2313, страница 2

.INCLUDE "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc"

.equ   TCCR0A     =$30

.equ   TCCR0B     =$33

.equ   OCR0A       =$36

.equ   OCR0B       =$3c

.equ   UCSRA       =$0B

.equ   UCSRB       =$0A

.equ   UCSRC       =$03

.equ   UBRRL       =$09

.equ   UBRRH      =$02

.DSEG

.ORG 0x60

Coun_Sampl:        .BYTE 2 ;длина импульса, пришедшего на ТС1

Coun_Int0: .BYTE 1 ;количество прерываний ТС0

Skva: .BYTE 1 ;дробная часть скважности, выводимая через RS-232

.CSEG                   ;сегмент кода

.org 0x00

;вектора прерываний

RJMP RESET ; Reset Handler

.org   0x0001

RJMP INT0  ; External Interrupt0 Handler

.org   0x0002

RJMP INT1  ; External Interrupt1 Handler

.org   0x0003

RJMP TIM1_CAPT ; Timer1 Capture Handler

.org   0x0004

RJMP TIM1_COMPA ; Timer1 CompareA Handler

.org   0x0005

RJMP TIM1_OVF ; Timer1 Overflow Handler

.org   0x0006

RJMP TIM0_OVF ; Timer0 Overflow Handler

.org 0x0007

RJMP USART0_RXC ; USART0 RX Complete Handler

.org 0x0008

RJMP USART0_DRE ; USART0,UDR Empty Handler

.org 0x0009

RJMP USART0_TXC ; USART0 TX Complete Handler

.org 0x000A

RJMP ANA_COMP ; Analog Comparator Handler

.org 0x000B

RJMP PCINT ; Pin Change Interrupt

.org 0x000C

RJMP TIMER1_COMPB ; Timer1 Compare B Handler

.org 0x000D

RJMP TIMER0_COMPA ; Timer0 Compare A Handler

.org 0x000E

RJMP TIMER0_COMPB ; Timer0 Compare B Handler

RJMP Reset ;вектор прерывания, вызываемого по сбросу микроконтроллера

Reset:

;инициализация стека

          LDI r16,0x90

          OUT SPL,r16

;настройка портов

          LDI r16,0xBF

          OUT DDRD,r16

          LDI r16,0xFF

          OUT DDRB,r16

;настройка ТС1

          EOR r15,r15

          LDI r16,0x00

          OUT TCCR1A,r16

          LDI r16,0x43

          OUT TCCR1B,r16

          LDI r16,0x90

          OUT SPL,r16

          LDI r16,0x8E

          OUT TIMSK,r16

;настройка ТС0

          LDI r16,0x03

          OUT TCCR0A,r16

          LDI r16,0x0C

          OUT TCCR0B,r16

          LDI r16,0xA0

          OUT OCR0A,r16

          LDI r16,0x64

          OUT OCR0B,r16

;настройка интерфейса RS-232

          LDI r16,0x00

          OUT UCSRA,r16

          LDI r16,0x08

          OUT UCSRB,r16

          LDI r16,0x06

          OUT UCSRC,r16

          LDI r16,0x01

          OUT UBRRL,r16

          LDI r16,0x00

          OUT UBRRH,r16

;обнуление количества переполнений ТС0

          LDI ZL,LOW(Coun_Int0)

          LDI ZH,HIGH(Coun_Int0)

          LDI r16,0x00

          ST Z,r16

;разрешение прерываний

          SEI

          RJMP End_Capt

;обработчик, производящий необходимые манипуляции с сигналом со

;входного захвата TС1 и вычисляющий параметры для ШИМ и скважность       

Input_Capt:

          CLT

          BLD r15,0

          LDI ZL,LOW(Coun_Sampl)

          LDI ZH,HIGH(Coun_Sampl)

          LD r19,Z+

          LD r18,Z

          LDI r16,0x00

          LDI r17,0x20

          LDI r21,0xB2

          RCALL DIV_WORD ;получение произведения f*y

          LDI r22,28

          LDI r23,0x00

          ADD r26,r22

          ADC r27,r23

          MOV r10,r26

          MOV r11,r27

          LDI r20,3

          ;сдвиг на 4 бита вправо для вывода в ШИМ длительности импульса

P1:     LSR r11

          ROR r10

          DEC r20

          BRNE P1

          ;округление до ближайшего целого

          LSR r11

          ROR r10

          ADC r10,r11

          OUT OCR0B,r10

          MOV r28,r26

          MOV r29,r27

          LDI r20,4

P8:     LSL r28

          ROL r29

          DEC r20

          BRNE P8

          MOV r16,r28

          MOV r17,r29

          LDI r18,0xA0

          LDI r19,0x00

          LDI r21,0x00

          RCALL DIV_WORD ;получение дробной части скважности

          LDI ZL,LOW(Skva)

          LDI ZH,HIGH(Skva)

          ST Z,r26

          RJMP End_Capt

Input_Capt1:

          RJMP Input_Capt

;обработчик вывода скважности через интерфейс RS-232

Load_Port:

          CLT

          BLD r15,1

          LDI ZL,LOW(Skva)

          LDI ZH,HIGH(Skva)

          LD r26,Z

          LDI r20,4

P13:LSR r26

          ROR r27

          DEC r20

          BRNE P13

          SWAP r27

          ;формирование посладовательности из кодов ASCII в стеке

          EOR r21,r21

          LDI ZL,LOW(ASCII_Numb*2) ;нахождение ASCII кода символа из таблицы

          LDI ZH,HIGH(ASCII_Numb*2)

          ADD ZL,r27

          ADC ZH,r21

          LPM

          PUSH r0

          LDI ZL,LOW(ASCII_Numb*2)

          LDI ZH,HIGH(ASCII_Numb*2)

          ADD ZL,r26

          ADC ZH,r21

          LPM

          PUSH r0

          LDI r22,0x2E

          PUSH r22

          LDI r22,0x30

          PUSH r22

          ;вывод последовательности из стека через порт

          LDI r20,4

P14:SBIS UCSRA,5

          RJMP p14

          POP r22

          OUT UDR,r22

          DEC r20

          BRNE P14

          RJMP End_Capt

;бесконечный цикл

End_Capt:

          BST r15,0

          BRTS Input_Capt1

          BST r15,1

          BRTS Load_Port

          RJMP End_Capt

;делит r16:17:21 на r18:r19 (целочисленно), резултат выводится в

;регистры r26:r27

DIV_WORD:

          PUSH r16

          PUSH r17

          PUSH r21

          PUSH r20

          PUSH r22

          PUSH r23

          EOR r20,r20

          EOR r22,r22

          EOR r23,r23

          EOR r26,r26

          EOR r27,r27

          LDI r20,25

          RJMP P4

P2:     LSL r26

          ROL r27

P4:     LSL r16

          ROL r17

          ROL r21

          ROL r22

          ROL r23

          DEC r20

          BREQ P5

          CP r19,r23

          BRLO P3

          BRNE P2

          CP r18,r22

          BRLO P3

          BRNE P2

P3: SUB r22,r18

          SBC r23,r19

          LSL r26

          ROL r27

          SBR r26,1

          RJMP P4

P5: POP r23

          POP r22

          POP r20

          POP r21

          POP r17

          POP r16

RET

;обработчики прерываний

;обработчик прерывания по внешнему захвату 1го ТС

TIM1_CAPT:

          PUSH r20

          PUSH r18

          PUSH r19

          PUSH ZL

          PUSH ZH

          LDI r20,0x00

          IN r18,TCNT1L

          IN r19,TCNT1H

          OUT TCNT1H,r20

          OUT TCNT1L,r20

          LDI ZL,LOW(Coun_Sampl)

          LDI ZH,HIGH(Coun_Sampl)

          ST Z+,r19

          ST Z,r18

          SET

          BLD r15,0

          POP ZH

          POP ZL

          POP r19

          POP r18

          POP r20

reti

TIM1_COMPA:NOP

reti

TIM1_OVF:NOP 

reti

;обработчик прерывания по переполнению 0го ТС

TIM0_OVF:

          PUSH r16

          PUSH r17

          PUSH ZL

          PUSH ZH

          SBI PORTB,2 ;начало импульса ШИМ

          LDI ZL,LOW(Coun_Int0)

          LDI ZH,HIGH(Coun_Int0)

          LD r16,Z

          INC r16

          LDI r17,0x64

          CP r17,r16

          BREQ P11

          RJMP p12

P11:SET

          BLD r15,1

          LDI r16,0x00

P12:ST Z,r16

          POP ZH

          POP ZL

          POP r17

          POP r16

reti

USART0_RXC:NOP

reti

USART0_DRE:NOP

reti

USART0_TXC:NOP

reti

ANA_COMP:NOP

reti

PCINT:NOP

reti

TIMER1_COMPB :NOP

reti

TIMER0_COMPA:NOP

reti

;обработчик прерывания по сравнению 0го ТС

TIMER0_COMPB:

CBI PORTB,2 ;окончание импульса ШИМ

reti

;таблица соответствия ASCII кода символу

ASCII_Numb:       .DB 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37

                              .DB 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46                   

Заключение

          Данный прибор на микроконтроллере отлажен в режиме симулятора и работает, однако создан он не был. Тем не менее, ничто не говорит в пользу того, что прибор не будет работать адекватно. Единственное ограничение – необходимое подключение микроконтроллера к порту RS-232 и прием данных. Если данные с этого порта приниматься не будут, микроконтроллер зависнет, т. к. будет ожидать, пока данные не отправятся.

          Для того чтобы увеличить точность прибора, необходимо взять другой микроконтроллер с большей разрядностью, т. к. разрядность ШИМ данного микроконтроллера очень невелика, хотя достаточна, предположим, для управления силовыми установками.

Список литературы

1.  Описание ATtiny2313 от разработчиков.