Hallo, ich programmiere zur Zeit eine Phasenanschnittsteuerung mit 3 Phasen. Hier habe ich nun ein Problem...wie es mir scheint ein Prozessorfehler (AT89C51CC03). Durch eine Logikschaltung wird bei jedem positiven Phasennulldurchgang ein externer Interrupt INT0 ausgelöst. Die Logikschaltung hat 3 mögliche Zustände (011, 101, 110 auf P1_0 bis P1_2), je nachdem welcher Nulldurchgang erfolgt. In der INT0 Routine frage ich nun den Zustand der Logik ab (101 für Nulldurchgang 1.Phase). Hier tritt das Fehlverhalten auf, ich habe einen Teil des Codes unten angehängt. Ich habe das ganze schon messtechnisch mit dem Oszilloskop erfasst, dies zeigt das der Eingang P1_1 = 0 ist! Die Flanken sind zudem sauber und steil. Dieser Fehler tritt sporadisch auf, manchmal 5 min garnicht, dann aber wieder alle 2-3 Sek. Habt ihr vielleicht eine Erklärung hierfür? void INT0_INT(void) interrupt 0 { EA = 0; L1 = P1_0; L2 = P1_1; L3 = P1_2; ..... hier tritt der Fehler auf L1 = L2 = L3 = 1 !!!!! obwohl laut Oszilloskop eindeutig P1_1 = L2 = 0 ist, durch die Logikschaltung ist jeder Zustand von dem anderen mindestens 6,6ms entfernt (120 Grad) EA = 1; }
Ich vermute, dass Spannungsspitzen und/oder andere Störsignale aus dem Netz deine Logikschaltung durcheinander bringen oder den Interrupt nicht zum Nulldurchgang auslösen. Abhilfe könnte wie folgt sein: Frag den pos. Nulldurchgang nur von einer Phase ab. Blockiere dann weitere Auslösungen für 19,5ms. Dadurch haben Störsignale eine viel kleiner Chance einen Interrupt auszulösen.
tw schrieb: > ..... hier tritt der Fehler auf L1 = L2 = L3 = 1 !!!!! obwohl laut > Oszilloskop eindeutig P1_1 = L2 = 0 ist Wie hast Du das festgestellt? Trigger dochmal das Oszi nur dann, wenn alle 3 Inputs 1 sind, d.h. im Interrupthandler und schaue Dir die Vergangenheit an. Vielleicht ist ein Störsignal auf dem Interrupt. Du brauchst natürlich einen 4-Kanaler mit extra Triggereingang. Und laß gefälligst das EA-Bit in Ruhe, das hat im Interrupthandler nichts verloren. Peter
Wie sieht es mit den Laufzeiten deiner externen Logikschaltung aus? Ist das Timing vielleicht grenzwertig, so dass Temperaturschwankungen oder die schon erwähnten Störeinflüsse zu unterschiedlichen Abtastwerten bzw. -zeitpunkten führen? Bei den AVRs werden ja Port-Pins nur zu bestimmten Clock-Flanken gesamplet, und manche Interrupts sind ebenfalls Clock-Synchron, andere sind asynchron. Das Datenblatt zum o.g. MC hat mir dazu grad nix gesagt, aber so drastisch anders wird es dabei wohl auch nicht sein. Wie deine externe Schaltung das ~INT0-Signal erzeugt, könnte auch noch Laufzeitunterschiede zwischen ~INT0 und den Port-Pins verursachen, so dass nicht unbedingt die Port-Werte gelesen werden, die den Interrupt ausgelöst haben. Und zwischen Auslösen des INT0 und dem Erreichen des C-Codes vergehen ebenfalls ein paar Clockzyklen. Theoretisch kannst du sogar kompletten Müll deswegen erhalten, weil dein Code drei Werte separat ausliest, d.h. zu drei verschiedenen Zeitpunkten. Stattdessen wäre es vielleicht sinniger, den Port in einer Instruktion zu lesen, und sich dann aus dem gelesenen Byte (nehme ich mal an) die Bits rauszuziehen. Ob deine Schaltung so timing-sensibel ist, weiss ich nicht. Dein mysteriöses Verhalten klingt für mich nach einer der genannten Ursachen.
Das Netzsignal muss nicht glatt sein. Daher sollte man sich ein Tiefpass Filter goennen, das alles oberhalb zB 100Hz abschneidet.
Wie ist IT0 eingestellt? Welche Schaltung erzeugt das Signal an P3_2? tschuessle Bernhard
Es kann auch sein, daß gerade ein anderer Interrupt läuft und daher die Signale viel später nach der Flanke eingelesen werden. Aber das ist beim 8051 kein Problem, der hat ja 4 Prioritäten, die man zuweisen kann. Gib ihm einfach die höchste Priorität, dann kann er alle anderen Interrupts unterbrechen. Peter
Hallo, danke erstmal für die vielen Beiträge. Zu Störungen kann ich sagen, dass ich einen Netzfilter verwende und zumindest auf dem Oszi nicht zu sehen ist. (@peda) Ich habe das bereits durchgeführt, aber die 3 Signale laufen sauber, d.h. L1 und L3 sind high und L2 low. Die Laufzeiten meiner Logikschaltung habe ich auch bereits überprüft, im ns Bereich, selbst bei höchster Auflösung meines 200Mhz Oszis waren die Flanken noch sauber, ca. 5V/10ns Steilheit. Meine INT0 Routine hat auch bereits die höchste Priorität.
Dann zeig mal den Code, mit dem Du den "Fehler" feststellst. Die IO-Ports werden mit Sicherheit in Ordnung sein. Das wäre sonst schon längst jemandem aufgefallen. Den T89C51CC01 gibt es ja schon seit 2000. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.