Du kannst beim 644 doch jeden I/O als externen Interrupt verwenden. Damit ist's doch dann kein Problem mehr, auf eine steigende bzw. fallende Flanke zeitnah zu reagieren.
askazo
Hallo,
hab das Problem das ich die länge eines Pulses mit einem Atmega644 messen will ich aber bisher nicht so erfolgreich damit bin.
Ausgangssituation:
Ich bekomme an einem Port des AVRs ein Signal davon will ich messen wie lange das Signal high ist. Die Tx eingänge kann ich nicht nutzen da sie bereits mit anderen funktionen belegt sind, sonst könnte ich bei steigende flanke den counter loszählen lassen!!!
Habe leider den quelltext nicht da aber im grunde funktioniert es so:
ich lasse den counter loszählen sobald ich an pin7 ein high bekomme danach lasse ich mir den wert des tcnt ausgeben.
Doch bei einem konstanten Signal bekomme ich verschiedene Werte???
Vielen Dank schonmal für sämtliche hilfen
p.s. wie kann ich eigentlich zwei 8bit counter kaskadieren???
Du kannst beim 644 doch jeden I/O als externen Interrupt verwenden. Damit ist's doch dann kein Problem mehr, auf eine steigende bzw. fallende Flanke zeitnah zu reagieren.
askazo
Hi,
das Problem wird folgendes sein, da du ja auch ein Hauptprogramm mit bestimmter Zykluszeit hast kann sich die gemessene Signallänge im ungünstigsten Fall um die Zykluszeit verlängern. Da du deinen Port wahrscheinlich nur einmal im Programm abfrägst.
Hoffe ich konnt dir weiterhelfen.
mfg franz
@franzl: Ja, genau da liegt das Problem. Und dem kann man abhelfen, indem man auf das Messsignal mit einem Interrupt reagiert.
@waxology: Die T0 bzw. T1-Pins würden Dir im übrigen auch nicht helfen - die dienen nur als externe Taktquellen für die Counter, nicht als Start-/Stop-Signalquellen.
askazo
Hallo
lade einen Kondensator und messe die Spannung.
Mit freundlichen Grüßen
Benno
Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde
Wenn man sowas vorher weiß, dann legt man den Puls, dessen Länge man bestimmen will an den ICP Pin des µC. Der ist nämlich genau dafür da!
Der sorgt auf komfortable Weise dafür, dass der Counter genau solange countet, wie dort High oder Low anliegt, wie man will. Da das ganze IRQ gesteuert ist, muss man sich keinen Kopf machen und hat die Probleme des Pollens nicht.
Gruß
Huch, den ICP kannte ich auch noch nicht.
Danke Gock, gut das zu wissen
askazo
Da sieht man 's wieder: Man lernt nie aus!
Wenn der ICP nicht mehr frei ist, lässt sich das auch über den AnalogComparator steuern. Mit ein bisschen Geschick ist es sogar möglich, die ADC Eingange auf den AnalogComparator zu multiplexen, dann kann man theoretisch auch diese benutzen. Habe ich aber noch nicht gemacht und lege daher keine Hände in irgendwelche Feuer.
Gruß
erstmal vielen dank für alle antworten
so das ich alle pins als externen interrupt nutzen konnte wusste ich noch nicht dachte da gibt es nur die Tx pins die eine flanke erkennen und dann z.B. den counter starten.
aber jetzt mal ne frage im datenblatt zum 644 steht das die externen Interrupts nur dann funktionieren wenn die pins als ausgang geschaltet sind?!? müsste aber doch ein eingang sein um überhaupt ne unterbrechung zu machen?!? wie fange ich den ab??? in meinem quelltext frage ich an PIND ab ob da 0x80 anliegt (pin7 gesetzt, da liegt das signal an) und lass die schleife solange laufen bis das nicht mehr der fall ist.
Mit dem ICP pin wäre das bestimmt ne gute Sache aber hab gesehen das nur einer am 644 ist und denke der ist belegt. ist das den überhaupt so möglich wie ich mir das vorstelle oder hab ich nen großen denkfehler???
Im Datenblatt steht lediglich, dass die Interrupts - wenn sie denn aktiviert sind - auch dann ansprechen, wenn Du den Pin als Ausgang definiert hast. So könnte man z.B. einen Software-gesteuerten Interrupt generieren.
Bei normaler Verwendung der externen Interrupts muss der entsprechende Pin natürlich als Eingang konfiguriert sein.
Der Interrupt wird mit einer Interruptroutine abgefangen. Im GCC sieht das dann so aus:
Den Namen des Interrupts findest Du in der io.h für den 644. Ich habe hier auf dem Rechner GCC nicht installiert, kann also leider gerade nicht nachschauen.Code:ISR (<Name des Interrupts>) { <Wenn Timer nicht läuft> <Timer starten> <ansonsten Timer stoppen> }
askazo
Lesezeichen