Timer 0 Pic18f4580 für 1µs

OP #6474213
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
#6474277
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.
OP #6474379
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.
#6474397
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.
OP #6477570
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren