Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Schleifen? Programm zu lang? Kategorie: Programmierung Basic (von Achim - 16.08.2005 16:16)
 Als Antwort auf Schleifen? Programm zu lang? von Alex - 16.08.2005 15:44
> Ziel des Programms ist, 15 Leitungen zu überwachen. Wenn auf einer Leitung Spannung anliegt, soll er einen IR Code senden. Allerdings nur 1x mal! Beispiel : Auf Leitung 1 liegt ein Signal an, dann sende per IR Signal XY. Liegt auf Leitung 2 ein Signal, dann sende ZXY, usw. !
>
> Jetzt das besondere : Wenn jetzt z.B. auf Leitung 1 und 2 und 3 Spannung anliegt und 3 wieder abgeschalten wird, soll er den Code von 1 erneut senden. Auch wieder nur einmal!  Das soll bei allen 15 Leitungen funktioniern! Es soll immer überprüft werden welche die erste Leitung ist und der Code dieser Leitung erneut gesendet werden. Noch ein Beispiel : Leitung 4,8 und 10 haben ein Signal. Leitung 8 wird abgeschaltet => Leitung 4 Code erneut senden.

Was ist, wenn Leitung 4, 8 und 10 ein Signal haben, und Leitung 4 abgeschaltet wird? Dann Code 8 erneut senden? Deiner Beschreibung nach würde ich sagen: ja.

Was ist, wenn Leitung 4, 8 und 10 ein Signal habe, 8 abgeschaltet wird, Code 4 nochmal gesendet wurde, und dann Leitung 10 abgeschaltet wird? Code 4 nochmal senden oder nicht? Deiner Beschreibung würde ich sagen: ja.

Dann könnte ein Code skizziert so aussehen:

define Sig0bis7 byteport[1]
define Sig8bis15 byteport[2]
define status0bis7 byte
define status8bis15 byte
define i byte
define bitmaske int
define bitmaske_inv int

status = 0

#loop
'byteport 1 auf Signalwechsel testen
for i=0 to 7
  bitmaske = 1 shl i
  bitmaske_inv = 255 - bitmaske ' oder per xor
 ' steigende Flanke?
 if NOT (((sig0bis7 AND bitmaske)  <>  0) AND ((status0bis7 AND bitmaske) = 0)) then goto weiter
    gosub Sende_IR_i  ' IR-Signal für Leitung i senden
    status0bis7 = status0bis7 OR bitmaske ' aktuellen Signalzustand merken
 #weiter

 ' fallende Flanke
 if NOT (((sig0bis7 AND bitmaske)  =  0) AND ((status0bis7 AND bitmaske) <>  0)) then goto weiter1
    gosub Sende_min_IR
    status0bis7 = status0bis7 AND  bitmaske_inv ' aktuellen Signalzustand merken
 #weiter1
next

' das gleiche nochmal für sig8bis15

goto loop

#sende_min_ir
'finde kleinste aktive Leitung
for i=0 to 7
  bitmaske = 1 shl i
  if NOT ((status0bis7 AND bitmaske) <> 0) then goto weiter2
    gosub Sende_IR_i
    goto end_for ' Abbruch Schleife
 #weiter2
next

' das gleiche nochmal für sig8bis15

#end_for
return


HTH

Bye
 Achim


 Antwort schreiben

Bisherige Antworten: