rendered paste body/** 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 <reg515c.h>/**************************** 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 AUSbool isDown = FALSE; //Taster, TRUE: Taster gedrückt, LOW-Signal //FALSE: Taster nicht gedrückt, HIGH-Signalunsigned int count = 0;unsigned int stopp1 = 0;unsigned int stopp2 = 0;/****************************** Funktionsdeklarationen ********************************/void main (void); //Haupt-Funktionvoid initialize_seriell (void); //Initialisiert die serielle Schnittstellevoid putchar (char ch); //benötigt für andere Funktionenvoid printstring (char *p); //Text ausgeben//void printuchar(unsigned char byte); //nicht benötigt//char getchar(void); //nicht benötigtvoid initialize_p10 (void); //Initialisiert P1.0void 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; }*/} /*-------------------------------------------------------------------------------------*/