Hallo zusammen, ich möchte gerne ein Timer der jedes µs einen Interrupt aufruft. In dem interrupt soll ein LED getoggelt werden. µC: PIC18f4580 mit 10Mhz und mit PLL(*4) Somit habe ich ja einen Systemfrequenz von 40Mhz? Ich habe denn Timer 0 verwendet. TMR0 Berechnung: 40Mhz/4=10Mhz Prescaler ist aus, deshalb ist Prescaler 1 1*10^-6 / (1/10Mhz)=10 TMR0=256-10=246 Code: timerinit: void init() { T0CON=0b11001000; TMR0=246; INTCONbits.TMR0IF=0; INTCONbits.T0IE=1; INTCONbits.GIE=1; INTCONbits.PEIE=0; } interrupt: void __interrupt() ISR(void) { if(TMR0IF==1){ LATE=~LATE; TMR0IF=0; TMR0=246; ++zaehler; } } So jetzt zu meinem Problem: Eigentlich muss ja die Periodendauer das doppelte betragen: 2 µs. Aber bekomme leider 5,7 µs als Periodendauer. Kann mir da jmd mit einem Denkanstoß helfen
Schau Dir mal den erzeugten Assembler an. Das werden deutlich mehr sein, als 10 Befehle a 0,1µs. Und der Einsprung in den Interrupt, sowie RETI dauern ja auch noch was.
:
Bearbeitet durch User
Wie kann ich es denn nachschauen? würde es dann nicht für 1µs gehen ?
Vithu 1. schrieb: > würde es dann nicht für 1µs gehen ? Und wenn? Da ist keinerlei Zeit (Takte) über, um noch was anderes zu tun. Da kannst du dir auch gleich das "++zaehler;" sparen, den Zeit um damit was anzustellen is ja eh nich über....
Vithu 1. schrieb: > ich möchte gerne ein Timer der jedes µs einen Interrupt aufruft. In dem > interrupt soll ein LED getoggelt werden. Das ist Unsinn, 500kHz Blinken kann kein Mensch erkennen. So mal als Daumenregel, ein Interrupt sollte nicht häufiger als alle 100 CPU-Zyklen erfolgen. Die CPU soll ja auch noch was anderes machen. Für 1µs nimm also eine CPU mit >=100MIPS.
Für mein projekt bräuchte ich ein Timer der in 1µs hochzählt. Wenn an einem Pin 1 anliegt soll er anfangen zu zählen. Und wenn an einem anderen Pin 1 anliegt soll er aufhören zu zählen. Habe ein Beispiel rechnung durchgeführt. bei dem der Zeit 50,465µs beträgt. Mit dem LED wollte ich nur schauen ob der Timer in µs schritte zählt. Damit ich es auf einem Oszilloskop darstellen kann.
Vithu 1. schrieb: > Für mein projekt bräuchte ich ein Timer der in 1µs hochzählt. Dann las doch einfach den Timer selber die µs zählen. Der eine Pin macht bei der Flanke einen Capture-Interrupt, d.h. speichert den Timestamp und aktiviert einen 2. Capture-Interrupt. Schlägt nun dieser 2. Interrupt zu, braucht man nur die Differenz zu bilden. Soweit ich das sehe, könnte das der T3 machen. Die beiden Flanken müssen nur so weit auseinander liegen, wie der 1. Interrupt CPU-Zeit braucht. Somit muß die CPU keine wahnsinnig hohe Interruptrate mehr machen und die 10MIPs reichen aus.
Ich habe nun denn Capture zum laufen gebracht. Der wert wird in CCPR1 gespeichert. Beim herauslesen steht da das der Wert 0x000C beträgt. Meine Frage ist wie weiss ich welchen Einheit der Wert hat. Habe den Timergeschindigkeit nicht eingestellt. Wie schnell läuft der Timer bei der Capture mode?
Vithu 1. schrieb: > Meine Frage ist wie weiss ich welchen Einheit der Wert hat. Timer-Takte. > Habe den > Timergeschindigkeit nicht eingestellt. Da gibt es trotzdem Standardeinstellungen nach dem Reset. Vermutlich Timer-Takt = CPU-Takt. > Wie schnell läuft der Timer bei der Capture mode? RTFM.
Vithu 1. schrieb: > was bedeutet RTFM ? https://de.wikipedia.org/wiki/Liste_von_Abk%C3%BCrzungen_(Netzjargon)#R
:
Bearbeitet durch User
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.