Hallo, ich habe Schwierigkeiten beim einlesen einer Periodendauer eines PWM Signals mit dem AT Mega16. Ich benutze den PD6 Capture Pin den µC. An diesen Pin möchte ich eine externes PWM Signal anlegen und die Periodendauer in eine Variable speichern. Vielen Dank für die Hilfe
Wo genau liegt bitte Dein Problem? Du beschreibst, was Du machen möchtest, aber nicht, woran es scheitert bzw. wo Du nicht weiterkommst...
Hallo, also ich mache folgendes: { TCCR1B = (1<<ICES1) | (1<<CS10); // Input Capture Edge, kein PreScale TIMSK = (1<<TICIE1) | (1<<TOIE1); // Interrupts akivieren, Capture + Overflow WertPWM = (Overflows * 65536) + WertPWM; WertPWM = Wertberichtigung_capture(WertPWM); lcd_cls(); lcd_zeichenkette("PWM="); lcd_varout(WertPWM); lcd_zeichenkette("Hz"); lcd_zeile(2); lcd_varout(Overflows); } Also wenn auf Menüpunkt 1, der Taster gedrückt wird springt er in die Schleife, initialisiert den Capture input. Dann erfolgt interrupt (meinem Verständnis nach). ISR(TIMER1_CAPT_vect) { WertPWM = ICR1; //variable füllen TCNT1=0; //register leeren } Wärend er da rumzählt kann er natürlich auch überlaufen: ISR(TIMER1_OVF_vect) { Overflows++; } 1.Problem: Ich will ja die Signallänge von High Flanke nach High Flanke. Wie bring ich Ihm bei das Register zu stoppen, wenn dieser Fall eintritt? Danke für die Hilfe
Bei Input Capture wird nichts "gestoppt"! Man speichert bei der ersten Flanke den Wert in ICR1 und bei der nächsten Flanke wieder und bildet zum Schluss die Differenz der Werte. Wenn zwischen zwei Flanken Timer-Überläufe stattfinden, müssen die entsprechend berücksichtigt werden, was aber nicht erforderlich ist, wenn sichergestellt ist, dass der zeitliche Abstand zwischen zwei Flanken immer kleiner ist als die Zeit, die der Timer braucht, um einmal komplett durchzulaufen.
Man speichert bei der ersten Flanke den Wert in ICR1 und bei der nächsten Flanke wieder und bildet zum Schluss die Differenz der Werte. den Wert??? Du meinst die Zeit, die der Mega16 (bei mir mit 8MHZ ohne Vorteiler) benötigt um vom einen zum nächsten Signal zu gelangen. Jap - das hört sich sehr gut an, nach dem Wissensstand operiere ich ja auch die ganze Zeit. Allerdings habe ich Probleme mit der Aufösung. Frequenzen von 0-3kHz kann ich Problemlos mit meinem Dezimalzahlen darstellen (das macht die funktion varout() für das LCD Display). Allerdings ist der für mich interessante Bereich zw. 10 und 20kHz. Dort wird aber längst eine 0 im Register angezeigt. Das lässt darauf schließen, dass die Abtastung zu klein ist - aber wie kann das bei 8MHZ sein? Danke nochmals für die Hilfe bei meinem Problem
den Wert??? Du meinst die Zeit, die der Mega16 (bei mir mit 8MHZ ohne Vorteiler) benötigt um vom einen zum nächsten Signal zu gelangen. meine natürlich nicht das nächste Signal (benutze ein absolut periodisches Signal). ich meine natürlich die nä. Periode.
Wenn Du das TCNT1 löschst, bekommst Du irgendwas, nur nicht den richtigen Wert. Lass die Finger vom TCNT1. Welchen Typ haben Deine Variablen? Und könntest Du vielleicht mal den kompletten Code hier reinstellen? Ich vermute nämlich, dass bei irgendwelchen Berechnungen was schiefgeht. Mit Capture und 8 MHz Timertakt sollten sich 20 kHz noch mit brauchbarer Auflösung messen lassen.
lass uns das lieber per mail machen...gib mal kurz deine Adresse
kann es auch etwas mit den fuses zu haben? Hab von fuses absolt null Ahnung
die variable ist übrigens uint16_t. Meine Baustelle kann ich hier nicht posten - damit sprenge ich nur die Projekte anderer:-)
Sören wrote: > lass uns das lieber per mail machen...gib mal kurz deine Adresse Wenn Du Dich im Forum anmeldest, dann kannst Du mir ne Nachricht schicken... > kann es auch etwas mit den fuses zu haben? Klar, wenn das Ding auf "interner RC-Oszillator 1 MHz" läuft, dann läuft es eben mit 1 MHz und nicht mit 8... > Hab von fuses absolt null Ahnung Dann solltest Du Dich damit mal befassen. Ohne wenigstens ein bisschen Ahnung von Fuses kommst Du bei der µC-Programmierung nämlich nicht weit.
Sören wrote:
> die variable ist übrigens uint16_t.
WertPWM ist uint16_t? Schau Dir bitte mal an, welchen Wertebereich
uint16_t hat, und überlege dann mal, was passiert, wenn in dieser
Zeile...
1 | WertPWM = (Overflows * 65536) + WertPWM; |
"Overflows" und/oder "WertPWM" vor der Zuweisung größer als Null ist... Kleiner Tip: 65536 passt in einen uint16 schon mal gar nicht rein...
Now i got it!!! Relativ dämlich da nicht draufgekommen zu sein... ...Hab dir zu danken....super, dass Du Dir die Mühe gemacht hast.
Hehe, recht haste...aber ich sag ja - eine Baustelle der besonderen Art:-)
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.