Semafor w wykonaniu Michała …

Czym jest semafor?

Semafor jest to pociągowy sygnalizator kolejowy.

W czym został wykonany?

Projekt modelu został wykonany w Inventorze, natomiast sterowanie w C++.

Główny kod programu 🙂

#include „def.h”
#include <avr/interrupt.h>
#include <stdbool.h>

int p0=1;// pragram pracy SBL/SP
int p1=2;//nadawany sygnał
int clk=0;//zegar zewnętrzny
int dl0=0, dl1=0;//szyny danych
volatile int m=0;
volatile int n=0;
volatile int t=0;
bool z;
int x;
int main(void)
{
DDRA &= ~(DL0|DL1|SEL); //wejscia
PORTA |= (DL0|DL1|SEL);
DDRA |= (OUT|CLK|K1|K2|K3);//wyjscia
PORTA &= ~(OUT|CLK|K1|K2|K3);

TCCR0A |=(1<<WGM01); //tryb ctc
TCCR0B |=(1<<CS00|1<<CS02);//preskaler 1024
OCR0A = 18;
OCR0B = 18;//rejestr porównawczy
TIMSK0 |=(1<<OCIE0A);//zezwolenie na przerwania

sei();

for(x=0;x<2;x++)//sygnalizacja rozruchu(2x włącz, wyłącz wszyskie lampy)
{
pinset(1,K1);
pinset(1,K2);
pinset(1,K3);
_delay_ms(300);
pinset(0,K1);
pinset(0,K2);
pinset(0,K3);
_delay_ms(300);
}
while(1)//główny program
{
if(n==1)
{
if (pinsig(SEL)) p0=0;//odczyt trybu pracy
else p0=1;
if (pinsig(DL0)) dl0=1;//odczyt szyny 0
else dl0=0;
if (pinsig(DL1)) dl1=1;//odczyt szyny 1
else dl1=0;
if ((dl0==0) && (dl1==0)) p1=0;//dla sygnałów S1 i Sp1
if ((dl0==0) && (dl1==1)) p1=1;//dla sygnałów S2 i Sp2
if ((dl0==1) && (dl1==0)) p1=2;//dla sygnałów S3 i Sp3
if ((dl0==1) && (dl1==1)) p1=3;//dla sygnałów S5 i Sp4
}
switch (p0)
{
case 1://semafor powtarzający
{
switch (p1)
{
case 0://sygnał Sp1
{
pinset(1,K1);
pinset(0,K2);
pinset(1,K3);
break;
}
case 1://sygnał Sp2
{
pinset(1,K1);
pinset(1,K2);
pinset(0,K3);
break;
}
case 2://sygnał Sp3
{
pinset(1,K1);
if (m==1)pinset(1,K2);
if (m==0)pinset(0,K2);
pinset(0,K3);
break;
}
case 3://sygnał Sp4
{
pinset(1,K1);
pinset(0,K2);
if (m==1)pinset(1,K3);
if (m==0)pinset(0,K3);
break;
}
}
break;
}
case 0://SBL
{
switch (p1)
{
case 0://sygnał S1
{
pinset(0,K1);
pinset(1,K2);
pinset(0,K3);
break;
}
case 1: //sygnał S2
{
pinset(0,K1);
pinset(0,K2);
pinset(1,K3);
break;
}
case 2://sygnał S3
{
pinset(0,K1);
pinset(0,K2);
if (m==1)pinset(1,K3);
if (m==0)pinset(0,K3);
break;
}
case 3://sygnał S5
{
pinset(1,K1);
pinset(0,K2);
pinset(0,K3);
break;
}
}
break;
}
}
}

}

ISR(TIM0_COMPA_vect)//przerwanie ok 50Hz
{
t++;
n++;
if (t==90)
{
t=0;
m++;
pinset(0,CLK);
}
if (t==50) pinset(1,CLK);//sygnał zegara
if (m==2)m=0;// pulsowanie lamp
if (n==10)n=0;
}

drukuj