Hallo, ich bekomme ein PWM-Signal an einem PORT geliefert, der gelesen werden soll. Highs und Lows des PWM-Signals unterscheiden sich in der Länge der Highpegel. Das Erkennen der Low-High-Flanke kann ich in einer Schleife realisieren. Wie ermittle ich die Länge der Highpegel? -------------------------------------------------------------- .def timer1 =r17 ;*** Programm MAIN MAIN: MAIN_LOOP: sbis PINA, 0x00 ;Springe, wenn 0. Bit des PORTA 1 ist rjmp MAIN_LOOP ;Endloschleife rcall PAKET rjmp MAIN_LOOP ;Endloschleife ;*** Unterprogramm PAKET PAKET: ;Start der Zeitmessg clr timer1 ;Register clr auf 0 setzen PAKET_LOOP: inc timer1 sbis PINA, 0x00 ;Springe, wenn 0. Bit des PORTA 1 ist ;Stop der Zeitmessg, Laenge des Highpegels ermitteln ... rjmp PAKET_LOOP -------------------------------------------------------------- MfG Wolfram Hubert
so wie du das Programmiert hast, komme ich nicht ganz mit. Ich würde das so machen: PAKET_LOOP: inc timer1 sbic PINA,0x00; ;skip, if bit is clear rjmp PAKET_LOOP ;hier dann die Auswertung!!! ; ret Das heißt, du erhöst den timer 1 solange, bis das Signal wieder weg ist. (Ist zwar nicht so ganz elegeant müsste aber funktionieren.) Das auswerten ist ganz einfach: du rechnest einfach aus, wie lange der Controller braucht, bis er den Timer 1 erhöht hat. Diese Zeit mal den inhalt von Timer1 und du hast die High-Zeit von deinem Signal. Beachte aber dass die Controller verdammt schnell sind und die Variable timer1 nur ein 8-Bit register ist, also nur bis 255 gezählt wird und dann wieder bei 0 angefangen wird. Wenn dein Controller einen Befehlszyklus von 1Mhz hat, dann muss dein Signal mindestens eine High-Zeit von 255µs haben. Gruß, Florian
Hallo Florian, ich verwende 4 MHz. Statt sbis will ich brne verwenden. Zeit für 1 Durchlauf: inc 250 ns brne 500 ns (bei Sprung) ----------------------- 750 ns Zeit für 255 Durchläufe: 255 * 750 ns = 191250 ns Zeit für Durchlauf, wenn timer1=255: inc 250 ns brne 250 ns (kein Sprung) ----------------------- 191250 ns + 500 ns = 191750 ns 191750 ns = 191,750 µs maximal erfassbare Zeitspanne. Die Highzeiten bewegen sich zwischen > 2 ms und < 7 ms. Daher müßte ich mehrere Variablen verwenden. Komfortabler müßte aber das Verwenden eines Timers gehen. Aber wie geht das? MfG Wolfram Hubert
Schau mal unter http://www.mikrocontroller.net/forum/read-1-40705.html hier ist wird das gleiche diskutiert. Gruß, Florian
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.