Forum: Mikrocontroller und Digitale Elektronik PIC18 Timeroder Interrupt


von rapeur (Gast)


Lesenswert?

Hallo zusammen,
ich habe seit drei Tage eine Funktion mit Verzögerung probiert aber 
nicht geschafft. Ich habe mit der Delay-Funktion probiert und geschafft 
aber leider passt nit mit der Aufgabe(mit eine verzogerung funktioniert 
die anderen befehlen nicht). ich will jetzt mit interrupt oder Timer 
Probiert.ich habe viel probiert und nicht geschafft. ich verwende 
PIC18F4550 in Programm MPLAB mit compiler C (20MHz). ich moechte ein 
kleines Beispiel wo das Signal 100ms später kommt. ich habe schon im 
Forum gesucht aber nicht gefunden. ich brauche euer Hilfe
Gruß

von Latissimo (Gast)


Lesenswert?

TMR0 benutzen!

wenn du FOSC von 20Mhz hast, dann wird der Timer mit 5Mhz also alle 
0,2us einen takt hochgezählt. dieser Timer ist 8 bittig, also kannste 
ohne prescaler(der Takt, der auf den Timer geht, wird vorgeteilt) nur 
bis 51 us pause erzeugen. am besten wäre ein interrupt mit tmr0 oder 
tmr1(16 biggig)

im interrupt hast du dann nen zähler, der beim x-ten interrupt dein 
ereignis auslöst.

oder wenn während der verzögerung nix passieren soll, dann kannste ne 
for schleife verwenden, in der du x-mal bis zum tmr0-überlauf wartest

for(x-mal)
{
  tmr0 = 0;
  while(tmr0 < ...);
}

das wäre dann die unelegante, einfache lösung!

von Latissimo (Gast)


Lesenswert?

hier mal der interrupt mit tmr 0


#include "int16CXX.h"  //Brauchste für Interrupts

#pragma origin 4

interrupt serverX( void)
{

  int_save_registers
  if(T0IF)                // T0 übergelaufen?
  {
       OPTION = 1;   //Prescaler einstellen
       TMR0 = 200;   //Timer-Startwert initialisieren
       T0IF = 0;       //Flag zurücksetzen
       //hier aktion z.B. Zähler, d. bei x-tem interrupt was tut

  }
  int_restore_registers
}                 // Interrupt-Routine zu ende

von Latissimo (Gast)


Lesenswert?

3. Möglichkeit:



void delay_ms(uns16 ms)                // pause
{
    while (ms)
    {
        OPTION = 2;                    // Vorteiler auf 8 einstellen
        TMR0 = 131;                    // 125 * 8 = 1000 (= 1 ms)
        while (TMR0);                  // Abwarten einer Millisekunde
        ms--;                      // "ms" mit jeder Millisekunde 
erniedrigen
    }
}


dann aufrufen mit :

delay_ms(100)  // du musst den prescaler noch auf deine Taktung anpassen

               // bei OPTION = 2 wird FOSC/4 durch 8 geteilt.


die 125 die du da siehst, kommen wie folgt zustande: 256-131(8bittiger 
zähler läuft ja über nach 125 takten wenn er mit 131 ini wird.)

von Master S. (snowman)


Lesenswert?

wenn du bis morgen warten kannst, kann ich dir von zu hause ein 
dummy-timer-interrupt-progrämmchen mitnehmen, das genau für deinen PIC 
passt...

@ Latissimo: bist du sicher, dass "int16CXX.h" zur C18-bibliothek 
gehört?

edit: arbeitest du mit dem Microchip-USB-bootloader? falls ja -> ich 
hatte auch meine probleme bis die interrupts liefen (nur vektor ummapen 
ging nicht)

von Latissimo (Gast)


Lesenswert?

Oh ja kann sein, dass das bei andern compilern anders ist!

Denke aber, dass du immer so eine headerfile brauchst, wie auch immer 
diese bei dem jeweiligen comiler heißt.

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.