www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC Timer0 laden - 40uS Offset?


Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich programmiere einen PIC16F887 mit dem freien HI-Tech C. Funktioniert 
eigentlich alles prima - bis auf das laden der Timer. Bin mit meinem 
Latein am Ende und frage mich ob andere das gleiche Problem haben und ob 
es überhaupt eine Lösung dafür gibt.

Mein Timer0 läuft mit 1:2 Teiler von (internen) 4 MHz, d.h. bis zum 
Überlauf und setzen des Flags vergehen 512 uS. Das kann ich auch an 
folgendem Programm mit der Ausgabe an PORTD gut am Oszi nachverfolgen - 
es stimmt exakt. Sowie ich den Zähler von Timer0 lade, entsteht 
allerdings ein Offset von ca. 30 - 40 uS (d.h. wenn ich den Timer mit 0 
lade vergehen 550uS, wenn ich ihn mit 127 lade, vergehen 296uS statt 
256uS).

Vielen Dank!!!

#include <htc.h>

__CONFIG(INTCLK & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & DUNPROTECT & 
BORDIS & IESODIS & FCMDIS & LVPDIS);
__CONFIG(BORV40);

void interrupt interrupt_service(void)
{
    if (T0IE && T0IF)
       {
        PORTD = 0xFF;       // High
     //   TMR0 = 0b00000000;   // laden des Timer0Counters
        T0IF = 0;           // rücksetzen des Überlaufs
       }
}

void main()
{   TRISD = 0x00;
    OPTION = 0b10000000;    // Timer0 konfigurieren Bit 2:0 bestimmen 
Teiler von Timer0 [000 entspricht 2]
    T0IF = 0;               // Überlauf - Flag löschen
    T0IE = 1;               // Interrupt enable
    ei();                   // Globales Interrupt enable (GIE)

    while(1)
    { PORTD = 0x00; }       // Low
}

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kenn mich zwar mit den PICs nicht aus, aber es vergeht ja auch etwas 
Zeit vom Aufruf deiner Interrupt Funktion bis zum Tatsaechlichen Sezten 
des Ports. Das koennte die 40µs  erklaeren.

Autor: Kai Riedel (kriedel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das könnte folgende Ursachen haben:

- Nach dem Laden von TMR0 vergehen bis zum nächsten Zählvorgang 2 
Taktzyklen (siehe Datenblatt 5.1.1)

- das Beschreiben des TMR0-Registers führt zu einem Löschen des 
aktuellen Vorteilerwertes, d.h. bereits gezählte Impulse werden 
vergessen (siehe Datenblatt 5.1.3)

@Robert Weber:
Das Setzen des Portausgangs ist ohne Einfluss auf die beschriebene 
Zeitverzögerung (findet auch statt, wenn TMR0 nicht neu beschrieben 
wird).

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das was kriedel geschrieben hat stimmt, aber es stimmt auch noch was
anderes, dass nähmlich noch Zeit vergeht, bis es zum Laden des Timers
kommt. Poste mal das disassemblierte hex, oder auch das list,
dann kannst du die Zeit zählen, was die Hochsprache braucht, um in den
Interrupt zu gelangen und den Timer zu setzen. Auch in Assembler muß
bei so einer Anwendung ein Offset genommen werden, wenn auch nicht so 
groß.
Chris

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.