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...
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...
Warum legt du nicht erst mal zum Testen saubere Logikpegel an?
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.
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.
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.
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.
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.
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.
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
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?
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.
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.
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?
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.
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)
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.
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.
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....
Nein ist es nicht. Das ist nur ein nettes Extrabonbon, das manche
Hersteller einbauen.
Es hat auch nicht jeder PKW einen Turbolader.
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...
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.
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.
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. :-/
Du kannst das drehen und wenden, wie du willst. Es ist und bleibt
falsch, ein Poti an einen digitalen Eingang anzuschließen.
jedes digitale Signal ist im weitesten Sinn auch analog... die Frage ist immer was man unter einer "steilen Flanke" versteht?
Ab wieviel steil ist es digital oder noch analog :-D?
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.
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.
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?
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.
Ist der Schmitt-Trigger Eingang immer aktiv oder muß man ihn erst
einschalten?
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.
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.
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...
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!
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.
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"
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?
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.
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.
Ist die definierte Schaltschwelle nicht der HIGH und LOW Pegel? Sorry... irgendwie geht mir dies nicht in den Kopf
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.
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.
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 ...