Forum: Mikrocontroller und Digitale Elektronik Mikrocontrollerverhalten Ext. Interrupt


von tw (Gast)


Lesenswert?

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;
}

von Grübler (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Sam P. (Gast)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Das Netzsignal muss nicht glatt sein. Daher sollte man sich ein Tiefpass 
Filter goennen, das alles oberhalb zB 100Hz abschneidet.

von Bernhard S. (b_spitzer)


Lesenswert?

Wie ist IT0 eingestellt?
Welche Schaltung erzeugt das Signal an P3_2?

tschuessle
Bernhard

von Peter D. (peda)


Lesenswert?

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

von tw (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.