Ich möchte am Ausgang einen fix definierten Zustand ausgeben (LO), der allerdings geändert werden soll, wenn an einem bestimmten Eingang eine Pegeländerung stattgefunden hat. Also wenn beim Einschalten der Eingang HI oder LO ist soll am Ausgang ein LOW ausgegeben werden. Ändert sich jedoch der Eingang entweder auf LO oder auf HI, je nachdem was vorher war, soll am Ausgang ein HI ausgegeben werden, sollange sich der Pegel am Eingang nicht ändert. Das ganze in C für einen ATMEGA.
Gast
#2208776
Ja und? Eingangszustand merken, wenn veraendert, dann Ausgang auf High setzen. citb
Ja, soweit war ich auch schon. Nur wo merken? Wenn ich das ganze in den Timer Interrupt schmeiße wird der gemerkte Zustand ja ständig überschrieben. Gleichzeitig muß ich ja permanent den Zustand abfragen. Wie mach ich das?
Gast
#2208796
C-Tutorial lesen und durcharbeiten. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial citb
Gast
#2208802
Das geht sogar in Assembler ;-)
Ja, warum sollte es in Assembler nicht gehen? Wenn, dann dort sowieso.
Also, niemand einen Tip für mich? Es geht ja nicht nur um den Einschaltzustand, sondern immer dann wenn sich das Bit ändert.
Also ich habs jetzt mal so versucht:
1 | |
2 | |
3 | |
4 | |
5 | |
Läuft aber nicht so ganz. Ausgang bleibt ständig auf HI, obwohl die Variable lichtval gleich LICHT_EIN gesetzt wird.
Gast
#2209019
Ich sehe keinen Ausgang. citb
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
Also im Normalzustand soll der Ausgang immer auf LO sein. Nur bei einem Flankenwechsel soll er für 150ms auf HI gehen.
Hi, is zwar Assembler für'n Pic aber vielleicht hilft's Dir ja auf die Sprünge :) Steht so bei mir in der Interruptroutine.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Leider, damit fang ich gar nichts an. Aber ich hab noch einen Fehler entdeckt. Das SCHALTER_PORT |= (WRITE); gehört natürlich noch weg. Funkt aber immer noch nicht. Bleibt immer auf LO der Ausgang.
Manfred W. schrieb: > Leider, damit fang ich gar nichts an. Du benötigst eine Hilfs-Var. wo Du Dir merkst was für ein zustand beim letzten Test am Port war, um entscheiden zu können ob ein Pegel Wechsel stattgefunden hat!
Ja, in meinem Fall die "lichtval" Diese wird mit dem aktuellen Zustand gefüttert.
Gast
#2209113
Hmm, könnte es vielleicht an der zweiten If-Abfrage liegen. Angenommen Du erkennst "LICHT_EIN != lichtval" und setzt den counter auf 25. Im nächsten durchlauf wird counter zwar um eins runtergezählt, es gilt jedoch weiterhin "LICHT_EIN != lichtval", weshalb die If-Abfrage den counter wieder auf 25 setzt (und so weiter und sofort...). Wie gesagt möglicherweise, eventuell, vielleicht (ich bin nicht wirklich in der Materie verhaftet) :-) Nur so als idee...
Du hast recht. Abgesehen davon gehört das:
1 | |
doch rein. Sonst geht der Ausgang ja nie auf HI. So läufts nun:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
Danke dir für den Hinweis!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.