/** comp_02_hupertz ==================================================================== * Hupertz, Manuel | ITA 05 | 2007-10-28 | Platz 11 * ====================================================================================== * * ==Beschreibung: ====================================================================== * Leistungssteuerung mit der Compare-Funktion von Timer 2 * 50% Puls-Pause * * Taster an P1.0 low-aktiv, Wirkung beim Loslassen: ~~~~~~~\_/ * Last an P1.2 high-aktiv, EIN: _/~~\__/~~\__/~~\_, AUS: ________ * * ==Funktion: ========================================================================== * Simulator: EIN / AUS funktioniert - 0,5s-Grenze noch nicht implementiert * Hardware: noch nicht getestet * ====================================================================================== */ /******************************** Quelltextdateien ************************************/ #include /**************************** Adress-Spezifikationen **********************************/ //sbit P1_0 = P1^0; //Taster zum Starten / Stoppen (Öffner) //sbit P1_2 = P1^2; //Last (Lampe) /********************************** Konstanten ****************************************/ //#define ENTER 0x0D //statischer Wert für zOverflow: #define ZOV 0x10000L //L := long //Variablentyp boolean in C: typedef int bool; #define TRUE (1) #define FALSE (0) /******************************** globale Variablen ***********************************/ //Timer-Startwert: static unsigned int ZSTART = ZOV-10*833; //833 := trun = 0,5ms / 833*10 := 5ms / 200Hz //zstart = zov-(zov-trun/tclock), tclock = 6/fosc = 0,6µs //zstart = 65536-(65536-5ms/0,6µs) //Comparewert (833*5 := 2,5ms / 100Hz - 50% Ausgangsleistung): static unsigned int ZCOMPARE = ZOV-5*833; bool isOn; //Last, TRUE: Last EIN / FALSE: Last AUS bool isDown = FALSE; //Taster, TRUE: Taster gedrückt, LOW-Signal //FALSE: Taster nicht gedrückt, HIGH-Signal unsigned int count = 0; unsigned int stopp1 = 0; unsigned int stopp2 = 0; /****************************** Funktionsdeklarationen ********************************/ void main (void); //Haupt-Funktion void initialize_seriell (void); //Initialisiert die serielle Schnittstelle void putchar (char ch); //benötigt für andere Funktionen void printstring (char *p); //Text ausgeben //void printuchar(unsigned char byte); //nicht benötigt //char getchar(void); //nicht benötigt void initialize_p10 (void); //Initialisiert P1.0 void initialize_timer2 (void); //Initialisiert timer2 //void p10_int (void); void timer2_int (void); /******************************** Hauptprogramm ***************************************/ void main (void) { //Serielle Schnittstelle initialisieren: if (BD == 0) initialize_seriell(); //Timer 2 / P1.0-Interrupt initialisieren: initialize_p10(); initialize_timer2(); //Interrupt-Logik des Controllers aktivieren: EAL = 1; //Ausgabe des Titels etc.: printstring("comp_02_hupertz.c"); printstring("\n\nHupertz\nITA 05\n29.10.2007\n\n\n"); //Überschrift: printstring("Beschreibung:\nLeistungssteuerung mit der Compare-Funktion\nvon Timer 2\n50% Puls-Pause\n\n"); //Endlosschleife: while (TRUE) { } } /*------------------------------------------------------------------------------------ */ void initialize_seriell (void) { SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr. PCON |= 0x80; //SMOD Bit setzen. SRELH = 0x03; //9600 baud @ 10MHz für C515C. SRELL = 0xBF; BD = 1; //Baudratengenerator verwenden. TI = 1; //vorausgegangenes Transmit beendet. } //-------------------------------------------------------------------------------------*/ void putchar (char ch) { while(TI == 0); // voriges Transmit Ende abwarten TI=0; // für nächste Übertragung löschen SBUF=ch; // Byte seriell senden } //-------------------------------------------------------------------------------------*/ void printstring (char *ptext) { while(*ptext != '\0') { putchar(*ptext); ptext++; } } /*-------------------------------------------------------------------------------------*/ /* char getchar (void) { char cget; do{ while(RI == 0); //Receive Ende abwarten ==> empfangenes Zeichen komplett. cget=SBUF; //seriell eingelesenes Byte in Variable speichern. RI=0; //bereit zum Einlesen des nächsten Zeichens. }while(cget==0x11); //PC (Keil-Umgebung) sendet regelmäßig 0x11 --> unterdrücken. return(cget); } */ /*-------------------------------------------------------------------------------------*/ /* void printuchar (unsigned char byte){ unsigned char h, z, e; h = byte / 100; z = byte / 10 % 10; e = byte % 10; putchar(h + 0x30); putchar(z + 0x30); putchar(e + 0x30); } */ /*-------------------------------------------------------------------------------------*/ void initialize_timer2 (void){ ET2 = 1; //Konfiguration 'timer 2 control register': T2CON = 0x51; //U.A. Interruptansteuerung P1.0 über positive Flanke. //Konfiguration des C/C-Register 2 (0x20h = 00100000b): CCEN = 0x20; //Setzen von Timer / Reload / Compare-Wert: TL2 = ZSTART; TH2 = ZSTART >> 8; CRCL = ZSTART; CRCH = ZSTART >> 8; CCL2 = ZCOMPARE; CCH2 = ZCOMPARE >> 8; } /*-------------------------------------------------------------------------------------*/ void initialize_p10 (void){ EX3 = 1; //Interrupt-Freigabe P1.0. IEX3 = 0; //Overflow-Flag von P1.0 löschen. } /*-------------------------------------------------------------------------------------*/ void p10_int (void) interrupt 10 { IEX3 = 0; if (!isDown) { isDown = TRUE; T2CON = 0x11; stopp1 = count; } else { isDown = FALSE; T2CON = 0x51; stopp2 = count; stopp2 -= stopp1; if (isOn) //Wenn Last momentan EIN. { CCEN = 0; //Compare Register 2 AUS. isOn = FALSE; //Last AUS. printstring("Last AUS.\n"); } else //Wenn Last momentan AUS. { CCEN=0x20; //Compare Register 2 EIN. isOn = TRUE; //Last EIN. printstring("Last EIN.\n"); } } //int stopp2 = timerbla; } /*-------------------------------------------------------------------------------------*/ void timer2_int (void) interrupt 5 { if (count <= 999) count++; else count = 1; /* //Overflow Flag loeschen: TF2 = 0; //10ms * 50 = 0.5s if (count == 50) { //count zurücksetzen count = 0; //Meldung an P1.4 P1_4 = 0; }*/ } /*-------------------------------------------------------------------------------------*/