Forum: Mikrocontroller und Digitale Elektronik kein definiertes Verhalten in der ISR


von lukker (Gast)


Lesenswert?

hier ein Ausschnitt meines Codes
1
#pragma vector=PORT2_VECTOR
2
__interrupt void P2_ISR()
3
{
4
  Entprell();
5
  
6
  if(P2IFG & T_SET)             // Wenn Int. von T_SET, dann
7
  {
8
    if(P2IES && 0x02 == T_SET)   // Wenn T_SET in P1IES == 1 ist, negative Flanke
9
    {
10
      INIT_TA2();               // aktiviere 2s-Timer
11
      P2IES &= ~(T_SET);        // Int. bei positiver Flanke
12
    
13
    }
14
    
15
    else                        
16
    {
17
       TA2CTL = 0x00;                            // Timer Stopp
18
      P2IES |= T_SET;                           // Zurück auf negative Flanke
19
      TX_String("Zu kurz gedrueckt\n");
20
    }
21
    
22
    P2IFG &= ~(T_SET);                          // Flanken Ereignis löschen
23
  }
24
}
25
26
27
28
void INIT_TA2(void)
29
{
30
  TA2CTL = TACLR;                               // Timer-Counter RESET auf Null
31
  TA2CCR0 = 65535;                              // 2s
32
  TA2CCTL0 = CCIE;                              // Interrupt bei TA2CCR0
33
  TA2CTL = TASSEL_1 + ID_0 + MC_1;              // ACLKK, 1:1, UP-Mode
34
}
35
36
37
38
39
#pragma vector=TIMER2_A0_VECTOR
40
__interrupt void TA2_0_ISR()
41
{
42
  P2IES |= T_SET;               // Zurück auf negative Flanke
43
  
44
  if(Saegezahn == 1)
45
  {
46
    Saegezahn = 0;
47
    //Wobbel_Dir = 1;
48
    TX_String("\nSignal Sinusfoermig\n");
49
  }
50
  else
51
  {
52
    Saegezahn = 1;
53
   // Wobbel_Dir = 1;
54
    TX_String("\nSignal Saegezahn\n");
55
  }
56
  Wobbel_Dir =1;
57
  i=3;
58
  TB0CCR0 = Freq [i];
59
  TB0CCR2 = PBreite [i]; 
60
61
  TA2CTL = 0x00;
62
  P2IFG &= ~(T_SET); 
63
}

Wenn ich den Taster 2sec drücke, sollte sich die Siganlform ändern. Tut 
sie auch. Aber "manchmal" (wähle den Begriff bewusst, denn dieses 
Verhalten tritt eben nur manchmal auf) springt er wieder zurück, als 
hätte er zweimal den Modus gewechslet, sodass der ursprüngliche Modus 
eingestellt ist.

Für Hilfe wäre ich dankbar

von lukker (Gast)


Lesenswert?

wenn ihr noch Informationen braucht, einfach melden

von jo mei (Gast)


Lesenswert?

lukker schrieb:
> wenn ihr noch Informationen braucht, einfach melden

Da es ja nur einen Controller auf der ganzen Welt gibt brauchst
du diesen natürlich nicht angeben, ebensowenig wie einen
Schaltplan.

Meistens können wir uns ja alle fehlenden Informationen durch
unsere Glaskugel herbeischaffen.

Also alles gut.

von STK500-Besitzer (Gast)


Lesenswert?

Taster per Interrupt abfragen? Nö!

lukker schrieb:
1
 __interrupt void P2_ISR()
2
 {
3
   Entprell();

Irgendwelche Funktionen (die womöglich auch noch auf irgendwas warten) 
in einer ISR aufzurufen, gehört verboten!
ISR sollen so kurz wie möglich und so lang wie nötig sein.
Ein Taster prellt im Millsekunden-Bereich. Das kann man hin und wieder 
mal abfragen, muss aber nicht mit einem Interrupt darauf reagieren.

von PittyJ (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Taster per Interrupt abfragen? Nö!
>
> lukker schrieb: __interrupt void P2_ISR()
>  {
>    Entprell();
>
Hab ich auch gleich gedacht. Entprellen in einer Interrupt-Funktion?
Da würde ich doch lieber den Taster in einer Timer-Funktion abfragen. 
Und wenn der N Zyklen aktiv ist, dann ist er wirklich 
gedrückt/losgelassen.

von lukker (Gast)


Lesenswert?

jo mei schrieb:
> Da es ja nur einen Controller auf der ganzen Welt gibt brauchst
> du diesen natürlich nicht angeben, ebensowenig wie einen
> Schaltplan.
>
> Meistens können wir uns ja alle fehlenden Informationen durch
> unsere Glaskugel herbeischaffen.
>
> Also alles gut.

MSP 430F5529

von Stefan A. (king-crash)


Lesenswert?

Ich kann mich meinem Vorredner nur anschließen. Um den Taster zu lesen 
gibt es eigentlich nur zwei saubere Methoden:

- Ein RC-Glied mit anschließendem Schmitt Trigger

- Per Timerinterrupt den Zustand des Tasters fortlaufen in ein Array 
schreiben und nur dann reagieren, wenn sich eine entsprechende Anzahl 
Werte nicht geändert hat.

von lukker (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Irgendwelche Funktionen (die womöglich auch noch auf irgendwas warten)
> in einer ISR aufzurufen, gehört verboten!
> ISR sollen so kurz wie möglich und so lang wie nötig sein.
> Ein Taster prellt im Millsekunden-Bereich. Das kann man hin und wieder
> mal abfragen, muss aber nicht mit einem Interrupt darauf reagieren.

PittyJ schrieb:
> Hab ich auch gleich gedacht. Entprellen in einer Interrupt-Funktion?
> Da würde ich doch lieber den Taster in einer Timer-Funktion abfragen.
> Und wenn der N Zyklen aktiv ist, dann ist er wirklich
> gedrückt/losgelassen.

ich habe den Hinweis  schon einmal bekommen. aber für jemanden wie mich, 
der kaum Programmieren kann, ist es die einfachste Möglichkeit die ganze 
Sache zu realisieren. Außerdem erfüllt es doch in dem einen, konkrekten, 
einfachen Fall seinen Zweck. Und deswegen würde ich gerne in dem einen 
konkreten, einfachen, Fall die Diskussion beiseite lassen. Grundsätzlich 
habt ihr Recht.

Aber das ändert ja auch nichts an meiner eign Problematik

von STK500-Besitzer (Gast)


Lesenswert?

Stefan A. schrieb:
> - Per Timerinterrupt den Zustand des Tasters fortlaufen in ein Array
> schreiben und nur dann reagieren, wenn sich eine entsprechende Anzahl
> Werte nicht geändert hat.

Wozu in ein Array schreiben?
Wenn sich der Zustand am Eingang geändert hat, wird ein Zähler 
zurückgesetzt.
Wenn der Zähler abgelaufen ist, ist der Taster-Zustand stabil.
Dafür braucht man nur einen Zähler...

von lukker (Gast)


Lesenswert?

lukker schrieb:
> Aber das ändert ja auch nichts an meiner eign Problematik

also nehme ich zumindest an... belehrt mich sonst bitte eines besseren

von STK500-Besitzer (Gast)


Lesenswert?

lukker schrieb:
> Außerdem erfüllt es doch in dem einen, konkrekten,
> einfachen Fall seinen Zweck.
Offensichtlich ja nicht, da es zu einem Fehlverhalten kommt.

> Und deswegen würde ich gerne in dem einen
> konkreten, einfachen, Fall die Diskussion beiseite lassen.
> Grundsätzlich habt ihr Recht.

Ja, natürlich haben wir Recht.
Warum machst du es dann so, wie alle Anfänger, die komischerweise immer 
wieder an genau diesem Vorgehen scheitern?

Aufgrund deines beschränkten Codes (der Rest scheint ja geheim zu sein), 
kann man das nicht mal ausprobieren.

von lukker (Gast)


Angehängte Dateien:

Lesenswert?

STK500-Besitzer schrieb:
> Aufgrund deines beschränkten Codes (der Rest scheint ja geheim zu sein),
> kann man das nicht mal ausprobieren.

hier code plus asm datei für strings.

STK500-Besitzer schrieb:
> Offensichtlich ja nicht, da es zu einem Fehlverhalten kommt.

ich verstehe aber nicht warum. oder zumindest den Zusammenhang, mit dem 
was ihr genannt habt.

von lukker (Gast)


Lesenswert?

das eign programm ist nochmal um einige Ecken größer, aber die testdatei 
(das im Anhang) reagiert wie die große Datei. Mit der Testdatei probiere 
ich schon seit einigen Tagen rum

von lukker (Gast)


Angehängte Dateien:

Lesenswert?

warte...ich habe auch ein Gegenargument

STK500-Besitzer schrieb:
>> Außerdem erfüllt es doch in dem einen, konkrekten,
>> einfachen Fall seinen Zweck.
> Offensichtlich ja nicht, da es zu einem Fehlverhalten kommt.

in der Datei im anhang ist das vollständige Programm. den Taster T_ONOFF 
habe ich auch per Interrupt gesteuert. Und der zeigt dieses Verhalten 
nicht.

von lukker (Gast)


Lesenswert?

hat jemand anderes vllt noch eine Idee? hab schon alles probiert

von leo (Gast)


Lesenswert?

lukker schrieb:
> if(P2IFG & T_SET)             // Wenn Int. von T_SET, dann
>   {
>     if(P2IES && 0x02 == T_SET)

Du magst mal den Unterschied von binaeren und logischen Operatoren 
nachschlagen. BTW der Mix von deutschen und englischen Variablennamen 
sowie Gross- und Kleinschreibung verbessert die Lesbarkeit deines 
Programmes nicht, eher im Gegenteil.

leo

von Hugo H. (hugohurtig1)


Lesenswert?


von lukker (Gast)


Lesenswert?

Hugo H. schrieb:
> Wie oft denn noch ? :-)

so oft bis es klappt =)

leo schrieb:
> Du magst mal den Unterschied von binaeren und logischen Operatoren
> nachschlagen.

wo steckt der Fehler in der Logik?

von MaWin (Gast)


Lesenswert?

lukker schrieb:
> so oft bis es klappt =)

Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
Ok, nimm die Verzögerung aus der ISR!
...

von lukker (Gast)


Lesenswert?

MaWin schrieb:
> k, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!
> Ok, nimm die Verzögerung aus der ISR!

aber was ändert das an meinem Problem?

von MaWin (Gast)


Lesenswert?

lukker schrieb:
> aber was ändert das an meinem Problem?

Was passiert, wenn ein neuer Interrupt ansteht, während du in der (ISR) 
Schleife die Rechenzeit vergeudest?

von lukker (Gast)


Lesenswert?

ich habs schon verstanden! lies mal nitte weiter oben! ich möchte die 
Aufmerksamkeit auf etwas anderes richten. Mir ist so echt nicht geholfen

von lukker (Gast)


Lesenswert?

die Diskussion ist für mich so:
" du scheiße prgrammiert"
"ich weiß, aber was ist mit der anderen Sache"
"übrigens. du hast scheiße programmiert"
usw....

von leo (Gast)


Lesenswert?

lukker schrieb:
> die Diskussion ist für mich so:
> " du scheiße prgrammiert"

Genau. Was ist nun mit dem '&&'?

leo

von MaWin (Gast)


Lesenswert?

lukker schrieb:
> ich möchte die
> Aufmerksamkeit auf etwas anderes richten

Vorm Lackieren muss der Rost entfernt werden!

lukker schrieb:
> Mir ist so echt nicht geholfen

Doch, wenn du
Ok, nimm die Verzögerung aus der ISR!

von lukker (Gast)


Lesenswert?

MaWin schrieb:
> lukker schrieb:
>> ich möchte die
>> Aufmerksamkeit auf etwas anderes richten
>
> Vorm Lackieren muss der Rost entfernt werden!
>
> lukker schrieb:
>> Mir ist so echt nicht geholfen
>
> Doch, wenn du
> Ok, nimm die Verzögerung aus der ISR!

wie ein schwachsinniger...

von lukker (Gast)


Lesenswert?

leo schrieb:
> lukker schrieb:
>> die Diskussion ist für mich so:
>> " du scheiße prgrammiert"
>
> Genau. Was ist nun mit dem '&&'?
>
> leo

und du leo, denk mal nach bevor du hier irgendwas reinschreibst. Echt 
peinlich soetwas. hat alles seine richtigkeit

von schwachsinnig (Gast)


Lesenswert?

Pack Dich mal an der eigenen Nase.

Du bestehst auf einer nachgewiesenermaßen nicht funktionierenden Lösung, 
willst sie irgendwie verbessert haben.

Dir wird freundlich dargelegt, dass Du eine Sackgasse beschritten hast.
Dir wird ein Weg aufgezeigt.

Du bestehst weiterhin auf einer nachgewiesenermaßen nicht 
funktionierenden Lösung, willst sie irgendwie verbessert haben.

Deinen Programmiercode verbessert aber niemand. Wozu auch, ist ne 
Sackgasse.

Nun fängst Du an beleidigend zu werden.

Starke Vorstellung.

Wenn Du das Forum hier länger verfolgst, so siehst Du, dies Muster gibts 
immer wieder.

Am Schluß der Diskussion wirds dann heftig.

Warum willst Du nicht einsehen, das Dein Weg eine falsche Fährte ist?

Noch dazu, da Du einräumst schlecht programmieren zu können. Wäre nicht 
grad dann geboten Ratschläge anzunehmen und Deinen Programmierstil zu 
verbessern?

von Einer K. (Gast)


Lesenswert?

[OT]

Ein witziger Thread...
Ich gehe mal Chips holen.

[/OT]

von leo (Gast)


Lesenswert?

lukker schrieb:
> und du leo, denk mal nach bevor du hier irgendwas reinschreibst.

>     if(P2IES && 0x02 == T_SET)

Du willst damit erklaeren dass obige Zeile sinnig ist. Aha.
https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect

leo

von schwachsinnig (Gast)


Lesenswert?

Die Chips hol ich mir immer schon, wenn Encoder oder Taster in ISR 
abgefragt werden.

Es ist so vorhersehbar was passiert. Hab in der Vergangenheit von 
niemanden gelesen, der einsichtig wurde. Alle haben bis aufs Messer ihre 
Lösung verteidigt. Sie muß ja funktionieren. Auch wenn sie es nicht 
richtig, nicht immer oder nicht immer richtig getan hat.

Warum glaubt jeder Anfänger er ist unfehlbar?

von lukker (Gast)


Lesenswert?

schwachsinnig schrieb:
> Warum willst Du nicht einsehen, das Dein Weg eine falsche Fährte ist?

sehe ich doch ein. wie schwer ist es, meinen Standpunkt 
nachzuvollziehen...??

von lukker (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> [OT]
>
> Ein witziger Thread...
> Ich gehe mal Chips holen.
>
> [/OT]

freud mich, dass wenigstens einer von der Sache hier partizipiert :P

von lukker (Gast)


Lesenswert?

und nochmal: ich kann 1000 verschiedene Lösungswege verfolgen, mein 
Beitrag zielt aber darauf ab, den fehler ( und damit ist nicht die 
Abfrage des Tasters über ISR gemeint) zu finden

von lukker (Gast)


Lesenswert?

schwachsinnig schrieb:
> Warum glaubt jeder Anfänger er ist unfehlbar?

glaubt niemand. aber genausowenig hat irgendjemand von eucht interesse, 
mal ernstahft auf meine Frage einzugehen. Danke für nichts

von lukker (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Ja, natürlich haben wir Recht.
> Warum machst du es dann so, wie alle Anfänger, die komischerweise immer
> wieder an genau diesem Vorgehen scheitern?
>
> Aufgrund deines beschränkten Codes (der Rest scheint ja geheim zu sein),
> kann man das nicht mal ausprobieren.

habe immernoch Hoffnung, dass STK500 sich meldet....

von Andreas B. (bitverdreher)


Lesenswert?

lukker schrieb:
> habe immernoch Hoffnung, dass STK500 sich meldet....

Da brauchst Du nicht zu warten. Ich erlöse Dich:
https://www.mikrocontroller.net/articles/Entprellung

von lukker (Gast)


Lesenswert?

Andreas B. schrieb:
> lukker schrieb:
>> habe immernoch Hoffnung, dass STK500 sich meldet....
>
> Da brauchst Du nicht zu warten. Ich erlöse Dich:
> https://www.mikrocontroller.net/articles/Entprellung

ich hoffe einfach mal das es ein Scherz ist, um mich zu provozieren...

von Einer K. (Gast)


Lesenswert?

lukker schrieb:
> Arduino Fanboy D. schrieb:
>> [OT]
>>
>> Ein witziger Thread...
>> Ich gehe mal Chips holen.
>>
>> [/OT]
>
> freud mich, dass wenigstens einer von der Sache hier partizipiert :P
Ich kann dir vielleicht sogar einen Tipp geben...

Leider kenne ich deinen Kompiler nicht.
In meiner kleinen Arduinowelt würde die Funktion Entprellen() ratzekahl 
weg optimiert werden.

Auch solltest du den Fehler mit dem && ausmerzen.

von lukker (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Auch solltest du den Fehler mit dem && ausmerzen.

also erstens: ich habe die Logik dahinter verstanden, die Wenigstens tun 
das
zweitens: mei8n programm funktioniert

von lukker (Gast)


Lesenswert?

am besten geht ihr jetzt alle nach hause

von Andreas B. (bitverdreher)


Lesenswert?

lukker schrieb:
> ich hoffe einfach mal das es ein Scherz ist, um mich zu provozieren...

Nein, das ist durchaus Ernst gemeint. Lesen und verstehen.

lukker schrieb:
> zweitens: mei8n programm funktioniert

OK, und was war jetzt Deine Frage?

Ich hole mir jetzt nur noch Popkorn. Ansonsten schaue ich nur noch zu.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

lukker schrieb:
> ich möchte die Aufmerksamkeit auf etwas anderes richten.

Du möchtest uns dazu bringen, den gleichen Fehler zu begehen, den du die 
ganze Zeit begehst:

Die offensichtlichen Fehler nicht angehen, fest darauf beharren, 
bestimmte Teile richtig gemacht zu haben, und dann auf entsprechende 
Ratschläge nicht mehr einzugehen.

Deine Herangehensweise ist immer noch dein größter Feind. Der Fehler 
sitzt zu 99,99% vor dem Bildschirm. Schau mal in einen Spiegel, wer das 
ist!

So wird es auch im dritten Anlauf wieder nichts.

von lukker (Gast)


Lesenswert?

okay, um euch Lügen zu strafen, werde ich das mit der iSR ändern

von Stefan F. (Gast)


Lesenswert?

> if(P2IES && 0x02 == T_SET)

T_SET hat den Wert 0x02. Der Ausdruck ist daher immer wahr. Beschäftige 
dich mit der Rangfolge von Operatoren.

Damit der Ausdruck nicht nur richtig sondern auch lesbar wird, würde ich 
auf magische Zahlen-Konstanten verzichten und schreiben:

> if (P2IES & T_SET)

Was deine Tastenabfrage im Interrupt angeht: Da wird Dir kein erfahrener 
Programmierer Helfen, weil das eine Sackgasse ist. Wenn dien aktuelles 
Problem gelöst ist, wird das nächste kommen, und dann noch ein und noch 
ein. Du wirst immer wieder um Hilfe bitten.

Am Wende hast du dann mit Hilfe von Fachleiten einen Scheiß hin 
gefrickelt, für den sich alle beteiligten nur schämen können. Wer will 
das schon Also helfen wir lieber nicht dabei, in diese Sackgasse zu 
fahren.

von Andreas B. (bitverdreher)


Lesenswert?

Stefan ⛄ F. schrieb:
> Also helfen wir lieber nicht dabei, in diese Sackgasse zu
> fahren.

Daß Du da überhaupt noch hilfst bei diesen Unverschämtheiten die sich 
der TO hier geleistet hat. Da bleibt einem ja das Popkorn im Halse 
stecken.

von Hugo H. (hugohurtig1)


Lesenswert?

Stefan ⛄ F. schrieb:
> Also helfen wir lieber nicht dabei, in diese Sackgasse zu
> fahren.

Hör Dir das "Geschwätz" :-) nicht an - Vollgas! Irgendwo wird sich schon 
eine Lücke auftun.

von Stefan F. (Gast)


Lesenswert?

Ein bisschen aufgewühlt bin ich schon, habe ganz vergessen, meine 
Tippfehler zu korrigieren.

von Andreas B. (bitverdreher)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ein bisschen aufgewühlt bin ich schon

Cool down! Popkorn holen und mitlesen. Der TO kommt schon noch. Wir 
werden noch eine Weile unseren Spaß haben.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

lukker schrieb:

> also erstens: ich habe die Logik dahinter verstanden, die Wenigstens tun
> das
> zweitens: mei8n programm funktioniert

Oh mein Gott! Da die Priorität von == über der von && liegt, wird zuerst 
der  Teilausdruck
1
0x02 == T_SET
 ausgewertet.
Wg.
1
#define T_SET   0x02
 ist der Teilausdruck stets wahr. Es bleibt übrig:
1
if(P2IES && 1)
 was zu
1
if(P2IES)
 vereinfacht wird.
Ich habe selten so genialen Code gesehen :-)

Grüßle
Volker

P.S. Übrigens ist die Prio von == auch höher als die des &, so dass 
sogar im K&R explizit empfohlen wird beim Ausmaskieren von Bits mittels 
&-Operator explizit zu klammern.

: Bearbeitet durch User
von Ich mach Bubu -was machst Du (Gast)


Lesenswert?

Schmeiß diese Dreckssprache vom Rechner und installiere Dir Bascom. Dort 
wird genau das ausgeführt, was Du schreibst, nicht, was der Compiler 
meint, wegoptimieren zu können.

Dann hast Du es auch nicht mehr nötig, mit von Popcorn vollgefressenen 
Fettsäcken um des Kaisers Bart diskutieren zu müssen.

von Einer K. (Gast)


Lesenswert?

Ich mach Bubu -was machst Du schrieb:
> Dort
> wird genau das ausgeführt, was Du schreibst, nicht, was der Compiler
> meint, wegoptimieren zu können.

Wie?

Bascom ist nicht in der Lage, die einfachsten Dinge zu optimieren?

Igitt!

von Hugo H. (hugohurtig1)


Lesenswert?

Arduino Fanboy D. schrieb:
> Bascom ist nicht in der Lage, die einfachsten Dinge zu optimieren?

Bascom schon ...

von Floh (Gast)


Lesenswert?

lukker schrieb:
> am besten geht ihr jetzt alle nach hause

Ich würde mal schätzen, daß alle zu Hause sind. Du etwa nicht?

von PittyJ (Gast)


Lesenswert?

was macht eigentlich

  TX_String("\nCCR2\n");

Uart Ausgabe?
So etwas versuche ich, nicht in einen ISR zu packen.

Für mich muss eine ISR möglich kurz und schnell sein. Meist wird da nur 
ein Flag getoggelt, ober ein Zähler hochgesetzt.
Alles andere läuft in zyklischen Normal-Tasks ab.
Insbesondere wenn der TX_String auch noch einen Interrupt wirft, weil 
ein Fifo über/unterläuft wird es lustig.


Mit diesen kurzen ISRs bin ich die letzten 10 Jahre gut gefahren.

von Niver (Gast)


Lesenswert?

lukker schrieb:
> ich habs schon verstanden! lies mal nitte weiter oben! ich möchte
> die Aufmerksamkeit auf etwas anderes richten. Mir ist so echt nicht
> geholfen

Dann poste doch endlich den gesamten scheiss sourcecode und Foto vom 
Aufbau

von Einer K. (Gast)


Lesenswert?

PittyJ schrieb:
> Mit diesen kurzen ISRs bin ich die letzten 10 Jahre gut gefahren.

Nicht nur du....
Aber dennoch macht es manchmal Sinn dort komplexere Automaten 
abzuhandeln.

Aber Wartezeiten, auch, oder gerade, zum entprellen, das erscheint auch 
mir einfach nur eine dumme Idee zu sein.

von Peter D. (peda)


Lesenswert?

lukker schrieb:
> Entprell();

Du kannst eine Delayschleife noch so oft "Entprell" nennen, es bleibt 
ein Delay und hat mit Entprellen nicht das geringste zu tun.

Funktionierendes Entprellen macht man durch Mehrfachabtastung in einem 
konstanten Intervall.
Z.B. 4-maliges Testen auf Gleichheit im 10ms Raster ist eine 
zuverlässige Lösung.

Vom Prizip her ist das eine Tiefpaßfilterung (25Hz) mittels gleitendem 
Mittelwert über 4 Messungen und den Triggerschwellen 0% und 100%, d.h. 
25%, 50% und 75% bewirken keine Änderung des vorherigen Zustandes.

Das mag auf den ersten Blick aufwendig erscheinen, aber die 
CPU-Belastung durch den 10ms Timerinterrupt ist lächerlich gering.

Diese Beispielwerte sind natürlich nicht in Stein gemeißelt, sondern nur 
das Prinzip.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Aber Wartezeiten, auch, oder gerade, zum entprellen, das erscheint auch
> mir einfach nur eine dumme Idee zu sein.

Es IST eine strunzdumme Idee. Immer und überall, nicht nur in ISRs, 
dort aber natürlich ganz besonders.

von Peter D. (peda)


Lesenswert?

P.S.:
Manche Entprell-Libs bieten als Zucker gleich die Entprellung eines 
ganzen Ports parallel, sowie lang/kurz Erkennung oder Repeatfunktion.

von Nop (Gast)


Lesenswert?

Ich sag nur "Code nicht auf englisch". Mehr muß ich schon gar nicht 
sehen, der gruselige Rest versteht sich wie eigentlich immer schon von 
selbst.

von Andreas B. (bitverdreher)


Lesenswert?

Nop schrieb:
> Ich sag nur "Code nicht auf englisch".

Meinst Du, dieses Elaborat wäre mit englischen Kommentaren auch nur eine 
Spur besser?
Die Codequalität hat ziemlich wenig mit der Kommentarsprache zu tun.

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> Arduino Fanboy D. schrieb:
>
>> Aber Wartezeiten, auch, oder gerade, zum entprellen, das erscheint auch
>> mir einfach nur eine dumme Idee zu sein.
>
> Es IST eine strunzdumme Idee. Immer und überall, nicht nur in ISRs,
> dort aber natürlich ganz besonders.

Halt!


Mich erschrickt gerade, dass ein C-Hasser mit mir, einem C++ 
Befürworter, einer Meinung ist.

Ist das noch normal?

von zufällig vorbeigeschaut (Gast)


Lesenswert?

Dieser Thread hat Potential.
Fehlt nicht mehr viel und er wird diesen hier 
Beitrag "Amper hoch skillen?" locker in den Schatten 
stellen...

von Stefan F. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Halt!
> Mich erschrickt gerade, dass ein C-Hasser mit mir, einem C++
> Befürworter, einer Meinung ist.
> Ist das noch normal?

Ja, denn eigentlich hasst er C nicht. Das ist nur eine Rolle die er 
spielt, um sich möglichst oft künstlich aufregen zu können. Wenn wir 
alle primär über Assembler diskutieren würden, hätte er sich ASM-Hasser 
genannt und so verhalten.

Im Familienkreis habe ich eine Frau, die denkt sich aus, was andere 
schlechtes denken oder tun könnten und dann klagt sie darüber, wie 
schlecht es ihr oder anderen Angehörigen wegen diesen schlechten 
Menschen geht. Dabei haben die überhaupt nichts getan!

Wenn sie z.B. jemand mit kräftigen Armen sieht, malt sie sich aus, wie 
feste er wohl seine Frau schlagen könnte. Und dann tut ihr die Frau leid 
und die Betreiber seines Fitness-Studios sind auch ganz böse, weil sie 
ihn ja dazu ausbilden, seine Frau zu schlagen, usw....

Warum tut sie das? Keine Ahnung, aber sie kann wohl nicht anders. Manche 
Menschen machen sich gerne Feinde - zumindest im Kopf.

von ampere (Gast)


Lesenswert?

@ Stefan ⛄ F.:  Einspruch

 "Amper hoch skillen?" hat allein schon durch seine Wortwahl und seine 
unendlichen Möglichkeiten zittiert zu werden den Gipfel allen Potentials 
erreicht.

Entprellen über Zeitschleifen kann ich nur den zweiten Platz zuweisen, 
es kommt zu oft als Thema (es ist schon wieder ein neuer eröffnet).

von Carl D. (jcw2)


Lesenswert?

PittyJ schrieb:
> was macht eigentlich
>
>   TX_String("\nCCR2\n");
>
> Uart Ausgabe?
> So etwas versuche ich, nicht in einen ISR zu packen.

so weit so gut.

> Für mich muss eine ISR möglich kurz und schnell sein. Meist wird da nur
> ein Flag getoggelt,

d.h. Du duplizierst das HW-Flag, das den Int auslöst.

>      ober ein Zähler hochgesetzt.
> Alles andere läuft in zyklischen Normal-Tasks ab.

Dazu braucht man für simple Flags keinen Int dazwischen, es sei denn, 
die zeitliche Verzögerung wird "gebraucht". Oder der Flash ist noch in 
Teilen frei.

> Insbesondere wenn der TX_String auch noch einen Interrupt wirft, weil
> ein Fifo über/unterläuft wird es lustig.
Hä??
Wenn Puffer überlaufen, dann braucht man sinnvolle Behandlung, notfalls 
ignoriert mal das empfangene Zeichen, wartet bis wieder Platz im 
Sendepuffer frei ist, je nach Anforderungsprofil.

> Mit diesen kurzen ISRs bin ich die letzten 10 Jahre gut gefahren.

Und ich hab in den letzten 40 Jahren so manches dazugelernt.

von PittyJ (Gast)


Lesenswert?

Carl D. schrieb:
>> Insbesondere wenn der TX_String auch noch einen Interrupt wirft, weil
>> ein Fifo über/unterläuft wird es lustig.
> Hä??
> Wenn Puffer überlaufen, dann braucht man sinnvolle Behandlung, notfalls
> ignoriert mal das empfangene Zeichen, wartet bis wieder Platz im
> Sendepuffer frei ist, je nach Anforderungsprofil.

Wenn ich in einer ISR eine Funktion aufrufe, die darin noch einen 
weiteren Interrupt auslösen kann, dann kann das je nach Platform lustige 
Effekte liefern.
So etwas versuche ich zu vermeiden.
Wenn man die Dinge einfacher hält, können weniger Probleme auftreten. 
Und meine ISR funktionieren.

von Floh (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Mich erschrickt gerade, dass ein C-Hasser mit mir, einem C++
> Befürworter, einer Meinung ist.

Pass auf, dass er sich jetzt nicht umbenennt in "C++ Hasser" :-D

von Andreas B. (bitverdreher)


Lesenswert?

Jetzt haben wir den TO vertrieben.
:-(
Popkorn einpack ....

ampere schrieb:
> Entprellen über Zeitschleifen kann ich nur den zweiten Platz zuweisen,

Nee, den Platz muß er sich mit den LEDs ohne Vorwiderstände teilen.

von Carl D. (jcw2)


Lesenswert?

Floh schrieb:
> Arduino Fanboy D. schrieb:
>> Mich erschrickt gerade, dass ein C-Hasser mit mir, einem C++
>> Befürworter, einer Meinung ist.
>
> Pass auf, dass er sich jetzt nicht umbenennt in "C++ Hasser" :-D

Das ist doch per Vererbung eh mit drin.

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.