/Designs/dum/SW/2patra/2np/main.c
27,13 → 27,13
#use fast_io(J)
 
#define T_REVERS 5 // 5*256 ms = 1,25 s; pred prepnutim rele (zastaveni motoru a vybiti kondenzatoru)
#define T_START 1 // 256 ms; po prepnuti rele do sepnuti triaku
#define T_START 2 // 2*256 ms = 0,5 s; po prepnuti rele do sepnuti triaku
#define T_GO 117 // 117*256 ms = 30 s; max. beh rolety
#define T_GO_ZALUZIE 6 // cca 1,5 s; beh zaluzie (pouze na preklopeni lamel)
#define T_RECEIVE 10 // cca 2,6 s
#define ZAKMIT 2000 // pocet pruchodu hlavni smyckou pred opetovnou detekci prepnuti vypinace
 
#define OR106Z PIN_A0 // t1 Zaluzie trucovna zapad
#define OR106Z PIN_A0 // t1 Roleta trucovna zapad
#define OR110N PIN_A1 // t2 Zaluzie koupelna dole sever
#define OR104V PIN_A2 // t3 Roleta lab vychod
#define OR104J PIN_A3 // t4 Roleta lab jih
128,7 → 128,7
#define R202J 5
#define R204Z 6
 
typedef enum {UP, DOWN, REVERS_UP, REVERS_DOWN, RUN_UP, RUN_DOWN} relay_state;
typedef enum {UP, DOWN, REVERS_UP, REVERS_DOWN, RUN_UP, RUN_DOWN, RUN_UP_WAITING} relay_state;
relay_state relay; // Stavy rele
 
int8 timer_run; // Bezpecnostni casovac behu rolety
145,7 → 145,7
if(timer_revers>0) timer_revers--;
if(timer_start>0) timer_start--;
if(timer_run_zaluzie>0) timer_run_zaluzie--;
output_toggle(LED2);
//!!!output_toggle(LED2);
}
 
void stop_all() // Zastav vsechny rolety
168,72 → 168,70
if (rol[R204Z]==RUN) ON(OR204Z);
}
 
/*
void up(state *status, int8 *timer) // Zmena stavu rolety smer nahoru
void run(int8 roleta) // Spust konkretni roletu
{
switch (*status)
switch (roleta)
{
case STOP:
case GO_DOWN:
*status=REVERS_UP;
*timer=REVERS;
break;
case REVERS_UP:
case GO_UP:
*status=STOP;
*timer=0;
break;
case R103V: ON(OR103V); break;
case R110N: ON(OR110N); break;
case R104V: ON(OR104V); break;
case R104J: ON(OR104J); break;
case R207V: ON(OR207V); break;
case R202J: ON(OR202J); break;
case R204Z: ON(OR204Z); break;
}
}
 
void down(state *status, int8 *timer) // Zmena stavu rolety smer dolu
void up(int8 roleta) // Pozadavek, aby roleta jela nahoru
{
switch (*status)
if (rol[roleta]==RUN)
{
case STOP:
case GO_UP:
*status=REVERS_DOWN;
*timer=REVERS;
break;
case REVERS_DOWN:
case GO_DOWN:
*status=STOP;
*timer=0;
break;
rol[roleta]=STOP; // Roleta jela, tak zastav
}
else
{
if ((relay==DOWN)||(relay==RUN_DOWN)) // Rele je prepnuto na druhou stranu!
{
relay=REVERS_UP; // Reverzuj
timer_revers=T_REVERS; // Natahni casovac na vybiti kondenzatoru a reverz motoru
stop_all(); // Vsechno zastav
}
if (relay==RUN_UP)
{
run(R207V); // Jede se spravnym smerem, tak jenom pust roletu
}
 
rol[roleta]=RUN; // Roleta stala, tak ji pust
timer_run=T_GO; // Natahni bezpecnostni casovac
}
}
 
#define run(x) { \
switch(r##x) \
{ \
case STOP: \
OFF(OR##x##U); \
OFF(OR##x##D); \
break; \
case GO_UP: \
OFF(OR##x##D); \
ON(OR##x##U); \
if(tr##x==0) {r##x=STOP;} \
break; \
case GO_DOWN: \
OFF(OR##x##U); \
ON(OR##x##D); \
if(tr##x==0) {r##x=STOP;} \
break; \
case REVERS_UP: \
OFF(OR##x##U); \
OFF(OR##x##D); \
if(tr##x==0) {r##x=GO_UP; tr##x=GO;} \
break; \
case REVERS_DOWN: \
OFF(OR##x##U); \
OFF(OR##x##D); \
if(tr##x==0) {r##x=GO_DOWN; tr##x=GO;} \
break; \
} \
}
*/
 
void down(int8 roleta) // Pozadavek, aby roleta jela dolu
{
if (rol[roleta]==RUN)
{
rol[roleta]=STOP; // Roleta jela, tak zastav
}
else
{
if ((relay==UP)||(relay==RUN_UP)||(relay==RUN_UP_WAITING)) // Rele je prepnuto na druhou stranu!
{
relay=REVERS_DOWN; // Reverzuj
timer_revers=T_REVERS; // Natahni casovac na vybiti kondenzatoru a reverz motoru
stop_all(); // Vsechno zastav
}
if (relay==RUN_DOWN)
{
run(R207V); // Jede se spravnym smerem, tak jenom pust roletu
}
 
rol[roleta]=RUN; // Roleta stala, tak ji pust
timer_run=T_GO; // Natahni bezpecnostni casovac
}
}
 
 
void main()
{
char buf[10]; // Buffer pro prijem prikazu
265,15 → 263,8
output_e(0xFF);
stop_all();
 
timer_run=0; // Zastav vsechny casovace
timer=0;
timer_revers=0;
timer_start=0;
timer_run_zaluzie=0;
zakmity=0;
relay=RUN_UP_WAITING; // Rele je na zacatku vypnuto
 
relay=RUN_UP; // Rele je na zacatku vypnuto
 
{
int n;
301,12 → 292,19
s204AJ=IS204AJ;
r204ZD=IR204ZD;
r204ZU=IR204ZU;
CREN=0; CREN=1; // Reinitialise USART
timer_run=0; // Zastav vsechny casovace
timer=0;
timer_revers=0;
timer_start=0;
timer_run_zaluzie=0;
zakmity=0;
 
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
 
CREN=0; CREN=1; // Reinitialise USART
 
while(TRUE)
{
restart_wdt();
433,7 → 431,7
{
ON(OR207V); // Jede se spravnym smerem, tak jenom pust roletu
}
rol[R104V]=RUN; // Poznamenej, ze se jede, a natahni bezpecnostni casovac
rol[R207V]=RUN; // Poznamenej, ze se jede, a natahni bezpecnostni casovac
timer_run=T_GO;
}
zakmity=ZAKMIT;
449,7 → 447,7
}
else
{
if ((relay==UP)||(relay==RUN_UP))
if ((relay==UP)||(relay==RUN_UP)||(relay==RUN_UP_WAITING))
{
relay=REVERS_DOWN;
timer_revers=T_REVERS;
459,72 → 457,75
{
ON(OR207V);
}
rol[R104V]=RUN;
rol[R207V]=RUN;
timer_run=T_GO;
}
zakmity=ZAKMIT;
}
 
//!!! if(r202NU!=IR202NU) {r202NU=IR202NU; up(&r202J,&tr202J); zakmity=ZAKMIT;}
//!!! if(r202ND!=IR202ND) {r202ND=IR202ND; down(&r202J,&tr202J); zakmity=ZAKMIT;}
//!!! if(r204ZU!=IR204ZU) {r204ZU=IR204ZU; up(&r204Z,&tr204Z); zakmity=ZAKMIT;}
//!!! if(r204ZD!=IR204ZD) {r204ZD=IR204ZD; down(&r204Z,&tr204Z); zakmity=ZAKMIT;}
if(r207VU!=IR207VU) {r207VU=IR207VU; up(R207V); zakmity=ZAKMIT;}
if(r207VD!=IR207VD) {r207VD=IR207VD; down(R207V); zakmity=ZAKMIT;}
if(r202NU!=IR202NU) {r202NU=IR202NU; up(R202J); zakmity=ZAKMIT;}
if(r202ND!=IR202ND) {r202ND=IR202ND; down(R202J); zakmity=ZAKMIT;}
if(r204ZU!=IR204ZU) {r204ZU=IR204ZU; up(R204Z); zakmity=ZAKMIT;}
if(r204ZD!=IR204ZD) {r204ZD=IR204ZD; down(R204Z); zakmity=ZAKMIT;}
}
else zakmity--;
}
switch (relay)
{
case UP:
if (timer_start==0) // Rele prepnuto, muzeme sepnout triaky
{
relay=RUN_UP; // Zmen stav na "jede se"
run_all(); // Sepni triaky u rolet, ktere maji jet
timer_run=T_GO; // Natahni bezpecnostni casovac
}
break;
switch (relay)
{
case UP:
if (timer_start==0) // Rele prepnuto, muzeme sepnout triaky
{
relay=RUN_UP; // Zmen stav na "jede se"
run_all(); // Sepni triaky u rolet, ktere maji jet
timer_run=T_GO; // Natahni bezpecnostni casovac
}
break;
 
case DOWN:
if (timer_start==0) // Rele prepnuto, muzeme sepnout triaky
{
relay=RUN_DOWN; // Zmen stav na "jede se"
run_all(); // Sepni triaky u rolet, ktere maji jet
timer_run=T_GO; // Natahni bezpecnostni casovac
}
break;
case RUN_UP:
if (timer_run==0) // Vyprsel bezpecnostni casovac
{
stop_all(); // Vsechno zastav
}
break;
 
case RUN_DOWN:
if (timer_run==0) // Vyprsel bezpecnostni casovac
{
relay=REVERS_UP; // Vsechno zastav a reverzuj pro prepnuti rele do klidove polohy bez energizace civky
stop_all();
timer_revers=T_REVERS;
}
break;
case REVERS_UP:
if (timer_revers==0) // Uz se snad vybil kondenzator, muzeme reverzovat
{
relay=UP; // Prepni rele
OFF(RE);
timer_start=T_START; // Pockej na prepnuti rele
}
break;
 
case REVERS_DOWN:
if (timer_revers==0) // Uz se snad vybil kondenzator, muzeme reverzovat
{
relay=DOWN; // Prepni rele
ON(RE);
timer_start=T_START; // Pockej na prepnuti rele
}
break;
case DOWN:
if (timer_start==0) // Rele prepnuto, muzeme sepnout triaky
{
relay=RUN_DOWN; // Zmen stav na "jede se"
run_all(); // Sepni triaky u rolet, ktere maji jet
timer_run=T_GO; // Natahni bezpecnostni casovac
}
break;
case RUN_UP:
if (timer_run==0) // Vyprsel bezpecnostni casovac
{
timer=RUN_UP_WAITING;
stop_all(); // Vsechno zastav
}
break;
case RUN_DOWN:
if (timer_run==0) // Vyprsel bezpecnostni casovac
{
relay=REVERS_UP; // Vsechno zastav a reverzuj pro prepnuti rele do klidove polohy bez energizace civky
stop_all();
timer_revers=T_REVERS;
}
break;
case REVERS_UP:
if (timer_revers==0) // Uz se snad vybil kondenzator, muzeme reverzovat
{
relay=UP; // Prepni rele
OFF(RE);
timer_start=T_START; // Pockej na prepnuti rele
}
break;
case REVERS_DOWN:
if (timer_revers==0) // Uz se snad vybil kondenzator, muzeme reverzovat
{
relay=DOWN; // Prepni rele
ON(RE);
timer_start=T_START; // Pockej na prepnuti rele
}
break;
}
}
}