mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 40kHz Timer mit Pic


Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht 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!
// ----- INCLUDES 
#include <p18f4550.h> 
#include "delays.h"
#include "timers.h"

/* Auf EINEN Interrupt gekürzt */
#pragma code vector=0x08
#pragma interrupt interrupt
void interrupt(void) {
  INTCONbits.TMR0IF = 0;
  Nop();
  WriteTimer0(20); // Zum Beispiel
}

void main(void) 
{ 
    // Interrupts aktivieren
  OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1);
  INTCONbits.GIE = 1; // Enables(1)/Disables(0) all unmasked interrupts
  INTCONbits.PEIE = 0; // Enables(1)/Disables(0) all unmasked peripheral interrupts
  INTCONbits.INT0IE = 0; // En(1)/Disables(0) the INT0 external interrupt
  INTCON2bits.INTEDG0 = 1; // rising(1)/falling(0) edge of int0

  // ----- Hauptschleife --------------------
  while (1) {
  }
}

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!

Autor: Michael Roek (mexman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Guenther,


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


Gruss

Michael

Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.