#include #include "lcd.h" #include #include "delay.h" #define BN RA0 // Winding A #define AN RA2 // Winding A/ #define A RA3 // Winding B #define B RA1 // Winding B/ #define CL RB0 // Close push button #define OP RB1 // Open push button #define CI RB2 // Close indicator led #define OI RB3 // Open indicator led #define CLS RB6 // Close limit switch #define OLS RB7 // Open limit switch __CONFIG(WDTDIS & XT & PWRTEN) ; int time2; int blink; unsigned char ch; unsigned char pos; unsigned char speed; bit OPF; bit CLF; //------ interrupts handling ------------------------------------- void interrupt tc_int(void) { if(T0IF) // Timer0 interrupt { T0IF=0; // clear interrupt bit if(time2>0) --time2; //TMR0=0x00; // Adjust TMR0 overrun to 256*0,2e-6*8= 0,4096ms } } //---------------------------------------------------------------- void Read(void); void initialize(void); void Open(void); void Close(void); void Openstepping(void); void Closestepping(void); void Indicate(unsigned char ch); void Positionindication(unsigned char pos ); void Toggle(void); #define t1 22 // timer 0 12 x 0.4096 ms = 0,4915ms time2=t1; void main(void) { initialize(); while(1) { if (time2==0)Read(); if((OPF==1)&&(OLS==0)) { pos=0; Positionindication (pos); } if((CLF==1)&&(CLS==0)) { pos=1; Positionindication (pos); } if (OPF==1) Openstepping(); if (CLF==1) Closestepping(); A=0; B=0; AN=0; BN=0; } } void Openstepping() { OPF=0; CLF=0; speed=3; while (OLS==1) { if(CLF==1) { CLF=0; break; } if (time2==0)Read(); ch=0; Open(); Indicate(ch); //if(OPF==1)Toggle(); } OI=0; } void Closestepping() { speed= 3; while (CLS==1) { if (OPF==1) { OPF=0; break; } if (time2==0)Read(); ch=1; Close(); Indicate(ch); //if(CLF==1)Toggle(); } CI=0; } void Read() { GIE=0; OPF=OP; CLF=CL; time2=t1; GIE=1; } void Open() { GIE=0; // ---FullStep0 A=1; BN=0; AN=0; B=1; DelayMs(speed); // ---FullStep1 A=0; BN=0; AN=1; B=1; DelayMs(speed); // ---FullStep2 A=0; BN=1; AN=1; B=0; DelayMs(speed); // ---FullStep3 A=1; BN=1; AN=0; B=0; DelayMs(speed); GIE=1; } void Close() { GIE=0; // ---FullStep3 A=1; BN=1; AN=0; B=0; DelayMs(speed); // ---FullStep2 A=0; BN=1; AN=1; B=0; DelayMs(speed); // ---FullStep1 A=0; BN=0; AN=1; B=1; DelayMs(speed); // ---FullStep0 A=1; BN=0; AN=0; B=1; DelayMs(speed); GIE=1; } void Indicate(unsigned char c) { if((c==1)&&(blink==0)) CI^=1; if((c==0)&&(blink==0)) OI^=1; if(blink<50) blink++; else blink=0; } void Positionindication(unsigned char pos) { if(pos==1) { CI=1; DelayMs(200); DelayMs(200); CI=0; } if(pos==0) { OI=1; DelayMs(200); DelayMs(200); OI=0; } } void Toggle() { GIE=0; OPF=0; CLF=0; if (speed==3) speed=5; else if (speed==5) speed=3; GIE=1; } void initialize() { TRISA=0b00000; // RA0-RA4 output TRISB=0b11110011; // RB 0-1 & 4-7 are inputs, RB2-3 outputs GIE=1; // enable interrupts INTE=0; RBIE=0; EEIE=0; T0CS = 0; // Timer increments on instruction clock T0IE = 1; // Enable interrupt on TMR0 overflow PSA=0; // Assign Prescaler to Timer0 PS0=0; // Prescaler bits (1:8) PS1=1; PS2=0; RBPU=1; // Weak RB pull-up }