Forum: Mikrocontroller und Digitale Elektronik Steh am Schlauch (ATTiny13 Analog Comperator)


von Sollte es besser wissen (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sollte es besser wissen (Gast)


Lesenswert?

PB2 in der ISR schaltet auch je nach angelegter Frequenz.

sei() und cli() hab ich auch schon probiert.

von Andreas (Gast)


Lesenswert?

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

von Sollte es besser wissen (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Sollte es besser wissen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.