Flankenerkennung von Peter D.

Gast #6325961
Guten Abend,
ich seh den Wald vor lauter Bäumen nicht.
Ich möchte die Flankenerkennung von Peter verwenden.
Beitrag "Re: einfache und übersichtliche Flanken erkennung"
Aber ich bin zu doof dazu.
1
if (get_edge(PINB & (1<<0))==RISE)
2
  {
3
    uputs_("PINB0 RISE\n\r");
4
  }


Wenn ich diesen Pin auf 1 lege wird der Text bei jeden Aufruf 
ausgegeben.
Was mach ich falsch?
Danke für die Hilfe
Gast #6325988
Zeige mal den vollständigen Code. Der Schnipsel alleine ist OK. (Ich 
habe den Code von Peter nicht probiert, habe aber ziemlich grosses 
Vertrauen darin, dass er funktioniert).

Abgesehen davon mag das unerwartete Verhalten an elektrischen Ursachen 
liegen.
Gast #6326074
Zeige mal den vollständigen Code. Der Schnipsel alleine ist OK. (Ich
habe den Code von Peter nicht probiert, habe aber ziemlich grosses
Vertrauen darin, dass er funktioniert).
1
int main(void)
2
{
3
    DDRA |=  (1<<OUT_FAN)|(1<<OUT_GENERATOR)|(1<<OUT_PUMP)|(1<<OUT_RELAY)|(1<<OUT_LED_YELOW1)|(1<<OUT_LED_YELOW2)|(1<<OUT_RUNLED);
4
  DDRB |=  (1<<OUT_LED_RED)|(1<<OUT_LED_YELOW3)|(1<<OUT_LED_YELOW4);
5
  
6
  #ifdef APP_DEBUG
7
    fdevopen(s_sputchar, NULL);
8
  #endif  
9
  // MAIN LOOP
10
    while (1) 
11
    {
12
    #ifdef APP_DEBUG
13
      if (state != old_state)
14
      {
15
        old_state=state;
16
        printf("ACTUAL STATE %d\n\r",state);
17
      }
18
    #endif
19
    if (akt_testmode_time)
20
    {
21
      //if (get_edge(1<<0))==RISE)
22
      if (get_edge(PINB & (1<<IN_DIP_SW4))==LOW)
23
      {
24
        #ifdef APP_DEBUG
25
          printf("DIP4_R\r\n");
26
        #endif
27
      }
28
    }
29
}

Hier mein Code.
Ich traue Peter auch zu 100% und bin mir sicher das ich schuld bin
Gast #6326094
Login schrieb:
> printf("ACTUAL STATE %d\n\r",state);

Für die, die im Englisch-Unterricht nicht aufgepasst haben
oder in dümmlicher Weise einfache Übersetzungen wählen wollen
(es liesse sich im Wörterbuch ja einfach nachschlagen):

"actual" bedeuted im Englischen nicht "aktuell" sondern "tatsächlich".

Wenn ein Englisch-Sprachiger "aktuell" meint sagt er "current".

In diesem programmtechnischen Zusammenhang von tatsächlichen und
nicht-tatsächlichen Status zu sprechen erscheint mir nicht sinnvoll.
Dann also: "aktuell", "current".
Gast #6326108
@ Login

Abgesehen davon, das der Code unvollständig und syntaktisch inkorrekt 
ist, sehe ich darin kein Problem.

Ich empfehle, den Code auf das absolute Minimum zu reduzieren, bei dem 
der Fehler noch auftritt. Auch sollte der Code ohne Fehler und Warnungen 
compilierbar sein.

Vielleicht so:
ACHTUNG: das define muss noch vervollständigt werden.
Dazu fehlt noch die Definition von s_sputchar.
1
#define IN_DIP_SW4 ???
2
int main(void)
3
{
4
   fdevopen(s_sputchar, NULL);
5
   while (1) 
6
   {
7
      if (get_edge(PINB & (1<<IN_DIP_SW4))==LOW)
8
      {
9
         printf("DIP4_R\r\n");
10
      }
11
   }
12
}

Bitte versuche diesen Code einmal und berichte.
Gast #6326120
Login schrieb:
> Ich möchte die Flankenerkennung von Peter verwenden.
> ...
> Aber ich bin zu doof dazu.

Ich möchte dir da keineswegs widersprechen. Aber was du an Beispiel 
zeigst, ist unverständlich.

Merke: Eine Flankenerkennung soll erkennen, ob sich in einem oder 
mehreren Signalen seit der letzten Flankenerkennung etwas geändert hat.

Also etwa so:
1
var AlleMeineFlanken,  
2
    MerkeAlleMeineBits : IrgendeinpassenderTyp;
3

4
AlleMeineFlanken = AlleMeineBits XOR MerkeAlleMeineBits;
5
if AlleMeineFlanken <> 0
6
then
7
begin
8
  for every Bit in AlleMeineFlanken do
9
  if diesesBit=1 then behandle_es
10
  MerkeAlleMeineBits = AlleMeineBits;
11
end

kurzum, zum Erkennen von Flanken muß man den Ist-Zustand mit dem 
vorherigen Zustand vergleichen, der vor der letzten Behandlung der 
geänderten Bits war. Und wenn man die Unterschiede ermittelt hat, muß 
man den jetzt aktuellen Zustand für später speichern.

ist doch easy!

W.S.
#6326144
Gerald K. schrieb:
> Login schrieb:
>> Ich möchte die Flankenerkennung von Peter verwenden.
>
> Ich würde den MACRO in eine INLINE Funktion umwanden.
> Ich vermute das Problem liegt an der Parameterrückgabe.

Eigentlich ist das Makro so auch gar kein gültiges C. Ich nehme an, es 
wird irgendeine gcc-Erweiterung genutzt.

W.S. schrieb:
> kurzum, zum Erkennen von Flanken muß man den Ist-Zustand mit dem
> vorherigen Zustand vergleichen, der vor der letzten Behandlung der
> geänderten Bits war. Und wenn man die Unterschiede ermittelt hat, muß
> man den jetzt aktuellen Zustand für später speichern.

Du bist ganz offensichtlich dem Link nicht gefolgt, sonst hättest du 
gesehen, dass das verwendete Makro das bereits tut.
Gast #6326151
Rolf M. schrieb:
> Gerald K. schrieb:
>> Login schrieb:
>>> Ich möchte die Flankenerkennung von Peter verwenden.
>>
>> Ich würde den MACRO in eine INLINE Funktion umwanden.
>> Ich vermute das Problem liegt an der Parameterrückgabe.
>
> Eigentlich ist das Makro so auch gar kein gültiges C. Ich nehme an, es
> wird irgendeine gcc-Erweiterung genutzt.
>
> [...]

Du hast völlig recht, Rolf. 
https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.