Forum: Mikrocontroller und Digitale Elektronik Flankenerkennung von Peter D.


von Login (Gast)


Lesenswert?

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

von batman (Gast)


Lesenswert?

LOGISCHES UND?

von Theor (Gast)


Lesenswert?

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.

von Login (Gast)


Lesenswert?

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

von Gert (Gast)


Lesenswert?

Prüfe  'mal die { } Paare!

von Englisch Leera (Gast)


Lesenswert?

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".

von Theor (Gast)


Lesenswert?

@ 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.

von W.S. (Gast)


Lesenswert?

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.

von Login (Gast)


Lesenswert?

Gert schrieb:
> Prüfe  'mal die { } Paare!

Ja danke beim Kürzen fürs Forum passiert,
Aber trotzdem wird die Flanke nicht erkannt.

von Gerald K. (geku)


Lesenswert?

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.


Was gibt
1
printf("<%x>",get_edge(PINB & (1<<0));
aus

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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.

von Gerald K. (geku)


Lesenswert?

Gerald K. schrieb:
> printf("<%x>",get_edge(PINB & (1<<0));

wird RISE  zurück geliefert?

von Theor (Gast)


Lesenswert?

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

von Gerald K. (geku)


Lesenswert?

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

Außerdem ist der Einsatz von Macro kein guter Prorammierstil.
Daher der Vorschlag mit den Inlinefunktionen.

Die Frage ist, ob ein Pollen von Eingangssignalen überhaupt ein 
zuverlässiger guter Lösungansatz ist. Ich würde eine Interrupt 
gesteuerte Lösung  bevorzugen.

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.