Hallo ich nutze einen Pin Change Interrupt um Hall Signale eines Motors zu lesen. Allerdings weiss ich nicht wie schnell so ein Pin Change Interrupt arbeitet. Kann er jede Frequenz der Signale erfassen oder hat auch er ein Limit? Mal angenommen ich nutze einen Atmel Controller der einen 10MHz Oszillator hat. Dann ist doch mein Limit 1/10MHz richtig? Oder muss man da anders rechnen? Gruss Peter
Ein Interrupt kann nur ausgeführt werden, wenn die Interrupts freigegeben sind. Deine Interruptlatenzzeit kann so groß sein, wie die längste Abarbeitungszeit eines (anderen) Codefragments das die Interrupts blockiert (Wie z.B. andere Interruptroutinen). Zusätzlich kommt dann noch die Zeit dazu die der Prozessor brauchst um den eigentlichen Interruptcode auszuführen. Es hängt also von dir, bzw deinem Programm ab wie groß die maximale Latenz ist. Diese Rechnung ist auf jeden Fall unsinnig: Ganui K. schrieb: > Mal angenommen ich nutze einen Atmel Controller der einen 10MHz > Oszillator hat. > Dann ist doch mein Limit 1/10MHz richtig?
Wie in vielen anderen Fällen auch, hilft hier das Datenblatt. Im Kapitel über externe Interupts wird das Problem mit den Stromspar Modi erklärt (warum muss der Interrupt länger anstehen, wenn der Chip tief schläft). Unter Electrical Characteristics findet man weitere Einschränkungen. Eine allgemein gültige Formel gibt es nicht.
Ganui K. schrieb: > Oder muss man da anders > rechnen? Ja. Der Aufruf eines Interrupts dauert je nach Situation etwa 7 Takte. Es wird die angefangene Instruction des Hauptprogramms fertig genacht (das ist der variable Teil der Verzögerung), dann wird die Rücksprungadresse auf Stack gelegt und die Adresse mit dem Vektor aufgerufen. Der Rücksprung dauert dann weitere 3 Takte. Im Datenblatt müsstest Du unter dem Stichwort interrupt Response time die Einzelheiten dazu finden. Weitere Verzögerung kommt dazu, wenn die Hochsprache beim Aufruf noch Register sichert und wiederherstellt, das sind dann 4 Takte pro Register (2 Takte push, 2 Takte pop). Auch spielt es eine Rolle, ob man in ASM mit Exklusiv-Registern arbeitet (keine Sicherung nötig) und auch die im Int benötigten Variablen in Registern hält (kein LDS/STS nötig), oder ob man alles aus dem RAM holen und zurückschaufeln muss (in Hochsprachen der Normalfall). Es gibt also recht viele Dinge zu berücksichtigen, um festzustellen, wie schnell ein Interrupt ist. ...
> Oder muss man da anders rechnen?
Schon einmal ins Datenblatt geschaut?
Die Eingänge werden mit dem CPU-Takt gelatcht. Um eine Flanke zu erkennen, muß >1CLK low und >1CLK high anliegen bzw. umgekehrt. Die maximale Eingangsfrequenz ist also <5MHz bei 50% Tastverhältnis und CLK_CPU=10MHz. Siehe auch Figure 9-1. Timing of pin change interrupts.
Ganui K. schrieb: > ich nutze einen Pin Change Interrupt um Hall Signale eines Motors zu > lesen. > Allerdings weiss ich nicht wie schnell so ein Pin Change Interrupt > arbeitet. Dann sag doch einfach, wie schnell Du es brauchst. Ein Hallgeber mit einigen 10 kHz sollte kein Problem sein.
Servus, du brauchst ein µC der Encoder Signal auswerten kann ohne dabei die CPU zu belasten. Alles andere ist unsinnig oder du lässt den µC Pollen und dann aber hat er nur diese Aufgabe... Bei der Auswertung bzw. schon vorher, ist es wichtig wie das Signal aussieht. Ohne ein Skope wirds schwer. mfg
Ganui K. schrieb: > ich nutze einen Pin Change Interrupt um Hall Signale eines Motors zu > lesen. Wobei ich mir jetzt schon überlege was das für ein Motor ist der 100000 U/s macht. Das wären ja 6.000.000 U/min! Bei "normalen" Drehzahlen dürfte der Interrupt gerade mal 100 - 1000 mal pro Sekunde auftreten. Bei 1000 wären das schon 60000 U/min.
Ganui K. schrieb: > Mal angenommen ich nutze einen Atmel Controller (...) Anscheinend noch nicht geklärt, ob es ein AVR, ein ARM oder ein 8051 ist...?
Erst waere mal interessant was denn gemessen werden soll. Wenn die Zustandsaenderung gesucht ist .. Der Pin wechselt und dann steht der Interrupt intern an. Dh falls der Interrupt enabled ist. Dann wird die gradige Instruktion beendet und die Interrupt funktion angesprungen. Dort wird je nachdem erst der Status gesichert. Falls bereits ein Interrupt in Verarbeitung ist wird der ohne Hast erst beendet. Dh die Interruptantwortzeit hkann sich von vielleicht 3 Clockzycken bis zur laengesten Interruptzeit einen anderen Interrupts, plus ein paar cycles erstecken. Falls man an der Frequenz interessiert ist, verwendet man besser den Input Capture Interrupt. Bei dem wird auf die Signalflanke hin ein Timer gestartet/gestoppt bevor der Interrupt aufgerufen wird, dh das Ereignis wird festgehalten, egal wie lange der Controller noch beschaeftigt ist.
Markus W. schrieb: > Anscheinend noch nicht geklärt, ob es ein AVR, ein ARM oder ein 8051 > ist...? Welcher von denen hat denn einen PinChange-Interrupt?
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.