Микропрограммы написаны на ELPROG PASCAL. Компилятор очень старый. Но зато бесплатный, т.е. написанные на нем программы можно публиковать. Скачать можно здесь -
http://www.geocities.com/SiliconValley/Campus/9592/index.html . Текст есть и в прицепе
Тексты микропрограмм ниже –
PROGRAM TAL_MOUNT_PULT;
(* $C+ *)
{ Standard predefinitions for AT89C51 hardware. }
(* work version without powersave mode*)
CONST
(* 100 FOR 1 MC *)
DECSPEEDSLOW=5000;
DECSPEEDHIGH=250;
FOCUSERSPEEDSLOW=5000;
FOCUSERSPEEDHIGH=250;
var
R0 AT $08 : INTERNAL BYTE;
P0 at $80 : internal byte; { Port P0 }
P1 at $90 : internal byte; { Port P1 }
P2 at $A0 : internal byte; { Port P2 }
P3 at $B0 : internal byte; { Port P3 }
IP at $B8 : internal byte; { Interrupt Priority Control }
IE at $A8 : internal byte; { Interrupt Enable Control }
TMOD at $89 : internal byte; { Timer/Counter Mode Control }
M00 at $89 : INTERNAL BIT;
M01 AT $8A : INTERNAL BIT;
CT0 AT $8B : INTERNAL BIT;
GATE0 AT $8C : INTERNAL BIT;
TCON at $88 : internal byte; { Timer/Counter Control }
p10 at $90 : internal bit;
p11 at $91 : internal bit;
p12 at $92 : internal bit;
p13 at $93 : internal bit;
p14 at $94 : internal bit;
p15 at $95 : internal bit;
p16 at $96 : internal bit;
p17 at $97 : internal bit;
p20 at $A0 : internal bit;
RS at $A1 : internal bit;
RW at $A2 : internal bit;
E at $A3 : internal bit;
p24 at $A4 : internal bit;
p25 at $A5 : internal bit;
p26 at $A6 : internal bit;
p27 at $A7 : internal bit;
TH0 at $8C : internal byte; { Timer/Counter 0 High Byte }
TL0 at $8A : internal byte; { Timer/Counter 0 Low Byte }
TH1 at $8D : internal byte; { Timer/Counter 1 High Byte }
TL1 at $8B : internal byte; { Timer/Counter 1 Low Byte }
SCON at $98 : internal byte; { Serial Control }
SBUF at $99 : internal byte; { Serial Date Buffer }
PCON at $87 : internal byte; { Power Control }
B at $F0 : internal byte; {register b}
ACC at $E0 : internal byte; {accumulator}
PSW at $D0 : internal byte; {program status word}
SP at $81 : internal byte; {stack pointer}
DPH at $82 : internal byte;
DPL at $83 : internal byte;
(* Bit addressable variable *)
EA at $AF : bit; { Enable or disables all interrupt }
ES at $AC : bit; { Enable or disable serial port interrupt }
ET1 at $AB : bit; { Enable or disable Timer1 overflow interrupt }
EX1 at $AA : bit; { Enable or disable External Interrupt 1 }
ET0 at $A9 : bit; { Enable or disable Timer0 overflow interrupt }
EX0 at $A8 : bit; { Enable or disable External interrupt 0 }
(* IP Bits *)
PS at $BC : bit; { Defines the Serial Port interrupt priority level }
PT1 at $BB : bit; { Defines the Timer 1 interrupt priority level }
PX1 at $BA : bit; { Defines the External Interrupt 1 priority level }
PT0 at $B9 : bit; { Defines the Timer 0 interrupt priority level }
PX0 at $B8 : bit; { Defines the External Interrupt 0 priority level }
(* TCON Bits *)
TF1 at $8F : bit; { Timer 1 overflow flag }
TR1 at $8E : bit; { Timer 1 run control bit }
TF0 at $8D : bit; { Timer 0 overflow flag }
TR0 at $8C : bit; { Timer 0 run control bit }
IE1 at $8B : bit; { Exteranl Interrupt 1 edge flag }
IT1 at $8A : bit; { Interrupt 1 type control bit }
IE0 at $89 : bit; { External Interrupt 0 edge flag }
IT0 at $88 : bit; { Interrupt 0 type control bit }
(* SCON Bits *)
SM0 at $9F : bit; { Serial Port mode specifier }
SM1 at $9E : bit; { Serial Port mode specifier }
SM2 at $9D : bit; { Multi/Single Processor Enviropment }
REN at $9C : bit; { Enable/Disable reception }
TB8 at $9B : bit; { 9th bit for transfering in Mode 2,3 }
RB8 at $9A : bit; { 9th bit, received in Mode 2,3 }
TI at $99 : bit; { Transmit interrupt flag }
RI at $98 : bit; { Receive interrupt flag }
{----------------------------------------------------}
P37 AT $B7 : INTERNAL BIT;
lowfrq, highfrq, KEYCODE, KEYCODE1 : internal byte;
fokuser_step_counter:internal byte;
DEC_STEP_COUNTER : INTERNAL BYTE;
I: INTERNAL WORD;
deccounter,focusercounter,FOCUSERSPEED: INTERNAL WORD;
DECSPEED: INTERNAL WORD;
DEC_CLOCKWISE,fokuser_clockwise:internal boolean;
PROCEDURE WAITFOK;
BEGIN
FOR I:=1 TO FOCUSERSPEED DO;
END;
PROCEDURE WAITDEC;
BEGIN
FOR i:=1 TO DECSPEED DO;
END;
PROCEDURE WAITKEY;
BEGIN
FOR i:=1 TO 100 DO;
END;
interrupt procedure (TIMER0);
(* telescope main motor driver *)
begin
TR0:=0; (* disable count *)
TF0:=0; (* reset overflow bit *)
TL0:=lowfrq;
TH0:=highfrq;(* timer data*)
P37:=NOT P37; (* generator clock *)
TR0:=1; (* timer pusk *)
(*_________________________________________________*)
IF (((KEYCODE AND 4)=0) or ((keycode and
=0)) then
BEGIN
if deccounter<700 then deccounter:=deccounter+1;
END;
IF (((KEYCODE AND 4)=4) and ((keycode and
=8)) then
BEGIN
deccounter:=1;
END;
if deccounter=700 then decspeed:=decspeedhigh
else decspeed:=decspeedslow;
IF (((KEYCODE AND 16)=0) or ((keycode and 32)=0)) then
BEGIN
if FOCUSERcounter<700 then FOCUSERcounter:=FOCUSERcounter+1;
END;
IF (((KEYCODE AND 16)=16) and ((keycode and 32)=32)) then
BEGIN
FOCUSERcounter:=1;
END;
if FOCUSERcounter=700 then FOCUSERspeed:=FOCUSERspeedhigh
else FOCUSERspeed:=FOCUSERspeedslow;
(*_________________________________________________*)
END;
PROCEDURE TIMER_SET_UP;
BEGIN
TMOD:=1;
(*GATE0:=0; internal pusk by tr0
CT0:=0; count from internal generator
M00:=1; 16 bit mode
M01:=0; 16 bit mode *)
PT0:=1; (* timer 0 high priority interrupt level *)
TL0:=lowfrq;
TH0:=highfrq; (* timer data *)
ET0:=1; (* enable timer0 interrupt *)
TR0:=1; (* timer pusk *)
END;
PROCEDURE TWO_FASE_FOCUSER_FULL_STEP;
BEGIN
if fokuser_clockwise then
begin
if fokuser_step_counter<4 then fokuser_step_counter:=fokuser_step_counter+1
else fokuser_step_counter:=1;
end
else
begin
if fokuser_step_counter>1 then fokuser_step_counter:=fokuser_step_counter-1
else fokuser_step_counter:=4;
end;
case fokuser_step_counter of
1:begin P10:=1; P11:=0; P12:=1; P13:=0; WAITFOK; end;
2:begin P10:=0; P11:=1; P12:=1; P13:=0; WAITFOK; end;
3:begin P10:=0; P11:=1; P12:=0; P13:=1; WAITFOK; end;
4:begin P10:=1; P11:=0; P12:=0; P13:=1; WAITFOK; end;
end;(*of case*)
END;
PROCEDURE TWO_FASE_DEC_FULL_STEP;
BEGIN
if DEC_clockwise then
begin
if DEC_step_counter<4 then DEC_step_counter:=DEC_step_counter+1
else DEC_step_counter:=1;
end
else
begin
if DEC_step_counter>1 then DEC_step_counter:=DEC_step_counter-1
else DEC_step_counter:=4;
end;
case DEC_step_counter of
1:begin P14:=1; P15:=0; P16:=1; P17:=0; WAITDEC; end;
2:begin P14:=0; P15:=1; P16:=1; P17:=0; WAITDEC; end;
3:begin P14:=0; P15:=1; P16:=0; P17:=1; WAITDEC; end;
4:begin P14:=1; P15:=0; P16:=0; P17:=1; WAITDEC; end;
end;(*of case*)
END;
BEGIN (*MAIN*)
ES:=0; { disable serial port interrupt }
ET1:=0; { disable Timer1 overflow interrupt }
EX1:=0; { disable External Interrupt 1 }
ET0:=0; { disable Timer0 overflow interrupt }
EX0:=0; { disable External interrupt 0 }
EA:=1; (* INTERRUPT ENABLE *)
P1:=$AA; (* SET FAZE *)
P3:=$FF; (* PORT3 INPUT *)
lowfrq:=$3D;
higHfrq:=$D9; (* TIMER - 50.13 HZ *)
fokuser_step_counter:=1;
DEC_STEP_COUNTER:=1;
DECSPEED:=DECSPEEDSLOW;
FOCUSERSPEED:=FOCUSERSPEEDSLOW;
TIMER_SET_UP;
repeat
KEYCODE:=P3;
KEYCODE:=P3 AND $3F;
WAITKEY;
KEYCODE1:=P3;
KEYCODE1:=KEYCODE1 AND $3F;
IF (KEYCODE=KEYCODE1) THEN (* CHECK DEBOUNCE *)
BEGIN (* KEY DESHIFRATOR *)
IF (((KEYCODE AND 1)=1) AND ((KEYCODE AND 2)=2)) THEN
BEGIN
LOWFRQ:=$3D;
HIGHFRQ:=$D9;
END; (* TIMER - 50 HZ D8EF, 50.13 hz with correction d93D *)
IF ((KEYCODE AND $1)=0) THEN
BEGIN
LOWFRQ:=$2B;
HIGHFRQ:=$CF; (* TIMER - 40 HZ CF2B *)
END;
IF ((KEYCODE AND $2)=0) THEN
BEGIN
LOWFRQ:=$7B;
HIGHFRQ:=$E1; (* TIMER - 64 HZ E17B *)
END;
IF (((KEYCODE AND 4)=0) AND ((KEYCODE AND
=8)) THEN
BEGIN
DEC_CLOCKWISE:=TRUE;
TWO_FASE_DEC_FULL_STEP;
END; (* declination step forward *)
IF (((KEYCODE AND
=0) AND ((KEYCODE AND 4)=4)) THEN
BEGIN
DEC_CLOCKWISE:=FALSE;
TWO_FASE_DEC_FULL_STEP;
END; (* declination step BACK *)
IF (((KEYCODE AND 16)=0) AND ((KEYCODE AND 32)=32)) THEN
BEGIN
fokuser_clockwise:=true;
TWO_FASE_FOCUSER_FULL_STEP;
END; (* FOCUSER step forward *)
IF (((KEYCODE AND 32)=0) AND ((KEYCODE AND 16)=16)) THEN
BEGIN
fokuser_clockwise:=false;
TWO_FASE_FOCUSER_FULL_STEP;
END; (* FOCUSER step BACK *)
END;(* KEY DESHIFRATOR *)
UNTIL FALSE;
end.