Hallo,
ich muss an einem mega16 an int1 zwei interuptauslöser
anschliessen.Ich muss deswegen,weil alle anderen schon belegt sind.
Die zwei auslöser lösen den interupt durch steigende flanke aus.
Soweit läuft das auch alles.
Nun mein Problem:Wie kann ich feststellen,welcher der beiden den
Interupt ausgelöst hat.Ich habe an portd nur noch einen pin frei.
Hat jemand eine Idee,wie ich das Hardware seitig hinbekomme.
Danke im voraus.
Andy
Wenn das Signal lang genug ist, würde ich einfach eine der beiden
Signalleitungen mit auf den PortD legen. In der ISR fragst du dann
einfach den Pegel ab. Ist er H, wars das Signal, welches parallel mit
auf dem Port liegt, ansonsten wars das andere Signal. Dumm wäre der
Zustand, wenn beide gleichzeitig kämen, dann würde die Routine immer nur
auf das an PortD mit anliegende Signal reagieren. Hm, grübel...
Sven
Hallo,
danke für die antwort.
Es handelt sich bei den auslösern um Türkontakt,die bei geöffneter Tür
ebenfalls öffnen,bei geschlossener Tür hängt die leitung an GND.
Int1 ist mit einem 10k Widerstand auf 5V und ist somit bei geschlossener
Tür
auf low.Das Problem ist eben,es hängen 2 Von diesen Kontakten in
seperaten Schleifen an int1.
Wie kann ich die bloss unterscheiden ,grübel seit vielen Stunden
Andy
Mechanische Schalter hängt man nicht direkt an Interrupt-Eingänge,
sondern man fragt sie periodisch z.B. in einem Timer-Interrupt ab. Siehe
Artikel Entprellung.
Mehrere flankengetriggerte Interrupts zusammen an einem Pin - das geht
nur gut wenn man sich sicher sein kann, dass nie mehrere Ereignisse
zeitnah drohen, weil sonst gern mal einer über Bord geht. Wobei man in
dem Fall dann meist schon weiss welcher es sein muss.
Problemlos funktioniert es hingegen mit pegelgetriggerten Interrupts.
Also wenn das Türkontakte sind, würde ich das nicht über Interrupt
machen, sondern pollen. Und dann kannst du den einen TK an den einen Pin
hängen und den anderen TK an den anderen Pin. Eine Abfrage alle 10ms
sollte da vollkommen reichen.
Naja, Taster als Interruptquelle kann schon sinnvoll sein: um den
Kollegen aus dem Schlaf zu reissen. Man muss das Prellen halt mit
berücksichtigen.
Wenn du den Pin an Port D mit einem an Port A tauschen kannst, dann
kannst du verschiedene Taster mühelos per ADC unterscheiden. Der eine
hat einen Serienwiderstand, der auf 1V runterzieht, der andere keinen
und zieht auf 0V.
Hallo,
danke für die Antworten.Das mit dem entprellen habe ich schon
beachtet.Wird ein Interupt ausgelöst,wird mit einem Timer 4 mal geprüft
ob das Signal stabil anliegt.Wie gesagt,ich habe noch einen Pin frei und
würde das
schon gerne über Interupt laufen lassen.
Keiner eine idee,wie ich einen von den beiden zusätzlich auf den anderen
pin laufen lassen kann und damit sicher bestimmen kann,welcher ausgelöst
hat.
gruss
Andy
Läuft ähnlich. Einer der beiden Taster kriegt einen Serienwiderstand,
mit dem der Pin wenn gedrückt auf 1V kommt, der andere hat keinen. Der
zusätzliche Pin hängt mit einem Widerstand dran und zieht, wenn als
Ausgang auf 1 (sonst Eingang) zusätzlich hoch, so dass bei dem Taster
mit Widerstand dann nicht mehr 1V sondern 4V rauskommt. Beim Taster ohne
Widerstand ändert der jedoch nix.
>wird mit einem Timer 4 mal geprüft ob das Signal stabil anliegt.
Warum lässt Du den Timer dann nicht einfach ständig laufen, um davon
gesteuert die Tasten permanent z. B. alle 20 ms abzufragen? Ist doch
viel einfacher. Die zusätzliche Rechenzeit dafür ist völlig peanuts.
Ich kenn Dein Projekt zwar nicht, aber ich behaupte mal, die CPU-Last
würde sich bei Dauer-Polling so beispielsweise von 1.36 % auf 1.38 %
erhöhen - wow.
>Wie gesagt,ich habe noch einen Pin frei und würde das>schon gerne über Interupt laufen lassen.
Tasten über Interrupts laufen lassen, um sie dann mit einem Timer zu
entprellen, halte ich für unnötig umständlich, wenn man die Sache
stattdessen genausogut ganz über den Timer abwickeln kann.
>Keiner eine idee,wie ich einen von den beiden zusätzlich auf den anderen>pin laufen lassen kann
Was für nen "anderen Pin"? Wieviele Pins hast Du jetzt noch frei -
einen oder zwei? Für zwei Tasten an einem Digital-Pin gibt es keine
(einfache) Lösung. Zeig mal den Schaltplan Deines Projekts.
Möglicherweise lässt sich was finden, wodurch ein Portpin frei wird.