Handbedienung 4out funktioniert nicht

Fragen und Diskussionen zur Entwicklung von neuen Geräten. Sowohl Hardware als auch Software. English is welcome.
Antworten
Lightning
Beiträge: 7
Registriert: 19. Aug 2013, 00:58

Handbedienung 4out funktioniert nicht

Beitrag von Lightning »

Hi,

für die Emulation der Tasten einer Garagenfernbedienung mit Kleinsignalrelais möchte ich den 4fach Binärausgang verwenden. Dazu habe ich die 2TE Controller-Platine etwas umgebaut und mit Taster für Handbedienung, LEDS sowie Open-Collector Ausgängen für die Relais versehen sodass diese genau in ein kleines BOPLA Gehäuse passt. Um Störungen durch den Funk zu vermeiden sind die Relais direkt in der Fernbedienung verbaut und diese ist etwas Abgesetzt in einem eigenen Gehäuse montiert.
[thumbnail][/thumbnail]

Die Steuerung über KNX funktioniert ganz normal, nur die Handbedienung ist nicht möglich. Mit der Version für HB am Controller (out4_h-3.39.hex) schalten sobald der KNX Bus angeschlossen wird alle Ausgänge durch. Die Taster für die Handbedienung sind funktionslos. Per Bus lassen sich die Ausgänge nach wie vor abschalten (und auch wieder einschalten).
Die Pulse für die HB sind vorhanden:

Alle Ausgänge Ein:
[thumbnail][/thumbnail]
Alle Ausgänge Ein + Taster 4 gedrückt:
[thumbnail][/thumbnail]
Alle Ausgänge Aus:
[thumbnail][/thumbnail]
Alle Ausgänge Aus + Taster 4 gedrückt:
[thumbnail][/thumbnail]

Ein kurzer Blick in den Sourcecode an die vermutlich betreffende Stelle sieht schon etwas merkwürdig aus (ab line 385 in fb_app_out.c). "n" wird zwar weiter oben gesetzt aber irgendwas scheint hier trotzdem nicht richtig zu sein:

Code: Alles auswählen

	#ifdef MAX_PORTS_4
//		ledport=0x01;
//		for (n=0;n<4;n++) {
			P0=~bitmask_1[n];
			P0_5=1;			//P0.5 auf 1, wird über Dioden und taster auf low IO gezogen.
//			for(m=0;m<10;m++);
			if (!P0_5){
		  	Tasten=bitmask_1[n];
		  	}
//		  	ledport=ledport<<1;
//		}
//TODO
			P0=oldportbuffer|0x20;//|20 ist neu--> TESTEN  port zurückschreiben
	#endif
Für eine genauere Analyse müsste ich wesentlich genauer in den Code graben was sehr Zeitaufwändig ist.
Hoffentlich kann mir jemand weiterhelfen wo hier das Problem sein könnte oder ob HB für die 4out gar nicht fertig implementiert ist.

mfg
Rupert
oldcoolman
Beiträge: 645
Registriert: 17. Mai 2013, 20:57
Kontaktdaten:

Re: Handbedienung 4out funktioniert nicht

Beitrag von oldcoolman »

Hallo, Ich habe die im Einsatz. Wichtig ist, dass eine andere Leitung zum abscannen als beim 8out verwendet wird. (Hier P0_5).
Ich kann nicht ausschließen dass sich ein Fehler später in der Evulation eingeschlichen hat.
Vermutlich wird n in der Hauptschleife hochgezählt, so haben wir die Abfragefrequenz mal geändert.
Vorher haben wir alle 65ms alle Taster auf einmal gefragt. Später dann in jedem Zeitschlitz immer nur einen.
liebe Grüße
Andreas
Lightning
Beiträge: 7
Registriert: 19. Aug 2013, 00:58

Re: Handbedienung 4out funktioniert nicht

Beitrag von Lightning »

Hi,

Also n wird mittels maske über die globale variable

Code: Alles auswählen

unsigned char Tval,Taster_ctr;
gesetzt und bei jedem aufruf erhöht! Mit der Maske "&0x07" fährt diese auf jedenfall über 0-3 hinaus, im auskommentierten code wird nur von 0-3 gezählt. Ob der "Überlauf" die Fehlfunktion auslösen könnte hab ich mir noch nicht angeschaut...

Welche Version hast du auf deinen Aktoren wo die Handbedienung funktioniert?

Code: Alles auswählen

void handbedienung(void)
{
	unsigned char n;
	unsigned char Tasten=0;
	unsigned char ledport,m,P0_old;
__bit Taste=0;
	Taster_ctr++;
	n=Taster_ctr&0x07;
//	unsigned char n;
ledport;

		//+++++++   Handbetätigung  ++++++++++

	if((TMOD&0x0F)==0x02 && fb_state==0) {
//		ET1=0;

		#ifdef MAX_PORTS_8

		while(  (!PWM || (TL0>0x72)));// PWM scannen um "Hand"-Tasten abzufragen

		#endif
		#ifdef MAX_PORTS_4
		while( (TMOD&0x0F)==0x02 && ( TL0>0x72));// PWM scannen um "Hand"-Tasten abzufragen
		#endif
		interrupted=0;
		P0_old=P0;// Port sichern
	#ifdef MAX_PORTS_8
		#ifdef zeroswitch
		P1_0=1;	// TXD wird über Dioden auf low gezogen.
		#else
		P1_3= 1;			    //int0 auf 1, wird über Dioden und taster auf low IO gezogen.
		#endif
		P0=~bitmask_1[n];
		for(m=0;m<5;m++);
		#ifdef zeroswitch
			Taste=P1_0; // check TXD IO
		#else
			Taste=P1_3;// check INT0 IO
		#endif
			P0=P0_old;// port zurückschreiben
	#endif

	#ifdef MAX_PORTS_4
//		ledport=0x01;
//		for (n=0;n<4;n++) {
			P0=~bitmask_1[n];
			P0_5=1;			//P0.5 auf 1, wird über Dioden und taster auf low IO gezogen.
//			for(m=0;m<10;m++);
			if (!P0_5){
		  	Tasten=bitmask_1[n];
		  	}
//		  	ledport=ledport<<1;
//		}
//TODO
			P0=oldportbuffer|0x20;//|20 ist neu--> TESTEN  port zurückschreiben
	#endif
		//if (interrupted==1) Tasten=Tval;  // wenn unterbrochen wurde verwerfen wir die Taste
			//Tasten = Tval; // ##############  <----- Hier wird Handbetätigung quasi mit ausgeschaltet !! #########################
		if (!Taste){
  		Tasten= bitmask_1[n];
	  	}
		if ((Tasten&bitmask_1[n])!= (Tval&bitmask_1[n]))  {
			portbuffer=oldportbuffer;
		  	ledport=(Tasten&~Tval)& bitmask_1[n]; // ledport ist hier die Hilfsvariable für steigende Flanke
		  	if (ledport){
		  		portbuffer^=ledport; // bei gedrückter Taste toggeln
		  		portchanged=1;
		  	}
		  	Tval|=(Tasten & bitmask_1[n]);			//neue Taste sichern
		  	Tval&=(Tasten|(~bitmask_1[n]));
		}
//		ET1=1;
	}

}
#endif
Antworten