diff options
Diffstat (limited to 'rs422lib/main.c')
-rw-r--r-- | rs422lib/main.c | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/rs422lib/main.c b/rs422lib/main.c index 2a2517f..34cb03e 100644 --- a/rs422lib/main.c +++ b/rs422lib/main.c @@ -4,6 +4,7 @@ #include"sysctl.h" int cnt=0; +int cnt2=0; void port_init(void) { @@ -13,7 +14,52 @@ void port_init(void) void received(unsigned char* str,unsigned int len) { - rsbus_w(0,str,len); + unsigned char ch; + switch (str[0]) + { + case 1:// start + if (!MSTATE) + { + SWITCH_STATE(ST_RUN); + cnt2=0; + STATE(0)=0; + SYSCALL(TEST); + } + RETSTATE; + break; + case 2:// Get Res + if (MSTATE&ST_RUN) + { + ch=(unsigned char)(cnt2-STATE(0)); + rsbus_w(0,&ch,1); + } + else + if (MSTATE&ST_RES) + { + SWITCH_STATE(ST_REST); + ch=(unsigned char)(cnt2); + rsbus_w(0,&ch,1); + } + else + RETSTATE; + break; + case 3:// Stop + if (MSTATE&ST_RUN) + { + SWITCH_STATE(ST_REST); + SYSSTOP(TEST); + } + RETSTATE; + break; + case 4:// Block + if (!MSTATE) + { + cnt2=0; + SWITCH_STATE(ST_BUSY); + } + RETSTATE; + } + //rsbus_w(0,str,len); } // Timer A0 interrupt service routine @@ -24,13 +70,19 @@ __interrupt void Timer_A0 (void) if (cnt==25) { STATE(0)=(STATE(0)+1)&0xFF; + if ((MSTATE&ST_BUSY) && !(MSTATE&ST_RES)) + { + ++cnt2; + if (STATE(0)>200) + SWITCH_STATE(ST_BUSY|ST_RES); + } cnt=0; P1OUT^=BIT6; } } //TIMER A0 initialize - -// desired value: 5ms +// desired value: 40ms void TimerA0_Init(void) { // Configure TimerA0 @@ -60,9 +112,20 @@ void init_devices(void) _BIS_SR(GIE); } +// Clock tick using cycle estimation +void basic_running_ex() +{ + int i; + for (i=950;i>0;--i) + delay_ms(1); + ++cnt2; + SYSCALL(TEST); +} + void main(void) { init_devices(); + sysctl_reghdlr(TEST,basic_running_ex); while(1) sysroutine(); } |