Hallo, ich möchte mit einem ATmega8 die Pulslänge einer 1kHz PWM-Frequenz messen. Mein Problem ist, dass ich keinen externen Interrupt mehr frei habe und die Messung selbst in einer Interruptroutine statt finden soll. Das heißt nur normale Pins und keine Interrupts vom Timer. Timer0 ist ebenfalls schon anderweitig in Benutzung. Wichtig ist eigentlich nur, dass mich nicht die eigentliche Länge des Impulses interessiert, sonder nur eine gewisse Längenüberschreitung. Ich habe bereits über die Verwendung vom Timer1 und seiner Compare-Funktion nachgedacht, allerdings habe ich keine Flaggs dazu gefunden und Interrupts kann er nicht auslösen. meine Idee: - auf LOW-Pegel warten und Timer1 auf 0 setzen - bei HIGH-Pegel Timer1 starten und immer wieder manuell mit Grenzwert vergleichen - bei erreichen des Grenzwertes erneut Pegel abfragen - Auswertung und Anzeige der Grenzwertüberschreitung meine Fragen: Kann man den Timer1 vielleicht doch mit der Compare-Funktion nutzen? Ist der Vergleich zweier Register so schnell, dass der Timer nicht zufällig durchläuft? Bitte um Meinungen! MfG Hannes
Hallo Hannes, generell sollte das funktionieren. Der pure Vergleich eines Registers sollte bei 1kHz kein Problem sein. Es stellt sich viel mehr die Frage wie oft Du den Vergleich machen kannst. Du kannst den in der Hauptschleife machen, oder in Deiner Interrupt Routine. Sinnvoll fände ich es in der Interrupt Routine, dann kannst Du den Prozessor in der Hauptschleife schlafen legen. Dann stellt sich aber die Frage wie oft Dein Interrupt pro Sekunde aufgerufen wird. Wenn Du mit der Interrupt Routine garantiert schneller bist als 2kHz sollte das alles funktionieren. Wenn Du sehr viel schneller bist als 2kHz dann könntest Du auch versuchen das 1kHz Signal komplett in Software zu zählen. Dazu würde ich genau so vorgehen wie beim Tasten entprellen, im Prinzip tust Du hier ja nichts anderes. Ich formuliere es mal so; Du möchtest einen Tastendruck erkennen der länger als 1/1kHz dauert ;-)
Beitrag "ICP Atmega 8" http://www.google.de/#hl=de&safe=off&q=+site%3Amikrocontroller.net+atmega8+%2Bicp&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=336f7edf043b89d3 Evtl. ist ja hier was dabei... Axelr.
naja, mein Problem ist nur, wenn ich die Register manuell vergleiche gibt es Takte in denen nicht verglichen wird sondern der Schleifensprung statt findet. und da ich mit 8MHz zähle und 1kHz PWM messen möchte, hab ich noch 8000 Schritte. ca. 100 würden ja reichen, aber wie garantiere ich das wärend des Schleifensprungs nicht grad zwei Zählschritte statt finden und somit kein positives Ergebnis beim Vergleich zu Stande kommt? Wie lange dauert ein RJMP und ein CPSE?
Hallo Hannes, auch wenn ich nicht der Experte für Atmega8 bin, scheint mir der Vorschlag von Axel sehr sinnvoll. Mit welcher Auflösung soll denn diese Messung erfolgen ? Es geht doch weiterhin um ein 1kHz PWM Signal, oder ? Mit welchen Pulsbreiten ist den hier zu rechnen ? 0% - 100% ? Eine 1kHz PWM hat eine Zykluszeit von 1ms, also kann der längste Impuls höchstens eine millisekunde sein. Dein Atmega8 läuft mit 8MHz. Muß der Timer den auch mit 8MHz laufen. Das wäre eine Auflösung von 125ns ! Mit den CompareRegistern würde vielleicht gehen, aber ist doch eher durch die-Brust-ins-Auge, wenn Du verstehst was ich meine. Gruß
R-C Glied davor und mit einem AD-Wandler messen. Spannung ist proportional zum Tastverhältnis. Die Frage ist nur, ob Dir die Auflösung langt. Gruß Jobst
also, zum PWM es wird sich zwischen 20%-80% HIGH-Pegel bewegen. es ist also immer ein HIGH und LOW Anteil in einer Periode (Grenzwert dann bei ca. 65%). Die Idee mit den Compareregistern war nur, weil ich dann nach der Maximallänge die ich als Grenzwert festgelegt habe direkt im Programm weiter machen könnte ohne die ganze Periode zu messen. Allerdings ist das wie gesagt schwierig, da wärend der Abarbeitung des Int0 keine weiteren Interrupts möglich sind, aber das Triggern eines Pins könnte ja noch funktionieren. Eigentlich wollte ich eine Art Compareflagg für diese Sache nutzen, hab aber keins gefunden. Die Geschichte mit dem RC-Glied gefällt mir nicht besonders, da der AD-Wandler schon in anderer Konfiguration verwendet wird und das Umschalten von Uref usw. zu viel Zeit und Mühe kostet. Außerdem könnte ich ja sonst gleich einen analogen Sensor nehmen. kann es überhaupt passieren, dass bei loop: CPSE "Timer1", "Grenzwert" RJMP loop der Timer1 den Grenzwert überspringt? LG Hannes
kann ich dann eigentlich direkt in die Zählregister von Timer1 oder Timer2 schreiben, oder gibts da spezielle Befehle z.B. zum Löschen bzw. 0 setzen?
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.