Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Interrupt Service Routine zu langsam Kategorie: CC-Pro Unit & Appl.Board (von Ovoron - 1.02.2008 8:40)
Ich nutze:
CC-Pro 128 Application Board
Hallo Leute,

ich habe ein Problem mit meinem Mega 128.
Ich habe ein ganz simples Programm geschrieben mit dem ich die frequenz der Interrupt Service Routine
ermittel und mir das ganze auf dem Display anzeigen lasse.
Im groÃ?en und ganzen funktioniert das Programm auch genauso wie es soll, allerdings ist meine maximal
erreichbare frequenz etwas unter 5kHz.
Das kann doch nicht passen. Mit meinem Programm kann ich mich der maximalen frequenz immer weiter
annähern. Das verblüffende ist, dass die frequenz immer weiter ansteigt und auf einmal ganz stark
zurückgeht. (Auf einemal liegt meine maximale frequenz bei 100Hz)
Reize ich das ganze dann noch weiter aus, dann zeigt mir mein Display gar nichts mehr an.
Ich denke das die ISR nicht vollständig abgearbeitet wurde bevor die neue gestartet ist.
Aber wie kann das sein bei 5kHz ?????

Hier mein Quellcode:
word Zaehler;
word Zeit;
word Multiplikator;

void ISR(void)
{
    Zaehler = Zaehler +1;

    Timer_T3Time(Multiplikator,PS_8);          // Timer für diese ISR konfigurieren
                                        // PS_8 = 542,5ns
                                        // 173 x 542,5ns = 93,85µs
                                        // Das entspricht einer frequenz von
                                        // 10655Hz

    Irq_GetCount(INT_TIM3CMPA);               // Diese Funktion signalisiert, dass der
                                        // Interrupt abgearbeitet wurde.
}


void wait(void)
{
    Zeit = Zeit+1;
    Irq_GetCount(INT_TIM2COMP);               // Diese Funktion signalisiert, dass der
                                        // Interrupt abgearbeitet wurde.
}


void main (void)
{
    word durchlauf;
    durchlauf = 1;
    Zaehler = 1;
    Zeit = 1;
    Multiplikator = 173;

    LCD_Init();                         // Initialisierung des Displays
    LCD_ClearLCD();
    LCD_CursorOff();

    Timer_T3Time(Multiplikator,PS_8);

    Irq_SetVect(INT_TIM3CMPA, ISR);     // Timer3 ruft die Funktion ISR auf

    Irq_SetVect(INT_TIM2COMP, wait);    // Timer2 ruft die Funktion wait auf

    while(1)
    {
        Ausgabe(durchlauf,1);
        Zeit =1;
        Zaehler = 0;

        while(Zeit < 99);            // Timer 2 frequenz vorgegeben 10ms
                                    // diese wait funktion wartet genau 1s

        Ausgabe(Zaehler, 2);              // Hier wird mir die Frequenz der Interrupt
                                    //Service Routine angezeigt.

        durchlauf = durchlauf +1;       // Hier wird mir angezeigt wie oft das
                                    // Programm schon abgearbeitet wurde.
    }
}


// Ab hier kommt nur die Funktion die ich aufrufe um die werte auf dem Display anzeigen zu lassen.

void Ausgabe(word Zahl, char Display_Zeile)
{
    char Zehntausender, Tausender, Hunderter, Zehner, Einer;
    Zehntausender = 0;
    Tausender = 0;
    Hunderter = 0;
    Zehner = 0;
    Einer = 0;
    word Zehntausend;
    Zehntausend = 10000;
    char Eins;
    Eins = 1;

    while (Zahl <= 0)
    {
        LCD_CursorPos(1);
        LCD_WriteChar('0'+2);
        Zahl = Zahl +30000;
    }

    while (Zahl >= Zehntausend)
    {
        Zahl = Zahl - Zehntausend;
        Zehntausender = Zehntausender + 1;
    }

    //Zahl = Zahl -60000;
    while (Zahl >= 1000)
    {
        Zahl = Zahl - 1000;
        Tausender = Tausender + 1;
    }
    while (Zahl >= 100)
    {
        Zahl = Zahl - 100;
        Hunderter = Hunderter + 1;
    }
    while (Zahl >= 10)
    {
        Zahl = Zahl - 10;
        Zehner = Zehner + 1;
    }
    while (Zahl >= 1)
    {
        Zahl = Zahl - 1;
        Einer = Einer + 1;
    }

    if (Display_Zeile == 2)            //  Ausgabe im Display Zeile 2
    {
    LCD_CursorPos(71);                 // Cursor an die letzte Position im Display
    LCD_WriteChar('0'+ Einer);       // Ausgabe der Einer

    LCD_CursorPos(70);                   // Cursor an die vorletzteletzte Position im Display
    LCD_WriteChar('0'+ Zehner);        // Ausgabe der Zehner

    LCD_CursorPos(69);                   // Cursor an die drittletzte Position im Display
    LCD_WriteChar('0'+ Hunderter);     // Ausgabe der Hunderter

    LCD_CursorPos(68);                     // Cursor an die viertletzte Position im Display
    LCD_WriteChar('0'+ Tausender);    // Ausgabe der Tausender

    LCD_CursorPos(67);                  // Cursor an die fünftletzte Position im Display
    LCD_WriteChar('0'+ Zehntausender);     // Ausgabe der Zehntausender
    }

    if (Display_Zeile == 1)                  // Ausgabe im Display Zeile 1
    {
    LCD_CursorPos(7);                     // Cursor an die letzte Position im Display
    LCD_WriteChar('0'+ Einer);     // Ausgabe der Einer

    LCD_CursorPos(6);                     // Cursor an die vorletzteletzte Position im Display
    LCD_WriteChar('0'+ Zehner);        // Ausgabe der Zehner

    LCD_CursorPos(5);                   // Cursor an die drittletzte Position im Display
    LCD_WriteChar('0'+ Hunderter);          // Ausgabe der Hunderter

    LCD_CursorPos(4);                   // Cursor an die viertletzte Position im Display
    LCD_WriteChar('0'+ Tausender);         // Ausgabe der Tausender

    LCD_CursorPos(3);                      // Cursor an die fünftletzte Position im Display
    LCD_WriteChar('0'+ Zehntausender);      // Ausgabe der Zehntausender
    }

}

Kann mir da jemand weiterhelfen.

Mit freundlichen Grü�en

Ovoron


    Antwort schreiben


Antworten: