Interrupt während Graphlcd- und UART-Ausgabe
Hallo!
Ich plane gerade ein kleines Projekt, bei dem es darum gehen wird, einige Controllerpins im Interrupt abzufragen und abhängig von deren Zuständen einige Ausgaben per Graph.-LCD (Controller: KS108) und RS232 zu machen. Ich werde int0, int1, pcint0 und pcint1 verwenden. Die jeweils aufgerufenen ISRs sind reltiv kurz (< 5 µs @ 16 Mhz), werden aber u. U. relativ oft (worst case: 5000 mal/ sec) aufgerufen. Für die LCD- und UART-Ausgabe reicht mir eine Updaterate von 5 - 10 Hz. Ich habe nun die Befürchtung, dass die Interrupts die Kommunikation mit dem LCD bzw. die UART-Ausgabe stören, weil es ja durchaus möglich ist, dass ein Interrupt während eines LCD-Befehls bzw. UART-Ausgabe ausgelöst wird. Hat da jemand konkrete Erfahrungen? Dass dieses Problem für die LCD-Ausgabe prinzipiell besteht, weiss ich, allerdings frage ich mich, ab welchen Unterbrechungsdauern der LCD-Routinen das ein Problem wird. Ach ja, um das noch zu ergänzen: es ist absolut keine Option, während der LCD- bzw UART-Ausgabe die Interrupts zu deaktivieren weil ich auf keinen Fall etwas an den Pins verpassen darf.
Vielen Dank für alle Infos!
Malte
Re: Interrupt während Graphlcd- und UART-Ausgabe
Zitat:
Zitat von malthy
Ich werde int0, int1, pcint0 und pcint1 verwenden. Die jeweils aufgerufenen ISRs sind reltiv kurz (< 5 µs @ 16 Mhz)
Hallo Malte,
dies wirst du mit den "normalen Interrupt-Routinen (also ohne Nosave) ganz sicher nicht hinbekommen. Eine leere ISR benötigt schon 110 Takte, bei 16MHz also ca. 7µs. Und wenn du dann noch bei den PCINTs selber auswerten musst, welcher es nun war, dauert es noch länger.
Zitat:
Zitat von malthy
Dass dieses Problem für die LCD-Ausgabe prinzipiell besteht, weiss ich, allerdings frage ich mich, ab welchen Unterbrechungsdauern der LCD-Routinen das ein Problem wird.
LCDs sind normalerweise unempfindlich gegen längere Zeiten und empfindlich gegen zu kurze. Wenn du das LCD also zu schnell aktualisierst, bekommt es Schluckauf. Zu langsam oder unterbrochen macht ihm viel weniger aus. Was da an das LCD geschickt wird, ist ja auch gar nicht so komplex. Am aufwändigsten ist es meistens, die einzelnen Zeichen von Textausgabe herzustellen.
Wenn du z.B. eine Single Variable mittels
LCD MySingle oder LCDAT MySingle
ausgeben willst, muss BASCOM dazu zunächst mal die einzelnen Zeichen bestimmen, sprich es konvertiert die Single in einen String, der dann Zeichen für Zeichen ausgegeben werden kann.
Wenn du mehrere Signale hast, die mit Frequenzen von 5KHz reinkommen und du jedes über eine separate ISR laufen lässt, dann wird meiner Meinung nach die Gesamtzeit, die das Programm in den ISRs verbringt, zum eigentlichen Problem für die LCD Ausgabe werden.