PIC18 Timeroder Interrupt

Gast #843817
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ß
Gast #843882
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!
Gast #843886
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
Gast #843894
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.)
#844049
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)

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