Forum: Mikrocontroller und Digitale Elektronik 40kHz Timer mit Pic


von Günther F. (taraquedo)


Lesenswert?

Hallo,

ich bin schon frustriert genug, dass ich einen Pic (PIC18F4550) in einem 
Projekt verwenden muss. Nun benötige ich eine Int.-Routine, die alle 125 
Befehlszyklen (25 µs) ausgelöst wird. Den Timer0 kann ich alle 255 
Befehlszyklen auslösen. So dachte ich mir nun: Setzt du in der 
Int.-Routine einfach den Zähler auf einen höheren Startwert. Denkste! 
Ich lande bei über 400 Zyklen!
1
// ----- INCLUDES 
2
#include <p18f4550.h> 
3
#include "delays.h"
4
#include "timers.h"
5
6
/* Auf EINEN Interrupt gekürzt */
7
#pragma code vector=0x08
8
#pragma interrupt interrupt
9
void interrupt(void) {
10
  INTCONbits.TMR0IF = 0;
11
  Nop();
12
  WriteTimer0(20); // Zum Beispiel
13
}
14
15
void main(void) 
16
{ 
17
    // Interrupts aktivieren
18
  OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1);
19
  INTCONbits.GIE = 1; // Enables(1)/Disables(0) all unmasked interrupts
20
  INTCONbits.PEIE = 0; // Enables(1)/Disables(0) all unmasked peripheral interrupts
21
  INTCONbits.INT0IE = 0; // En(1)/Disables(0) the INT0 external interrupt
22
  INTCON2bits.INTEDG0 = 1; // rising(1)/falling(0) edge of int0
23
24
  // ----- Hauptschleife --------------------
25
  while (1) {
26
  }
27
}

Kennt sich hier jemand damit aus wie ich den Timer beschleunigen kann? 
Ich meine 40kHz sollten doch bei 20MHz Betriebsfrequenz nicht zu viel 
sein...

Grüße!

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo Guenther,


wie hast Du die 400 Takte festgestellt? Im MPLAB?
Oder am lebenden Objekt?


Gruss

Michael

von Günther F. (taraquedo)


Lesenswert?

Hi!

Ich habe die mit der StopWatch im Debugger kontrolliert. Da ich z.Z. die 
Schaltung auch gar nicht hier habe. Aber Messungen mit dem Oszi zuvor 
haben gezeigt, dass die Zeiten wohl ziemlich genau stimmen.

Inzwischen habe ich einfach TMR0L (hieß das so? Ich meine das zuständige 
Counterregister) auf einen Wert gesetzt. Jetzt verhält er sich wie 
erwartet. Jedoch kann ich - je nach Wert - entweder 124 oder 126 Zyklen 
erreichen. Dann wählte ich ersteres und machte einfach noch ein Nop() 
davor. Jetzt passen die 125 Zyklen zwar in geschätzten 95% der Fälle, 
manchmal nimmt er sich aber 126 Zyklen Zeit (was schon 0,5kHz Differenz 
bedeutet).

Es stellen sich mir also immer noch zwei Fragen:
- Warum klappt es nicht mit WriteTimer0 und warum braucht diese Funktion 
so lange?
- Warum verwendet er hin und wieder einen Takt mehr, obwohl der 
Interrupt doch klar determiniert sein sollte?

Grüße!

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.