keine Hysterese, ext. Interrupt feuert ständig, Bluepill

OP #7365336
Lesenswert?

Hallo,

mit meinem Bluepill-board mache ich folgendes:

im Setup (Arduino):

1
  pinMode(PB8, INPUT);
2
  attachInterrupt(digitalPinToInterrupt(PAS), isrPas, FALLING);

Interrupt Funktion:

1
void isrPas(){
2
  pasCount++;
3
}

High Level ist doch 0.7 * VDD (2.31v) und Low Level 0.3 * VDD (0.99V). Meine Interrupt Funktion wird jedoch bei einer anliegenden Spannung von ca. 1.3 bis 1.7V ständig ausgelöst... wieso das? Verstehe ich gerade nicht...

Gibt es beim Interrupt / Falling Edge keine Hysterese ? Oder habe ich ein China-Chip erwischt?

Vielen Dank für jeden Hinweis, weil gerade komme ich überhaupt nicht weiter, bzw. weiss nicht wo noch suchen...

#7365361
Lesenswert?

Epi K. schrieb:

High Level ist doch 0.7 * VDD (2.31v) und Low Level 0.3 * VDD (0.99V). Meine Interrupt Funktion wird jedoch bei einer anliegenden Spannung von ca. 1.3 bis 1.7V ständig ausgelöst... wieso das? Verstehe ich gerade nicht...

Low ist alles unterhalb der Schwelle von 0.99V und High alles über der Schwelle von 2.31V (in diesem Fall). Der Bereich dazwischen ist der analoge Bereich und deswegen für Digitalsignale verboten. Da kann eben alles Mögliche passieren. Genau genommen gibt es auch noch eine maximale Anstiegs- bzw. Abfallzeit zwischen den Schwellen, die nicht überschritten werden darf. Auch digitale Elektronik ist nur digital, solange sie innerhalb der Spezifikation betrieben wird. Außerhalb wirds analog.

Gruß Klaus (der soundsovielte)

#7365365
Lesenswert?

Epi K. schrieb:

Meine Interrupt Funktion wird jedoch bei einer anliegenden Spannung von ca. 1.3 bis 1.7V ständig ausgelöst... wieso das?

Du meinst, es liegt eine bestimmte feste unveränderliche Spannung ohne jedes Rauschen oder Prellen an? Und dennoch werden andauernd Interupts ausgelöst?

Das ist seltsam. Die STM32-GPIO-Digitaleingänge haben Schmitt-Trigger und sollten also eine Hysterese haben.

LG, Sebastian

#7365399
Lesenswert?

Epi K. schrieb:

High Level ist doch 0.7 * VDD (2.31v) und Low Level 0.3 * VDD (0.99V). Meine Interrupt Funktion wird jedoch bei einer anliegenden Spannung von ca. 1.3 bis 1.7V ständig ausgelöst... wieso das?

Deshalb nennt man den Bereich zwischen high und low ja den verbotenen Bereich. Wie sich der Chip darin verhält, ist weder spezifiziert noch garantiert. Willst Du analoge Spannungen einlesen, mußt Du einen ADC-Eingang nehmen.

Epi K. schrieb:

Gibt es beim Interrupt / Falling Edge keine Hysterese ?

Schau ins Datenblatt des konkreten Chips. Manchmal muß man den Eingang erst so konfigurieren. Die Bus-Keeper Funktion könnte hilfreich sein, sie versucht einen offenen Eingang auf einen gültigen Logikpegel zu ziehen.

#7365430
Lesenswert?

Peter D. schrieb:

Schau ins Datenblatt des konkreten Chips.

könnte schwierig sein, beim

Epi K. schrieb:

Bluepill-board

kriegt man m.W. sowieso keine mehr mit originalem STM32, also:

Epi K. schrieb:

Oder habe ich ein China-Chip erwischt?

ziemlich sicher, ja. Verhält sich normalerweise hinreichend kompatibel, aber im Grenzbereich, wie bei dir im "verbotenen Bereich" zwischen 0.3 und 0.7*VDD, würde ich mich nicht darauf verlassen.

OP #7365494
Lesenswert?

Sebastian W. schrieb:

Du meinst, es liegt eine bestimmte feste unveränderliche Spannung ohne jedes Rauschen oder Prellen an? Und dennoch werden andauernd Interupts ausgelöst?

Genau, ich habe das Signal mit dem Oszilloskop angeschaut, es ist sauber und stabil ...

Ich werde wohl als nächstes ein anderes Board ausprobieren müssen...

bin auch der Meinung dass eine Hysterese / Schmitt Trigger integriert sein müsste...

Epi K. schrieb: Oder habe ich ein China-Chip erwischt

Εrnst B. schrieb:

ziemlich sicher, ja

und wenn schon, Hysterese / Schmitt-Trigger muss doch da auch integriert sein, das sind doch Basics, und andere Sachen (kompliziertere) wie CAN Bus funktionieren tiptop...

alles zwischen 1V und 2.1V sollte doch gar nicht als Zustand ausgewertet werden?

Benedikt S. schrieb:

Nimm doch einfach ein timer mit input feature als Eingang, dem kannst du einen digitalen Filter konfigurieren wenn dus nicht entprellen willst oder kannst. Der timer muss dafür nicht mal laufen der capture count intressiert dich ja nicht.

Ich habe ein Potentiometer am Interrupt Eingang

Beitrag #7365495 wurde von einem Moderator gelöscht.
Beitrag #7365497 wurde von einem Moderator gelöscht.
#7365500
Lesenswert?

Epi K. schrieb:

alles zwischen 1V und 2.1V sollte doch gar nicht als Zustand ausgewertet werden?

Das ist ein Missverständnis. Alles zwischen VIL und VIH wird sehr wohl als Zustand ausgewertet (es gibt keinen dritten Zustand "kein Zustand"), aber es ist nicht garantiert als welcher.

Spannungen zwischen VIL und VIH sind bei Digitaleingängen nur kurz während Schaltflanken vorgesehen, und der Schmitt-Trigger ist für eine gewisse Flankensteilheit ausgelegt.

Was versuchst du denn zu erreichen?

In meinem STM32F103C8T6-Datenblatt stehen übrigens andere Werte für VIL (0.35VDD) und VIH (0.65VDD) als von dir genannt.

Dort ist auch die Hysterese des Schmitt-Triggers als 200mV (TT-Pin) bzw. 0.05VDD (FT-Pin) angegeben.

LG, Sebastian

OP #7365514
Lesenswert?

Sebastian W. schrieb:

Das ist ein Missverständnis. Alles zwischen VIL und VIH wird sehr wohl als Zustand ausgewertet (es gibt keinen dritten Zustand "kein Zustand"), aber es ist nicht garantiert als welcher.

ich setze den Interrupt auf fallende Flanke, wie ist eine fallende Flanke definiert? Wenn doch ein Zustandswechsel von VIH zu VIL stattfindet, oder nicht? Somit darf kein Interrupt ausgelöst werden, wenn der Spannungspegel zwischen VIH und VIL liegt - oder nicht?

Sebastian W. schrieb:

Was versuchst du denn zu erreichen?

Ich habe ein analoges Hallsignal (Fahrrad, Sensor am Tretlager) und ich versuche die Anzahl Flanken auszuwerten, ist quasi ein Dreiecksignal im Frequenzbereich bis ca. 100Hz.

Sebastian W. schrieb:

In meinem STM32F103C8T6-Datenblatt stehen übrigens andere Werte für VIL (0.35VDD) und VIH (0.65VDD) als von dir genannt.

Ja, +/- das gleiche, ich habe die Werte von GWD genommen.

Sebastian W. schrieb:

Dort ist auch die Hysterese des Schmitt-Triggers als 200mV (TT-Pin) bzw. 0.05VDD (FT-Pin) angegeben.

Wie ist das zu verstehen? Nur 0.2V? Bei welchem Pegel setzt die Hysterese an und hört sie auf?

Sebastian W. schrieb:

Spannungen zwischen VIL und VIH sind bei Digitaleingängen nur kurz während Schaltflanken vorgesehen

Wie/wo ist "kurz" definiert? Bei meinem Dreiecksignal ist die fallende Flanke sehr steil, die steigende nicht... und es kann eben vorkommen dass das Signal bei einer bestimmten Spannung zwischen High und Low stehen bleibt (also nicht nur fix LOW und HIGH)

Gast #7365520
Lesenswert?

Epi K. schrieb:

Gibt es beim Interrupt / Falling Edge keine Hysterese ?

Die Eingänge haben keine hart definierten Schaltsschwellen. Die pegel die du genannt hast bedeuten, dass darunter garantiert LOW ist und darüber garantiert HIGH. Der Bereich dazwischen ist undefiniert.

AVR Mikrcontroller haben eine ausgeprägte Hysterese an ihren Eingängen. Bei deinem Bluepill Board kann die Hysterese viel kleiner sein. Erfahrungen mit originalen STM32F1 nützen dir auch wenig, weil auf deinem Board mit 99% Wahrscheinlichkeit ein gefälschter Chip sitzt.

Beitrag #7365521 wurde von einem Moderator gelöscht.
Gast #7365527
Lesenswert?

Epi K. schrieb:

alles zwischen 1V und 2.1V sollte doch gar nicht als Zustand ausgewertet werden?

Das hast du missverstanden.

Epi K. schrieb:

Dort ist auch die Hysterese des Schmitt-Triggers als 200mV (TT-Pin) bzw. 0.05VDD (FT-Pin) angegeben.

Wie ist das zu verstehen? Nur 0.2V? Bei welchem Pegel setzt die Hysterese an und hört sie auf?

Bei einigen Pins sogar nur 0,05 Volt. Dass heißt, die obere Schaltschwelle ist etwa 0,05 Volt höher als die untere. Wo genau "oben" und "unten" ist, ist nicht spezifiziert.

1.3 bis 1.7V

Du hast 0,4 Volt Differenz, was weit über der Schwelle des Schmitt Trigger ist.

Du kannst dich nur auf die Eigenschaften verlassen, die das Datenblatt dir zusichert. Alles Andere wäre Hoffen auf Glück, kann ich nicht empfehlen. Und denke dran, dass das Datenblatt von ST sehr wahrscheinlich nicht den Chip beschreibt, der vor dir liegt.

Auf jeden Fall solltest du nicht einfach davon ausgehen, dass die alle Eingänge aller Mikrocontroller immer einen Schmitt Trigger enthalten. Das ist inzwischen oft so, aber nicht selbstverständlich.

OP #7365528
Lesenswert?

Steve van de Grens schrieb:

deinem Board mit 99% Wahrscheinlichkeit ein gefälschter Chip sitzt.

na und, eine Hysterese sollte doch Basic sein? Meine Spannung bleibt z.B. fix bei 1.6V und trotzdem feuert der Interrupt voll drauflos... das ist doch nicht normal (ich habe keine Schwankungen von 0.2V oder so...also absolut stabil)?

Wie ist eine fallende Flanke definiert? Wenn doch ein Zustandswechsel von VIH zu VIL stattfindet und alles andere darf doch kein Interrupt auslösen, egal ob China Chip oder nicht....

Gast #7365529
Lesenswert?

Epi K. schrieb:

na und, eine Hysterese sollte doch Basic sein?

Nein ist es nicht. Das ist nur ein nettes Extrabonbon, das manche Hersteller einbauen. Es hat auch nicht jeder PKW einen Turbolader.

A Meine Spannung bleibt z.B. fix bei 1.6V und trotzdem feuert der Interrupt voll drauflos

Das glaube ich dir nicht. In realen Aufbauten hast du immer Rauschen. Auch in der Stromversorgung, die hier mit eine Rolle spielt.

Gast #7365533
Lesenswert?

Wie ist eine fallende Flanke definiert?

Ein Wechseln von garantiertem HIGH Pegel zu garantiertem LOW Pegel mindestens so schnell wie erforderlich. Die drei zahlen stehen im Datenblatt. Deine Schaltung erfüllt keins der drei Kriterien.

Epi K. schrieb:

naja, wie gesagt Hysterese ist egal,

Ich denke, du hast dir da ein paar Wunsch-Eigenschaften zusammen phantasiert und beharrst nun darauf, dass sie tatsächlich vorhanden sind. So wird das nichts. Wie gesagt kann man sich nur auf die Eigenschaften verlassen, die im Datenblatt zugewiesen sind.

OP #7365536
Lesenswert?

Steve van de Grens schrieb:

Ich denke, du hast dir da ein paar Wunsch-Eigenschaften zusammen phantasiert und beharrst nun darauf, dass sie tatsächlich vorhanden sind. So wird das nichts. Wie gesagt kann man sich nur auf die Eigenschaften verlassen, die im Datenblatt zugewiesen sind.

Hast du schon mal ein MCU Datenblatt gesehen mit GPIO Eingang für externen Interrupt ausgelegt (Falling / Rising Edge) und ohne Hysterese?

Ich nicht, deshalb fällt es mir gerade schwer dies als Erklärung zu nehmen... aber vielleicht hast du recht - nur muss ich das zuerst ausprobieren, IC wechseln etc. :-/

Gast #7365537
Lesenswert?

Epi K. schrieb:

Hast du schon mal ein MCU Datenblatt gesehen mit GPIO Eingang für externen Interrupt ausgelegt (Falling / Rising Edge) und ohne Hysterese?

Habe ich, aber ich habe hier und jetzt keine Lust auf eine Nebendiskussion über andere Mikrocontroller aus meiner Jugendzeit.

#7365542
Lesenswert?

Epi K. schrieb:

Wie ist das zu verstehen? Nur 0.2V? Bei welchem Pegel setzt die Hysterese an und hört sie auf?

Das ist eben nicht definiert. Es kann bei jeder Charge und jeder Fab unterschiedlich sein. Es kann sich auch mit der Temperatur und sonstigen Parametern ändern.

Epi K. schrieb:

es kann eben vorkommen dass das Signal bei einer bestimmten Spannung zwischen High und Low stehen bleibt (also nicht nur fix LOW und HIGH)

Dafür bist Du verantwortlich, daß das Signal garantiert immer <0.35VDD bzw. >0.65VDD je Zählpuls erreicht.

Du mußt das Signal entsprechend aufbereiten, einen anderen Sensor nehmen oder es per ADC einlesen. Manche MCs haben Schwellwertregister, mit denen der ADC-Wert ständig verglichen wird und die einen Interrupt auslösen können.

#7365543
Lesenswert?

Epi K. schrieb:

naja, wie gesagt Hysterese ist egal, weil die Spannung ist absolut stabil bei 1.6V ohne Schwankungen und trotzdem feuert der Interrupt voll drauf los...

ist das auch normal??

Ja. Jeder IC hat eine Induktivität zwischen dem GND-Pin und seinem internen GND-Potential. Wenn ein MC rechnet, entstehen Stromschwankungen, die in dieser Induktivität eine Spannung induzieren. Diese addiert sich zu allen Eingangsspannungen. Daher ist jedes Digitalsignal störbehaftet und die Abblockkondensatoren sind sehr wichtig. Bei analogen Eingängen kann man die Störungen unterdrücken, indem man differentiell mißt.

Ist der Schmitt-Trigger Eingang immer aktiv oder muß man ihn erst einschalten?

OP #7365544
Lesenswert?

Peter D. schrieb:

Dafür bist Du verantwortlich, daß das Signal garantiert immer <0.35VDD bzw. >0.65VDD je Zählpuls erreicht.

Du mußt das Signal entsprechend aufbereiten, einen anderen Sensor nehmen oder es per ADC einlesen. Manche MCs haben Schwellwertregister, mit denen der ADC-Wert ständig verglichen wird und die einen Interrupt auslösen können.

Ok gut, dann ist das wohl so, danke, wusste ich nicht und somit wieder was gelernt.

Vielen Dank an Alle.

Moderator (Firma: Titel) Persönliche Seite #7365551
Lesenswert?

Epi K. schrieb:

Oder habe ich ein China-Chip erwischt?

Was steht denn da wie drauf?

Epi K. schrieb:

Ich habe ein Potentiometer am Interrupt Eingang

Ich halte das für eine Idee, die nicht im Sinne der Erfinder ist. Nicht umsonst gibt es in anderen µC für solche analogen Aufgaben einen dedizierten Komparator. Oder eben die vielen ADC-Eingänge.

Abgesehen davon: was willst du mit diesem Ansatz generell erreichen? Eine definierte und zuverlässig stabile Schaltschwelle gibt es an einem Digitaleingang doch sowieso nicht.

Epi K. schrieb:

Aber ja, wenn die Hysterese bei 0.01V liegt...

Die entsprechende Spec müsste man im Datenblatt des tatsächlich verbauten µC nachschlagen.

OP #7365568
Lesenswert?

Ron-Hardy G. schrieb:

wo wird eigentlich das Pending bit im Pending register (EXTI_PR) rückgesetzt ?

das macht arduino :-D - hoffentlich...

Lothar M. schrieb:

Eine definierte und zuverlässig stabile Schaltschwelle gibt es an einem Digitaleingang doch sowieso nicht.

wusste ich nicht, ich dachte eine Falling Edge ist definiert mit einem Zustandswechsel von VIH zu VIL und alles andere wird nicht berücksichtigt. Aber da lag ich wohl falsch...

Gast #7365569
Lesenswert?

Epi K. schrieb:

Arduino Code , bzw. stm32duino, keine Ahnung ob dies implementiert ist und eingeschalten wird. Wüsste auch nicht in welchem und ob es überhaupt so ein Schmitt-Trigger Register gibt für den STM32F103... glaube eher nicht.

Das steht im Reference Manual. Lass dich durch die scheinbar einfachen Frameworks nicht dazu verleiten, auf das Lesen dieses enorm wichtigen Dokumentes zu verzichten!

Moderator (Firma: Titel) Persönliche Seite #7365576
Lesenswert?

Epi K. schrieb:

ich dachte ... Aber da lag ich wohl falsch...

Ja, ich habe mir auch schon manchmal ein Verhalten eines Chips erwartet, das ich dann aber nicht mit den Daten aus dem Datenblatt bestätigen konnte. Oder andersrum: wenn da nicht ausdrücklich steht, dass es tatsächlich Schmitttriggereingänge sind und diese auch noch mit entsprechenden Angaben bis hin zur Hysterese spezifiziert sind, dann darfst du ein solches Verhalten auch nicht erwarten.

Oder andersrum (und schlimmer noch): es kann sein, dass dein µC heute ein solches "schmitttriggerähnliches" Verhalten hat. Aber nach dem nächsten Stepping hat der Pin ein völlig anders Verhalten, das trotzdem noch mitten innerhalb der im Datenblatt angegebenen Spezifikationen liegt.

Epi K. schrieb:

Aber ja, wenn die Hysterese bei 0.01V liegt...

Dazu noch das hier:

Im Datenblatt steht also, dass die Hysterese des Pins "typisch 100mV" ist. Es ist dort aber kein Minimal- oder Maximalwert angegeben. In der Praxis bedeutet das: ja, es ist eine Hysterese vorhanden. Diese Hysterese hat irgendeinen Wert, der im Durchschnitt bei 100mV liegt.

Der Mittelwert der Messungen dort liegt mit 92mV ziemlich gut an den angegebenen typischen 100mV.

Beachte im Besonderen den Kommentar des ST Mitarbeiters in diesem Link: "do not stick to the use of these simple Schmitt triggers for analog measurement functions"

OP #7365591
Lesenswert?

Lothar M. schrieb:

Oder andersrum (und schlimmer noch): es kann sein, dass dein µC heute ein solches "schmitttriggerähnliches" Verhalten hat. Aber nach dem nächsten Stepping hat der Pin ein völlig anders Verhalten, das trotzdem noch mitten innerhalb der im Datenblatt angegebenen Spezifikationen liegt.

ok ja, aber wäre eine "Falling Edge" nicht definiert? Oder ab wann interpretiert eine MCU eine Falling Edge als Falling Edge, wo finde ich diese Bedingungen definiert?

Gast #7365626
Lesenswert?

Epi K. schrieb:

ab wann interpretiert eine MCU eine Falling Edge als Falling Edge, wo finde ich diese Bedingungen definiert?

Nirgendwo, das ist ja der Knackpunkt. Es sind nur die HIGH und LOW Pegel definiert. Also ist eine "Falling Edge" wie üblich der Wechsel von HIGH nach LOW.

Eine definierte Schaltschwelle gibt es da nicht.

Moderator (Firma: Titel) Persönliche Seite #7365651
Lesenswert?

Epi K. schrieb:

Ist die definierte Schaltschwelle nicht der HIGH und LOW Pegel? Sorry... irgendwie geht mir dies nicht in den Kopf

Du stellst dir das falsch herum vor. Dort werden keine Umschaltspannungen garantiert, sonden voneinander völlig unabhängige Grenzschaltschwellen für LOW und HIGH.

Epi K. schrieb:

High Level ist doch 0.7 * VDD (2.31v)

Da steht: bei einer Versorgung mit genau 3,3V wird eine Spannung mit 2,31V und höher sicher als HIGH erkannt. Aber auch: eine Spannung mit 2,30V kann bereits als LOW erkannt werden.

und Low Level 0.3 * VDD (0.99V)

Und da steht: eine Spannung mit 0,99V und weniger wird sicher als LOW erkannt, aber eine Spannung mit 1,00V kann bereits als HIGH erkannt werden.

#7365927
Lesenswert?

Epi K. schrieb:

Ist die definierte Schaltschwelle nicht der HIGH und LOW Pegel? Sorry... irgendwie geht mir dies nicht in den Kopf

Ja, wenn du (nicht zu langsam) vom HIGH Pegel zum LOW Pegel wechselst dann hast du definitiv eine FALLING Edge.

Aber: Wenn du von irgendwo unterhalb des HIGH Pegels zu irgendwo oberhalb des LOW Pegels wechselst dann hast du nicht definiert keine FALLING Edge.

Verstanden?

Lothar M. schrieb:

Im Datenblatt steht also, dass die Hysterese des Pins "typisch 100mV" ist. Es ist dort aber kein Minimal- oder Maximalwert angegeben.

In meinem https://www.st.com/resource/en/datasheet/stm32f103c8.pdf ist ein Minimalwert für die Schmitt-Trigger-Hysterese angegeben.

LG, Sebastian

Angehängte Dateien:
#7365951
Lesenswert?

Ron-Hardy G. schrieb:

wo wird eigentlich das Pending bit im Pending register (EXTI_PR) rückgesetzt ?

In __HAL_GPIO_EXTI_CLEAR_IT innerhalb von HAL_GPIO_EXTI_IRQHandler aus AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c, gerufen aus den installierten Interrupt-Handlern in AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\libraries\SrcWrapper\src\stm32\interrupt.cpp, denke ich. Aber ganz sicher bin ich da nicht ...

LG, Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren