-         

Ergebnis 1 bis 6 von 6

Thema: Problem Timer0 mit interrupt

  1. #1

    Problem Timer0 mit interrupt

    Anzeige

    Hallo RoboterNetz Forum,

    vorab, ich bin in dieser Materie ein absoluter Newbie und möchte eine Led zum laufen bringen welche sich für 1 Sek. Ein und 1 Sek. Ausschaltet.
    Das programm läuft bereits, aber ich hab bemerkt das die Led nicht konstant 1 Sekunde leuchtet, es gibt meistens kleine abweichungen so in ms Bereich. Verglichen habe ich es auf 0815 art mit einer Stoppuhr. Gibt es eine Möglichkeit in der Enwicklungsumgebung festzustellen mit welcher Geschwindigkeit die Led blinkt.

    Oder liegt es daran das der PIC Oszi nicht stabil ist?

    ps. Das Programm habe ich aus dem Netz hab einiges für meine bedürfnisse angepasst.

    Meine Entwicklungsumgebung ist das MPLAB mit Hi Tech C18 Compiler

    --------------------------------------------------------------------------------
    hier ist wäre der Code.

    Code:
    #include <htc.h>
    
    //Chip Settings
    __CONFIG(1,0x0200);
    __CONFIG(2,0X1E1F);
    __CONFIG(3,0X8100);
    __CONFIG(4,0X00C1);
    __CONFIG(5,0XC00F);
    
    
    unsigned char counter=0;//Overflow counter
    
    void main()
    {
       //Setup Timer0
       T0PS0=1; //Prescaler is divide by 256
    
       T0PS1=1;
       T0PS2=1;
    
       PSA=0;      //Timer Clock Source is from Prescaler
    
       T0CS=0;     //Prescaler gets clock from FCPU (5MHz)
    
       T08BIT=1;   //8 BIT MODE
    
       TMR0IE=1;   //Enable TIMER0 Interrupt
       PEIE=1;     //Enable Peripheral Interrupt
    
       GIE=1;      //Enable INTs globally
    
       TMR0ON=1;      //Now start the timer!
    
       //Set RB1 as output because we have LED on it
    
       TRISB&=0B11111101;
    
       while(1);   //Sit Idle Timer will do every thing!
    }
    
    //Main Interrupt Service Routine (ISR)
    void interrupt ISR()
    {
       //Check if it is TMR0 Overflow ISR
    
       if(TMR0IE && TMR0IF)
       {
          //TMR0 Overflow ISR
          counter++;  //Increment Over Flow Counter
    
          if(counter==15)
          {
             //Toggle RB1 (LED)
    
             if(RB1==0)
                RB1=1;
             else
                RB1=0;
    
             counter=0;  //Reset Counter
    
          }
    
          //Clear Flag
          TMR0IF=0;
       }
    }
    Geändert von PICuin (21.03.2011 um 22:03 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Ohne jetzt auf deinen Code und das MPLab einzugehen.
    Das die Abweichung schwankt kann eigentlich nicht sein, wenn er immer gleich zählt.

    Also nicht einmal blinken messen, sondern gucken wielange es dauert bis die LED 100mal geblinkt hat, ist sehr viel genauer. Daraus kannst du denn einen Korrektuwert errechnen.

    Und nochwas, Programmcode bitte immer in Code-Tags.

  3. #3
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Der Vorschlag von TobiKa ist sehr gut.

    Fürs Messen von kurzen einzelnen Zeitinterwallen ist die Stopuhr nicht geeignet, da die variable Reaktionszeit von Menschen um 100 ms beträgt. Ganz genau kann man es nur elektronisch z.B mit Frequenzzähler messen.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  4. #4
    Hallo,

    danke für die Tips!

    hab dauer von 100 mal blinken lassen (wenn LED aufleuchtet gezählt)
    bis 100 hat es 3min :15sek gedauert.

    100*2 (1s an; 1s aus= 2s) = 200/60= 3,33

    Eine abweichung von 18s, falls ich Richtig verstanden habe, und die berechnung stimmt.
    wie kann ich den Wert korriegieren.

    mfg

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Beispielweise durch Änderung des Startwertes vom Timer.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Wie kommst du auf 18 Sekunden?!
    Mein Ergebnis ist, das er in 3:15 min (195 sek) bei einem 2 sek Intervall (1 sek an, 1 sek aus) maximal 97,5 Intervalle durchlaufen kann. Also hattest du 2,5 Intervalle zuviel, was 5 sek entspricht.

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •