Example #1
0
void read_value_req(void)	// process received read_value_request telegram
{
	unsigned char objno, objflags;

	objno=find_first_objno(telegramm[3],telegramm[4]);
	objflags=read_objflags(objno);		// read object flags
	if((objflags&0x0C)==0x0C)		// Answer only when READ and COM flags are set
	{
		g_objno = objno;
		g_state = 0x01;
	}
}
Example #2
0
void read_value_req(void)
{
	unsigned char objno, objflags;

	objno=find_first_objno(telegramm[3],telegramm[4]);	// erste Objektnummer zu empfangener GA finden
	if(objno!=0xFF) {	// wenn Gruppenadresse gefunden
		objflags=read_objflags(objno);		// Objekt Flags lesen

		// Objekt lesen, nur wenn read enable gesetzt (Bit3) und Kommunikation zulaessig (Bit2)
		if((objflags&0x0C)==0x0C) {
			if (objno==0) send_obj_value(0x40);
			if (objno==1) send_obj_value(0x41);
		}
	}
}
Example #3
0
void write_value_req(void)
{
	unsigned char objno,objflags,gapos,atp,assno,n,gaposh;

	// Gruppenadressposition aus Gruppenadresse bestimmen
	gapos=gapos_in_gat(telegramm[3],telegramm[4]);
	if (gapos!=0xFF)
	{
	    atp=eeprom[ASSOCTABPTR];			// Association Table Pointer
	    assno=eeprom[atp];					// Erster Eintrag = Anzahl Eintraege

	    for(n=0;n<assno;n++) {				// Schleife über alle Eintraege in der Ass-Table, denn es koennten mehrere Objekte (Pins) der gleichen Gruppenadresse zugeordnet sein
	    	gaposh=eeprom[atp+1+(n*2)];			// Erste GA-Position aus ASS Tabelle lesen
	    	if(gapos==gaposh) {					// Wenn Positionsnummer uebereinstimmt
	    		objno=eeprom[atp+2+(n*2)];			// Objektnummer
	    		objflags=read_objflags(objno);		// Objekt Flags lesen
//	    		rs_send_c(objno);
//	    		rs_send_c(objflags);
//	    		rs_send_c(telegramm[7]&0x01);
	    		if((objflags&0x14)==0x14) {			// Kommunikation zulaessig (Bit 2 = communication enable) + Schreiben zulaessig (Bit 4 = write enable)
	    			if (objno==OBJ_SET_ALARM) {	// remote alarm
	    				if (telegramm[7]&0x01) {	// Alarm on
	    					g_set_alarm = 1;
	    				}
	    				else {						// Alarm off
	    					g_set_alarm = 0;
	    					g_stat_alarm_delay = 0;	// Do not send delayed alarm even if local alarm detected
//	    					g_set_test = 0;         // Test alarm also off
	    				}
	    			}

	    			if (objno==OBJ_SET_TALARM) {	// remote test
	    				if (telegramm[7]&0x01) {	// Test on
	    					g_set_test = 1;
	    				}
	    				else {						// Test off
	    					g_set_test = 0;
	    				}
	    			}
	    		}
	    	}
	    }
	}
}
void main(void)
{
	unsigned char n,count,send_nibble=0,pwm0=0,pwm1=0,pwm2=0,prog_button_level=0;
	signed char cal;
	static __code signed char __at (0x1BFF) trimsave;
	__bit prog_button_toggled=0;

	restart_hw();// Hardware zuruecksetzen
#ifdef FB_DEBUG
	RS_INIT_115200
#else
	RS_INIT_9600
#endif
	TI=1;
	TASTER=0;
	cal=trimsave;
	TRIM = TRIM+trimsave;


	for (n=0;n<50;n++) {		// Warten bis Bus stabil
		TR0=0;					// Timer 0 anhalten
		TH0=eeprom[ADDRTAB+1];	// Timer 0 setzen mit phys. Adr. damit Geräte unterschiedlich beginnen zu senden
		TL0=eeprom[ADDRTAB+2];
		TF0=0;					// Überlauf-Flag zurücksetzen
		TR0=1;					// Timer 0 starten
		while(!TF0);
	}
	count=0;

	restart_app();							// Anwendungsspezifische Einstellungen zuruecksetzen
	bus_return();							// Aktionen bei Busspannungswiederkehr

	do  {
#ifdef FB_DEBUG
		DEBUGPOINT
#endif
		if(APPLICATION_RUN) {	// nur wenn run-mode gesetzt

			// Helligkeit nachführen
		if (dimmziel[count]==dimmwert[count]){
			if (helligkeit[count]!= dimmwert[count]){
				helligkeit[count]=dimmwert[count];
//				rs_send(read_obj_value(count+6));
//				rs_send(read_objflags(count+6));
				if (read_objflags(count+6)&0x40){
					send_obj_value(count+6);
				}
			}
		}
		if(count<2)count++;
		else count=0;

#ifndef FB_DEBUG
#ifdef applilpc
		if (TI){
			switch(send_nibble){
			case 0:
			pwm0=dimmpwm[0];
			RS_SEND(0x00+(pwm0<<4));
			break;
			case 1:
			RS_SEND(0x01+(pwm0 & 0xF0));
			break;
			case 2:
			pwm1=dimmpwm[1];
			RS_SEND(0x02+(pwm1<<4));
			break;
			case 3:
			RS_SEND(0x03+(pwm1 & 0xF0));
			break;
			case 4:
			pwm2=dimmpwm[2];
			RS_SEND(0x04+(pwm2<<4));
			break;
			case 5:
			RS_SEND(0x05+(pwm2& 0xF0));
			break;
			case 6:
			RS_SEND(0x06+(portbuffer & 0xF0));
			break;
			default:
				send_nibble=255;

			}// ende switch
		//RI=0;
		send_nibble++;

		} // ende if(TI)...
#endif
#endif
//		if(RI){

		//if(SBUF=='+')dimmziel[0]++;
		//if(SBUF=='-')dimmziel[0]--;
		//if(SBUF=='c')rs_send(0x55);
//		rs_send(helligkeit[SBUF]);

//		RI=0;
//		}



		if(RTCCON>=0x80) delay_timer();	// Realtime clock Ueberlauf
/*			if(TF0 && (TMOD & 0x0F)==0x01) {	// Vollstrom für Relais ausschalten und wieder PWM ein
#ifndef SPIBISTAB
				TMOD=(TMOD & 0xF0) + 2;			// Timer 0 als PWM
				TAMOD=0x01;
				TH0=DUTY;
#endif
				TF0=0;
#ifndef SPIBISTAB
				AUXR1|=0x10;	// PWM von Timer 0 auf Pin ausgeben
#endif
				PWM=1;			// PWM Pin muss auf 1 gesetzt werden, damit PWM geht !!!
#ifndef SPIBISTAB
				TR0=1;
#else
				P0=portbuffer;
#endif
			}
			if (dimmtimervorteiler>=10){//vorteiler wird alle 50µs in softpwm erhöht
				dimmtimervorteiler-=10;//
				delay_timer();
			}// ergibt eine flanke von 0.50ms

*/
			if (portchanged)port_schalten();	// Ausgänge schalten

			// portbuffer flashen, Abbruch durch ext-int wird akzeptiert und später neu probiert
			// T1-int wird solange abgeschaltet, timeout_count wird ggf. um 4ms (flashzeit) reduziert
		/*	if (fb_state==0 && portbuffer!=eeprom[PORTSAVE]) {
				ET1=0;
				START_WRITECYCLE;
				WRITE_BYTE(0x01,PORTSAVE,portbuffer);
				STOP_WRITECYCLE;
				if (timeout_count>120) timeout_count-=120; else timeout_count=0;
				ET1=1;
			}
		*/
		}// end if(runstate)
		else if (RTCCON>=0x80 && connected)	// Realtime clock ueberlauf
		{			// wenn connected den timeout für Unicast connect behandeln
		RTCCON=0x61;// RTC flag löschen
		if(connected_timeout <= 110)// 11x 520ms --> ca 6 Sekunden
			{
			connected_timeout ++;
			}
			else send_obj_value(T_DISCONNECT);// wenn timeout dann disconnect, flag und var wird in build_tel() gelöscht
		}

		n= tx_buffer[(tx_nextsend-1)&0x07];// ist die letzte objno
		if (tel_arrived || (n<6 && n>8 && tel_sent)) { //
			tel_arrived=0;
			tel_sent=0;
			process_tel();

		}

		// ### PROG Button ###

		TASTER=1;				// Pin als Eingang schalten um Taster abzufragen
		if(!TASTER){ // Taster gedrückt
			if(prog_button_level<255)	prog_button_level++;
			else{
				if(!prog_button_toggled)status60^=0x81;	// Prog-Bit und Parity-Bit im system_state toggeln
				prog_button_toggled=1;
			}
		}
		else {
			if(prog_button_level>0)prog_button_level--;
			else prog_button_toggled=0;
		}
		TASTER=!(status60 & 0x01);	// LED entsprechend Prog-Bit schalten (low=LED an)



		for(n=0;n<100;n++) {}	// falls Hauptroutine keine Zeit verbraucht, der LED etwas Zeit geben, damit sie auch leuchten kann


	} while(1);
}
void main(void)
{ 
	unsigned char n,count,cmd,tasterpegel=0;
	signed char cal;
	static __code signed char __at 0x1BFF trimsave;
	__bit tastergetoggelt=0;
	restart_hw();							// Hardware zuruecksetzen

	cal=trimsave;
	TRIM = TRIM+trimsave;
	//...rs_init...(6);im folgenden direkt:
	BRGCON&=0xFE;	// Baudrate Generator stoppen
	P1M1&=0xFC;		// RX und TX auf bidirectional setzen
	P1M2&=0xFC;
	SCON=0x50;		// Mode 1, receive enable
	SSTAT|=0xE0;	// TI wird am Ende des Stopbits gesetzt und Interrupt nur bei RX und double TX buffer an
	BRGCON|=0x02;	// Baudrate Generator verwenden aber noch gestoppt
	BRGR1=0x2f;	// Baudrate = cclk/((BRGR1,BRGR0)+16)
	BRGR0=0xf0;	// für 115200 0030 nehmen, autocal: 600bd= 0x2FF0
	BRGCON|=0x01;	// Baudrate Generator starten
	SBUF=0x55;

	TASTER=0;
	for (n=0;n<50;n++) {		// Warten bis Bus stabil
		TR0=0;					// Timer 0 anhalten
		TH0=eeprom[ADDRTAB+1];	// Timer 0 setzen mit phys. Adr. damit Geräte unterschiedlich beginnen zu senden
		TL0=eeprom[ADDRTAB+2];
		TF0=0;					// Überlauf-Flag zurücksetzen
		TR0=1;					// Timer 0 starten
		while(!TF0);
	}
	count=0;

	restart_app();							// Anwendungsspezifische Einstellungen zuruecksetzen
	bus_return();							// Aktionen bei Busspannungswiederkehr

	do  {
		if(APPLICATION_RUN) {	// nur wenn run-mode gesetzt

			// Helligkeit nachführen
		if (dimmziel[count]==dimmwert[count]){
			if (helligkeit[count]!= dimmwert[count]){
				helligkeit[count]=dimmwert[count];
//				rs_send(read_obj_value(count+6));
//				rs_send(read_objflags(count+6));
				if (read_objflags(count+6)&0x40)send_obj_value(count+6);
			}
		}
		if(count<2)count++;
		else count=0;
		
		
		
		if (RI){
			RI=0;
			cmd=SBUF;
			if(cmd=='c'){
				while(!TI);
				TI=0;
				SBUF=0x55;
			}
			if(cmd=='+'){
				TRIM--;
				cal--;
			}
			if(cmd=='-'){
				TRIM++;
				cal++;
			}
			if(cmd=='w'){
				EA=0;
				START_WRITECYCLE;	//cal an 0x1bff schreiben
#ifdef zeroswitch
				FMADRH= 0x1B;		
				FMADRL= 0xFE; 
				FMDATA= phival;
#else
				FMADRH= 0x1B;		
				FMADRL= 0xFF; 
#endif
				FMDATA=	cal;
				STOP_WRITECYCLE;
				EA=1;				//int wieder freigeben
			}
			if(cmd=='p')status60^=0x81;	// Prog-Bit und Parity-Bit im system_state toggeln
			if(cmd=='v'){
				while(!TI);
				TI=0;
				SBUF=VERSION;
			}
			if(cmd=='t'){
				while(!TI);
				TI=0;
				SBUF=TYPE;
			}

		}//end if(RI...


		
		//if(RTCCON>=0x80) delay_timer();	// Realtime clock Ueberlauf
/*			if(TF0 && (TMOD & 0x0F)==0x01) {	// Vollstrom für Relais ausschalten und wieder PWM ein
#ifndef SPIBISTAB
				TMOD=(TMOD & 0xF0) + 2;			// Timer 0 als PWM
				TAMOD=0x01;
				TH0=DUTY;
#endif				
				TF0=0;
#ifndef SPIBISTAB
				AUXR1|=0x10;	// PWM von Timer 0 auf Pin ausgeben
#endif
				PWM=1;			// PWM Pin muss auf 1 gesetzt werden, damit PWM geht !!!
#ifndef SPIBISTAB
				TR0=1;
#else
				P0=portbuffer;
#endif				
			}
*/
			if (dimmtimervorteiler>=10){//vorteiler wird alle 50µs in softpwm erhöht
				dimmtimervorteiler-=10;//
				delay_timer();
			}// ergibt eine flanke von 0.50ms

			
			if (portchanged)port_schalten();	// Ausgänge schalten

			// portbuffer flashen, Abbruch durch ext-int wird akzeptiert und später neu probiert
			// T1-int wird solange abgeschaltet, timeout_count wird ggf. um 4ms (flashzeit) reduziert
		/*	if (fb_state==0 && portbuffer!=eeprom[PORTSAVE]) {
				ET1=0;
				START_WRITECYCLE;
				WRITE_BYTE(0x01,PORTSAVE,portbuffer);
				STOP_WRITECYCLE;
				if (timeout_count>120) timeout_count-=120; else timeout_count=0;
				ET1=1;
			}
		*/
		}// end if(runstate)
		else if (RTCCON>=0x80 && connected)	// Realtime clock ueberlauf
			{			// wenn connected den timeout für Unicast connect behandeln
			RTCCON=0x61;// RTC flag löschen
			if(connected_timeout <= 110)// 11x 520ms --> ca 6 Sekunden
				{
				connected_timeout ++;
				}
				else send_obj_value(T_DISCONNECT);// wenn timeout dann disconnect, flag und var wird in build_tel() gelöscht
			}
		
		n= tx_buffer[(tx_nextsend-1)&0x07];// ist die letzte objno
		if (tel_arrived || (n<6 && n>8 && tel_sent)) { // 
			tel_arrived=0;
			tel_sent=0;
			process_tel();
			
		}
    	

		TASTER=1;				// Pin als Eingang schalten um Taster abzufragen
		if(!TASTER){ // Taster gedrückt
			if(tasterpegel<255)	tasterpegel++;
			else{
				if(!tastergetoggelt)status60^=0x81;	// Prog-Bit und Parity-Bit im system_state toggeln
				tastergetoggelt=1;
			}
		}
		else {
			if(tasterpegel>0) tasterpegel--;
			else tastergetoggelt=0;
		}
		TASTER=!(status60 & 0x01);	// LED entsprechend Prog-Bit schalten (low=LED an)
		
		

//		for(n=0;n<100;n++) {}	// falls Hauptroutine keine Zeit verbraucht, der LED etwas Zeit geben, damit sie auch leuchten kann
//		if (status60&0x01)ET0=0;
//		else ET0=1;
	} while(1);
}