Forum: Mikrocontroller und Digitale Elektronik Signale einer Botschaft vergleichen und Impuls senden


von Ronny (Gast)


Lesenswert?

Hallo,

ich zerbrech mir schon eine ganze Weile den Kopf und hoffe hier kann mir 
jemand weiter helfen. Das Problem ist wahrscheinlich einfach zu lösen, 
aber irgendwie habe ich eine Denkblockade.

Folgendes:

Alle 100ms empfange ich eine CAN-Botschaft die mehrere Signale enthält. 
Von diesen Signalen muss ich aber nur 2 auswerten. Default-Zustand 
dieser beiden Signale ist 1. Erst wenn beide Signale auf 0 gehen, soll 
ein Ausgangsimpuls von High für 400ms auf Low gezogen und danach wieder 
auf High gehen.
Die 2 Eingangssignale kann man ja quasi als Schalter verstehen.

Der Impuls kommt soweit, nur geht er nicht nach den 400ms wieder 
automatisch auf High, da beide Eingangssignale (die wie erwähnt aller 
100ms kommen) ja nun permanent auf 0 stehen. Erst wenn eines wieder auf 
1 geht, geht der Impuls auch wieder auf High.

Ich will aber, dass der Impuls gleich wieder nach 400ms auf High geht, 
auch wenn beide Eingangssignale noch 0 sind.

Programmiere in C (was aber für die Lösung eher zweitrangig ist, da mein 
Problem im Prinzip ja nur eine Zustandsabfrage darstellt, glaube ich 
zumindest :) )

Kann mir jemand nen Lösungsvorschlag nennen?

Danke,Ronny

von Karl H. (kbuchegg)


Lesenswert?

Ronny schrieb:


> Der Impuls kommt soweit, nur geht er nicht nach den 400ms wieder
> automatisch auf High,

davon steht ja auch nichts in deiner Spec.

> Ich will aber, dass der Impuls gleich wieder nach 400ms auf High geht,
> auch wenn beide Eingangssignale noch 0 sind.

Sobald in deiner Aufgabenstellung in irgendeiner Form das Stichwort 
'Zeiten' vorkommt, lautet die Lösung fast immer "Timer".
Detektierst du das erste mal die 0-0 Situation startest du einen Timer 
und stellst den Ausgang auf 0. Der Timer zählt die 400ms abzählt und 
nach Ablauf der Zeit schaltet er den Ausgang wieder auf High.
Das ist im Grunde nichts anderes als eine Eieruhr, die bei Ablauf der 
Zeit den Schaltvorgang auslöst.

von Ronny (Gast)


Lesenswert?

Karl Heinz schrieb:

> Detektierst du das erste mal die 0-0 Situation startest du einen Timer
> und stellst den Ausgang auf 0. Der Timer zählt die 400ms abzählt und
> nach Ablauf der Zeit schaltet er den Ausgang wieder auf High.
> Das ist im Grunde nichts anderes als eine Eieruhr, die bei Ablauf der
> Zeit den Schaltvorgang auslöst.

Danke erstmal für die Antwort. Das mit dem Timer hab ich auch so 
realisiert wie du geschrieben hast. Das Problem hier ist nur, dass ja 
die Botschaft alle 100ms kommt, der Impuls aber 400ms lang sein soll. 
Demzufolge wird also der Eingangssignalzustand alle 100ms verglichen und 
da beide Eingangssignale nun immer 0 sind, bleibt der Impuls auch 
weiterhin auf Low.

Vielleicht sollte ich eher schreiben, dass es eine C-ähnliche Sprache 
ist, wo scheinbar die eingehende Botschaft höher priorisiert ist als der 
Timer.

Das Prinzip ist hier so:

if((Eingangssignal1 = 0) && (Eingangssignal2 = 0)) { setze Timer}

on Timer
{
 ziehe Impuls 400ms auf Low
}

von Karl H. (kbuchegg)


Lesenswert?

Ronny schrieb:
> Karl Heinz schrieb:
>
>> Detektierst du das erste mal die 0-0 Situation startest du einen Timer
>> und stellst den Ausgang auf 0. Der Timer zählt die 400ms abzählt und
>> nach Ablauf der Zeit schaltet er den Ausgang wieder auf High.
>> Das ist im Grunde nichts anderes als eine Eieruhr, die bei Ablauf der
>> Zeit den Schaltvorgang auslöst.
>
> Danke erstmal für die Antwort. Das mit dem Timer hab ich auch so
> realisiert wie du geschrieben hast.

Dann hast du dabei einen Fehler gemacht.

> Das Problem hier ist nur, dass ja
> die Botschaft alle 100ms kommt, der Impuls aber 400ms lang sein soll.

Und wo ist da jetzt das Problem?
Wenn die Eieruhr schon läuft, dann darfst du sie halt nicht neu starten

>
> if((Eingangssignal1 = 0) && (Eingangssignal2 = 0)) { setze Timer}

  if((Eingangssignal1 = 0) && (Eingangssignal2 = 0) && der Timer nicht 
schon läuft) { setze Timer}

von xfr (Gast)


Lesenswert?

Du musst Dir noch in einer Variable speichern, ob Du den Timer schon 
ausgelöst hast. Wenn ja, löst Du ihn nicht nochmal aus. Erst wenn wieder 
eines der Eingangssignale 1 wird (und der Timer abgelaufen ist), setzt 
Du die Variable wieder zurück.

von Thomas W. (wagneth)


Lesenswert?

Wenn ich das richtig sehe willst Du folgendes haben :

- Sig1 und Sig2 werden auf low geprüft.
- Die Ergebnisse werden zu Sig3 verundet.
- Beim Übergang/flanke des Sig3 von low nach high wird
- ein Monoflop mit 400ms Getriggerd.

Stimmts ?

Die Flankenerkennung gibt nur dann ein High weiter wenn der alte und der 
neue Zustand unterschiedlich sind.

In Deinem fall auch nur von Low nach High !??

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.