Forum: Mikrocontroller und Digitale Elektronik Timer 0 Pic18f4580 für 1µs


von Vithu 1. (vithu_1)


Lesenswert?

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

von Franko P. (sgssn)


Lesenswert?

Hi
zählt der Timer nicht rückwärts?
Gruß

von Peter D. (peda)


Lesenswert?

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
von Vithu 1. (vithu_1)


Lesenswert?

Wie kann ich es denn nachschauen?
würde es dann nicht für 1µs gehen ?

von Teo D. (teoderix)


Lesenswert?

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....

von Peter D. (peda)


Lesenswert?

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.

von Vithu 1. (vithu_1)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Vithu 1. (vithu_1)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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.

von ..,- (Gast)


Lesenswert?


von Vithu 1. (vithu_1)


Lesenswert?

was bedeutet RTFM ?

von Dietrich L. (dietrichl)


Lesenswert?


: 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
Noch kein Account? Hier anmelden.