'Nabend! Es geht um folgendes. Am negativen Eingang des Analog Komperators liegen 0,1V an. Am positiven kommt hin und wieder ein Sinus (1V Amplitude). Die lächerliche Aufgabe ist es nun, wenn der Sinus kommt den Pin PB3 für 500ms auf low zu ziehen, danach wieder auf high. Thats it. Nun möchte ich ja, dass wenn der Interrupt ausgelöst wurde der Rest des main() sauber abgehandelt werden kann, leider treten aber ständig Interrupts auf sodass mein PB3 schön mit der Frequenz geht. Wer findet den Fehler? Eventuell ist es schon zu spät... Danke! Lg Ps: Ohne dem Interrupt funktioniert das Programm so wie es sollte...
PB2 in der ISR schaltet auch je nach angelegter Frequenz. sei() und cli() hab ich auch schon probiert.
Hallo, das Problem hab ich anhand der Schilderung zwar nicht ganz verstanden, sehe aber den einen oder anderen Part, der Probleme machen kann. Den Interrupt solltest Du in der ISR des Analog-Comparators selber disablen (statt in der main), ansonsten kann der theoretisch gleich mehrmals zünden, bevor er deaktiviert wird, was wahrscheinlich nicht in Deinem Sinn ist. Unmittelbar bevor Du den Interrupt am Ende der Hauptschleife wieder aktivierst, solltest Du erst das Interrupt-Flag des Analog-Comparators manuell löschen - es könnte in der Zwischenzeit wieder gesetzt worden sein. cli() hast du hoffentlich nicht in der ISR verwendet, das hätte einen eher bescheidenen Effekt. Vielleicht hilft das weiter. Gruß, Andreas
Danke für deine Antwort! Was genau hast du nicht verstanden. Sobald ich EIN MAL den Interrupt ausgelöst habe will ich für 500ms PB3 auf LOW haben und danach soll für 3 Sekunden nichts passieren. Also ab dem ersten Interrupt sollte für 3,5 Sekunden kein weiterer Interrupt ausgelöst werden, obwohl das Signal am Comperator noch anliegt. Nach den 3,5 Sekunden kann der Interrupt des Analog Comperators wieder freigeschaltet werden. Ich werde deine Ratschläge beherzigen und berichten. Lg
Sollte es besser wissen schrieb: > Es geht um folgendes. Am negativen Eingang des Analog Komperators liegen > 0,1V an. Am positiven kommt hin und wieder ein Sinus (1V Amplitude). Ähem... Wenn ein Sinussignal anliegt, wo ist dann dessen Nullpunkt? Und: was passiert in der Zwischenzeit am positiven Eingang, wenn kein Signal anliegt? Oder anders ausgedrückt: Zeig' die Schaltung! > Die lächerliche Aufgabe ist es nun, wenn der Sinus kommt den Pin PB3 für > 500ms auf low zu ziehen, danach wieder auf high. Thats it. Wie man selbst bei einer nur rein formalen Analyse der Aufgabenstellung unschwer erkennen kann, ist sie eine schwachsinnige Laien-Äußerung, die sich sicher Politiker, BWLer und Künstler erlauben können, aber niemand, wirklich absolut niemand, der auf dem Gebiet der digitalen Logik unterwegs ist und sein es auch nur rein als Hobby. Es fehlen zwei Sachen: 1) Was genau soll der Trigger sein? Die Messung mittels AC erlaubt es bestenfalls die Periode einer Grundschwingung festzustellen oder daß überhaupt um einen gewissen Betrag von einem Bezugspotential abgewichen wird. Soll letzteres als Triggerbedingung reichen oder muß die Periode passen? Falls ja: über wieviele Schwingungen und wie genau muß sie passen, um gültig zu sein? 2) Das Problem der Retriggerbarkeit ist in der Aufgabenstellung absolut nicht behandelt. Soll sie in jedem Fall nach 500ms zurückkippen, oder den Status "aktiv" beibehalten, solange die Triggerbedingung erfüllt ist. Falls ersteres, ist wiederum zu definieren, nach welcher Zeit der Eingang wieder "scharf" werden darf.
So, hab nun ein wenig Zeit um mich wieder mit meinem Proggi zu beschäftigen. Dabei hab ich nun herausgefunden, dass es doch nicht am Interrupt des µC's zu liegen scheint. Eher an der _delay_ms(1) Routine. Diese scheint irgendetwas zu machen. Ich hab ihn auf div8 gefused, den internen Takt also durch 8. Dann sollte ich mit meiner Frequenz zwischen 1,25 und 1MHz liegen. Nun hab ich #define F_CPU 1250000UL geschrieben. Muss ich das noch an anderen Stellen machen? Eine sollte doch reichen. Da ich mich im Moment mit for loops beholfen habe werd ich wohl auf den Timer umsteigen um das ein wenig schöner zu machen :D! Immerhin bin ich mit dem Endergebnis zufrieden. Falls noch wer etwas weiß, immer her damit. Lg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.