Gruesst euch,
heute mal ein ganz besonderer Fall, der sich mir nicht so richtig erklaeren will. Ich hab ne Steuerzentrale fuer ne Ventilationsanlage gebaut, die nichts anderes tut, als vier Thermostate, die jeweils drei 24VAC-Signale senden koennen (Ventilation, Heizen, Kuehlen) auszuwerten und drei entsprechende Pins daraufhin zu schalten. Das ganze System hat also zwoelf Eingaenge (4x3, ueber Wechselstrom auf NPN-Optokoppler) und drei Ausgaenge (ueber 2803 an Relay). Klingt einfach, ist es auch. Hier das Programm dazu:
CodeBox BascomAVR
Was ist das Problem bei so einem bloeden Programm? Jetzt kommts: Es geht immer in den Heizmodus. Egal, was die Thermostate senden, bzw. egal ob sie ueberhaupt angeschlossen sind. Mein erster Gedanke: Ein Optokoppler zieht ohne Signal den Pin nach GND. Leider hat sich das nicht bestaetigt. Alle Optokoppler halten die Pinspannung, es gibt keine Spikes, keine Wellen, keine Stoersignale (ueber mehrere Testlaeufe mit Oszilloskop ueberwacht). Und doch schaltet der Mega in den Heizmodus.
Hab daraufhin alle Kabel abgeklemmt, die Optokoppler entfernt (zum Glueck hab ich Sockel verloetet) und nochmal getestet. Und wieder in den Heizmodus. Bevor ich jetzt die Platte vom Balkon werf, frag ich euch: Was kann das sein? Hab ich was uebersehen? Ich mach mich jetzt ans reassemblieren, wollen doch mal sehen, was der Mega im Speicher hat.
heute mal ein ganz besonderer Fall, der sich mir nicht so richtig erklaeren will. Ich hab ne Steuerzentrale fuer ne Ventilationsanlage gebaut, die nichts anderes tut, als vier Thermostate, die jeweils drei 24VAC-Signale senden koennen (Ventilation, Heizen, Kuehlen) auszuwerten und drei entsprechende Pins daraufhin zu schalten. Das ganze System hat also zwoelf Eingaenge (4x3, ueber Wechselstrom auf NPN-Optokoppler) und drei Ausgaenge (ueber 2803 an Relay). Klingt einfach, ist es auch. Hier das Programm dazu:
CodeBox BascomAVR
$regfile = "m644pdef.dat" $crystal = 1000000 $swstack = 70 $hwstack = 70 $framesize = 70 '----------------------------------- Ports ------------------------------------- Config Pina.0 = Input Porta.0 = 1 T4w Alias Pina.0 'Thermostat 4, Heizsignal Config Pina.1 = Input Porta.1 = 1 T4y Alias Pina.1 'Thermostat 4, Kuehlsignal Config Pina.2 = Input Porta.2 = 1 T4g Alias Pina.2 'Thermostat 4, Lueftersignal Config Pina.3 = Input Porta.3 = 1 T3w Alias Pina.3 'Thermostat 3, Heizsignal Config Pina.4 = Input Porta.4 = 1 T3y Alias Pina.4 'Thermostat 3, Kuehlsignal Config Pina.5 = Input Porta.5 = 1 T3g Alias Pina.5 'Thermostat 3, Lueftersignal Config Pinc.4 = Input Portc.4 = 1 T2w Alias Pinc.4 'Thermostat 2, Heizsignal Config Pinc.3 = Input Portc.3 = 1 T2y Alias Pinc.3 'Thermostat 2, Kuehlsignal Config Pinc.2 = Input Portc.2 = 1 T2g Alias Pinc.2 'Thermostat 2, Lueftersignal Config Pinc.1 = Input Portc.1 = 1 T1w Alias Pinc.1 'Thermostat 1, Heizsignal Config Pinc.0 = Input Portc.0 = 1 T1y Alias Pinc.0 'Thermostat 2, Kuehlsignal Config Pind.7 = Input Portd.7 = 1 T1g Alias Pind.7 'Thermostat 2, Lueftersignal '............................................................................... Config Portd.0 = Output Portd.0 = 0 Heat Alias Portd.0 'Ausgang zur Waermepumpe Config Portd.1 = Output Portd.1 = 0 Vent Alias Portd.1 'Ausgang zur Lueftungsanlage Config Portd.2 = Output Portd.2 = 0 Cool Alias Portd.2 'Ausgang zum Klimakompressor '--------------------------------- Interrupts ---------------------------------- Config Timer1 = Timer , Prescale = 1024 'Looptimer, 63 sek. On Ovf1 Timer1_isr Stop Timer1 '--------------------------------- Variabeln ----------------------------------- Dim Systemstatus As Byte Const Heating = &H80 Const Cooling = &H40 Const Ventilation = &H20 Const Standby = &H00 Const Timer1reload = 65534 '--------------------------------- Main ---------------------------------------- Systemstatus = Standby Do Main: Enable Timer1 Start Timer1 Enable Interrupts Power Idle Disable Interrupts Stop Timer1 Disable Timer1 If T1w = 0 Or T2w = 0 Or T3w = 0 Or T4w = 0 Then 'Prioritaeres Heizen: Wenn eines der Thermostate auf Heizen geht, 'werden die anderen Signale uebersprungen und das System geht in den Heizmodus Systemstatus = Heating Goto Set_system End If If T1y = 0 Or T2y = 0 Or T3y = 0 Or T4y = 0 Then Systemstatus = Cooling Goto Set_system End If If T1g = 0 Or T2g = 0 Or T3g = 0 Or T4g = 0 Then Systemstatus = Ventilation Goto Set_system End If Set_system: Select Case Systemstatus Case Heating : Heat = 1 Vent = 0 Cool = 0 Case Cooling : Heat = 0 Vent = 0 Cool = 1 Case Ventilation : Heat = 0 Vent = 1 Cool = 0 End Select Loop End '------------------------------------------------------------------------------- Timer1_isr: Load Timer1 Timer1reload Stop Timer1 Return
Was ist das Problem bei so einem bloeden Programm? Jetzt kommts: Es geht immer in den Heizmodus. Egal, was die Thermostate senden, bzw. egal ob sie ueberhaupt angeschlossen sind. Mein erster Gedanke: Ein Optokoppler zieht ohne Signal den Pin nach GND. Leider hat sich das nicht bestaetigt. Alle Optokoppler halten die Pinspannung, es gibt keine Spikes, keine Wellen, keine Stoersignale (ueber mehrere Testlaeufe mit Oszilloskop ueberwacht). Und doch schaltet der Mega in den Heizmodus.
Hab daraufhin alle Kabel abgeklemmt, die Optokoppler entfernt (zum Glueck hab ich Sockel verloetet) und nochmal getestet. Und wieder in den Heizmodus. Bevor ich jetzt die Platte vom Balkon werf, frag ich euch: Was kann das sein? Hab ich was uebersehen? Ich mach mich jetzt ans reassemblieren, wollen doch mal sehen, was der Mega im Speicher hat.