Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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