.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 от разработчиков.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.