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.
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