Код: Выделить всё
;***************************************************
;Автор
;Дата
;Версия
;Имя файла
;Для AVR:
;Тактовая частота 4МГЦ
;**************************************
; SUT =0 CKsel =1
;Выполняемые функции:
;
.device ATmega16
.Include "m16def.inc"
.List
;===================================
;Объявления:
.Def Temp =r16
.Def Gener =r17
.Def OnImpulsABC =r18
.Def CounterA =r19
.Def CounterB =r20
.Def CounterC =r21
.Def Alfa = r22
.Equ AlfaNach = 100
.Equ ConstGener = 180
.Equ OnA = 1
.Equ OnB = 2
.Equ OnC = 4
.Equ OffA = 6
.Equ OffB = 5
.Equ OffC = 3
;===================================
;Начало программы
.Cseg
.org LARGEBOOTSTART
jmp Init
.ORG OVF0AddR
Rjmp IntTimer0
.ORG OVF1AddR
Rjmp IntTimer1
.ORG OVF2AddR
Rjmp IntTimer2
.org AdccAddr
RJmp AdcDataOk
.Org ErdyAddr
RetI
.Org Int0Addr
; jmp Init
Rjmp Int_0
.Org Int1Addr
Rjmp Int_1
.Org Int2Addr
Rjmp Int_2
; НАЧАЛО ПРОЦЕДУР
;===================================
.Org $100
;инициализация чипа
;======================================================================
Init:
Ldi Temp,0
Out PortA,Temp
Ldi Temp,(1<<PA0)|(1<<PA1)|(1<<PA2) ;импульсные трансфораоры фаз А В С
Out DdrA, Temp ;направление порта A
Ldi Temp,(1<<PB2); прерывание от фазы С - INT 2
Out PortB,Temp
Ldi Temp,0
Out DdrB, Temp ;направление порта B
Ldi Temp,(1<<PC0) ;С0 - выход вкл пускаеля ON = "0"
Out PortC,Temp
Ldi Temp,(1<<PC0)
Out DdrC, Temp ;направление порта C Out24V
Ldi Temp,(1<<PD2)|(1<<PD3) ;прерывание от фазы A - INT 0 и от фазы B - INT 1
Out PortD,Temp
Ldi Temp,0
Out DdrD, Temp ;направление порта D
In Temp,Sfior
Cbr Temp,Pud
Out Sfior,Temp
Ldi Temp,(1<<WDE)|(1<<WDToe)
Ldi r17,16
Out Wdtcr,Temp ;сторожевой таймер
Out Wdtcr,r17
ldi Temp,low(RamEnd)
Out Spl,Temp ;указатель стёка
ldi Temp,high(RamEnd)
Out Sph,Temp ;указатель стёка
Ldi Temp,ConstGener
Out TcNt0,Temp ;регистр счета таймера 0
Ldi Temp,(0<<Cs02)|(0<<Cs01)|(1<<Cs00);1<<Cs00 выбрать предделитель таймера 1
Out Tccr0,Temp;
Ldi Temp,255
Out Tcnt1H,Temp;регистр счета таймера 1
Ldi Temp,100
Out Tcnt1L,Temp
Ldi Temp,(0<<Cs12)|(1<Cs11)|(1<<Cs10); выбрать предделитель таймера 1
Out Tccr1B,Temp ;регистр управления таймер 1
Ldi Temp,0
Out TcNt2,Temp ;регистр счета таймера 2
Ldi Temp,(1<<Toie0)|(1<<Toie1)|(0<<Toie2) ;прерывание таймера 0, таймера 1
Out Timsk,Temp ;регистр прерываний от таймеров
Ldi Temp,(1<<int1)|(1<<Int0)|(1<<Int2)
Out Gimsk,Temp ; рег разрешения внешних прерываний
; INT0 ПО СПАДУ INT1 ПО СПАДУ управление спящим режимом
Ldi Temp,(1<<ISC01)|(0<<Isc00)|(1<<Isc11)|(0<<Isc10) ;прерывание по Cпаду это начало полуволны
Out Mcucr,Temp ;Рег генерации внешних прерываний
Ldi Temp,(0<<ISC2);прерывание по Cпаду это начало полуволны
Out McucSr,Temp ;Рег генерации внешних прерываний
; асп привязоно к INT0
Ldi Temp,(1<<AdpS2)|(1<<AdpS1)|(0<<AdpS0)|(1<<AdIe)|(1<<AdEn)|(0<<AdSc)|(1<<ADate)
Out AdcSr,Temp
Ldi Temp,(0<<Mux3)|(1<<Mux2)|(1<<Mux1)|(0<<Mux0)|(0<<Refs1)|(1<<Refs0)|(0<<Adlar)
Out AdMux,Temp ; асп привязоно к INT0
Ldi Temp,(0<<AdTs2)|(1<<AdTs1)|(0<<AdTs0)
Out SfIor,Temp
SbI AdcSr,AdSc
Ldi Alfa,AlfaNach
Clr OnImpulsABC
Clr Zh ;счетчик для выдержки времени
CLr Zl
Clr Gener
Sei
;*********************************************************************
;*********************************************************************
;*********************************************************************
Loop:
Wdr ;сброс сторожевого таймера
;Проверяем если фаза А,В,С Проходит Через '0' что соответсвует PinD2 = 1, PinD3 = 1, PinB2 = 1
; то отключаем соответствующую фазу
Rjmp Loop
;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 0
IntTimer0:
Push Temp
In Temp,Sreg
Push Temp
Ldi Temp,ConstGener
Out TcNt0,Temp ;регистр счета таймера 0
SbiC PinD,PD2 ;A
AnDi OnImpulsABC,OffA
SbiC PinD,PD3 ;B
AnDi OnImpulsABC,OffB
SbiC PinB,PB2 ;C
AnDi OnImpulsABC,OffC
And Gener,OnImpulsABC
Eor Gener,OnImpulsABC
Out PortA,Gener
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 1
IntTimer1:
Push Temp
In Temp,Sreg
Push Temp
Ldi Temp,255
Out Tcnt1H,Temp;регистр счета таймера 1
Ldi Temp,100
Out Tcnt1L,Temp
Out PortC,OnImpulsABC
Cpi CounterA,0
BrEq TestFazeBC
Cpi CounterA,1
BrNe Desale_A
Ori OnImpulsABC,OnA
Desale_A:
Dec CounterA
TestFazeBC:
Cpi CounterB,0
BrEq TestFazeC
Cpi CounterB,1
BrNe Desale_B
Ori OnImpulsABC,OnB
Desale_B:
Dec CounterB
TestFazeC:
Cpi CounterC,0
BrEq ExitTimer1
Cpi CounterC,1
BrNe Desale_C
Ori OnImpulsABC,OnC
Desale_C:
Dec CounterC
ExitTimer1:
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;===================================
;ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 2
IntTimer2:
Push Temp
In Temp,Sreg
Push Temp
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;===================================
;ПРЕРЫВАНИЯ синхронизация фаза А
Int_0:
Push Temp
In Temp,Sreg
Push Temp
Mov CounterA,Alfa
AndI OnImpulsABC,OffA
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;ПРЕРЫВАНИЯ синхронизация фаза В
Int_1:
Push Temp
In Temp,Sreg
Push Temp
Mov CounterB,Alfa
AndI OnImpulsABC,OffB
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;ПРЕРЫВАНИЯ синхронизация фаза С
Int_2:
Push Temp
In Temp,Sreg
Push Temp
Mov CounterC,Alfa
AndI OnImpulsABC,OffC
Pop Temp
Out Sreg,Temp
Pop Temp
RetI
;===================================
;ПРЕРЫВАНИЯ ОТ АСП ПО ПРЕОБРАЗОВАНИЮ
AdcDataOk:
Push Temp
In Temp,Sreg
Push Temp
In Alfa,Adcl
In Temp,Adch
Clc
Ror Temp
Ror Alfa
Ror Temp
Ror Alfa ; код АСП
Ser Temp
Eor Alfa,Temp
Pop Temp
Out Sreg,Temp
Pop Temp
RetI