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; } }
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); } } }
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); }