/********************************************* Project : SPS Betriebssystem auf STK200 Version : 1 Date : 20.01.2004 Author : Schweinester Josef Company : ETS Comments: Chip type : AT90S2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *********************************************/ #include <90s2313.h> #include #define Tog_PA(Pos) PORTA ^= (1 << Pos) // toggle Portpin #define Tog_PB(Pos) PORTB ^= (1 < 0) Byte |= (1<< Pos); else Byte &= ~(1< 0) Byte |= (1<< Pos); //Merker setzen falls VK = 1 #define RM(Byte,Pos) if (VK > 0) Byte &= ~(1< 0) Byte &= ~(1< 0 && VKH > 0) VK = 1; else VK = 0;//Verundung mit VK #define UN(Byte,Pos) VKH = !(Byte & (1 << Pos)) ; if (VK > 0 && VKH > 0) VK = 1; else VK = 0;//Verundung mit VK #define O(Byte,Pos) VKH = (Byte & (1 << Pos)) ; if (VK > 0 || VKH > 0) VK = 1; else VK = 0;//Veroderung mit VK #define ON(Byte,Pos) VKH = !(Byte & (1 << Pos)) ; if (VK > 0 || VKH > 0) VK = 1; else VK = 0;//Veroderung mit VK #define CP(Byte,Byte1) if (Byte == Byte1 ) VK = 1;else VK = 0; //2 Bytes vergleichen #define ST(Byte,Byte1) if (VK > 0) Byte = Byte1; //Timer laden mit Zeitwert #define SW(Byte,Pos) if (VK == 0) Clr_Char(Byte,Pos); else {VKH = (Byte & (1 << Pos)); if (VKH == 0) Set_Char(Byte,Pos); else VK = 0;} #define COM() if (VK > 0) VK = 0 ; else VK = 1 ; #define TOG(Byte,Pos) SW(TGBIT,Pos); if (VK > 0) Tog_Char(Byte,Pos) ; //Stromstoßschalter char VK, VKH; //Verknüpfungsspeicher und Hilfverknüpfungsspeicher unsigned char E0, A0, M0, SM0,W0,TGBIT,TG ; //Ein-Ausgänge , Merker,Sondermerker,Wischer,Toggler unsigned Temp1,Temp2; //Temporäres Sicherungsbyte char T1,T2,T3,T4; //Timer T1 +2 = 100ms, T3 +4 = 1 sec char Presc1,Presc2; //Timervorteiler void Reset (void); //Resetroutine void SPS_Code (void); //SPS Anwendercode //************************** Timer 0 overflow interrupt service routine ***alle 4 ms************************ interrupt [TIM0_OVF] void timer0_ovf_isr(void) { Presc1++; if ( Presc1 >= 24) //100 ms { Tog_Char (SM0,0) ; //Sondermerker if (T1 > 0) T1--; if (T2 > 0) T2--; Presc1 = 0; } Presc2++; if (Presc2 >= 245) //1 sec. { Tog_Char (SM0,1) ; //Sondermerker sec if (T3 > 0) T3--; if (T4 > 0) T4--; Presc2 = 0; } } //**************************************************************************************** void Reset (void) { DDRB=0xFF; PORTB = 0xFF; PORTD=0xff; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 62,500 kHz TCCR0=0x03; TCNT0=0x00; GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; ACSR=0x80; #asm("sei") } //*********************** Main *************************************************** void main(void) { Reset (); //Reset aufrufen while (1) { Temp1 = PIND; //Eingänge 2x einlesen und verunden = entprellen delay_ms (30); Temp2 = PIND; //Eingänge einlesen und entprellen Temp1 = (Temp1 & Temp2); E0 = ~ Temp1; //Eingange einlesen und entprellen SPS_Code(); //SPS Code einlesen PORTB = ~A0; //Ausgänge setzen ,neg logik // delay_ms (200); } } //*********************************SPS Anwendercode******************************************* void SPS_Code (void) { LN (M0,0); //Einschaltverzögerung SW (W0,6); //Timer nur einmal laden ST (T1,30); //Timer1 mit 30 laden (30 x 100ms) CP (T1,0); //Timer1 auf 0 abfragen SM (M0,0); //Merker setzen falls Timer abgelaufen L (M0,0); //Merker laden SA (A0,5); //Ausgang 5 setzen,wenn Timer abgelaufen ist L (E0,0); //Stromstoßschalter TOG (TG,0); L (TG,0); SA (A0,1); L (E0,1); //Stromstoßschalter TOG (TG,1); L (TG,1); SA (A0,2); L (SM0,1); //Blinkmerker 1000 ms SA (A0,3) ; //Wechselbinklicht COM () ; //VK negieren SA (A0,4) ; } //***************************************************************************************