Hallo Leute, ich habe mit BasCom den Timer0 und Timer1 als Counter konfiguriert. Den Interrupt des Timer1 verwende ich als 'Zeitbasis' für die Messung und Abarbeitung anderer Prozesse. Der Interupt des Timer0 = Counter löst eine Routine aus, die etwa 1s dauert. Das ganze funktioniert grundsätzlich, aber... (fast immer) Schon nach dem 1. Interrupt des Timer0=Counter und der Rückkehr daraus steht der Timer1. Habt ihr ein paar Hinweise für mich dazu ? Danke, viele Grüsse Johannes
"Der Interupt des Timer0 = Counter löst eine Routine aus, die etwa 1s dauert." Huhahaha ! Ein Interrupthandler der 1s dauert, vergiß es ! Du hast nämlich nur eine CPU und kein Multitaskingsystem. Wenn Du 1s nutzlos verschwendest, kann die CPU dabei nichts anderes machen. Will man Probleme mit den anderen Programmteilen vermeiden, sollten Interrupts nicht länger als 100µs (0,0001s) dauern. Gehe nochmal zurück in die Programmablaufplanung und mache es vernünftig. Peter
Hallo Peter, Danke für Deine Antwort, ich weiss dass es an sich nicht so toll ist, die anderen Programmteile haben damit an sich kein Problem, 1s zu warten. Aber es war unmittelbar so am einfachsten. Sollte es nicht prinzipiell funktionieren, - auch wenn der Sinn eines Interrupts ein anderer ist. Ich war bereits dabei mein Programm entsprechend abzuändern, aber, sollte die jetzíge Version nicht trotzdem funktionieren ?? Danke, Viele Grüsse Johannes
"die anderen Programmteile haben damit an sich kein Problem, 1s zu warten." Wie es scheint aber doch: "...steht der Timer1." "Aber es war unmittelbar so am einfachsten." Man kann so programmieren, als sei diese eine Task die einzige auf dem MC. Man kann aber auch so programmieren, daß jede Task von vornherein nur die wirklich notwendige Rechenzeit verbraucht und dann die anderen Programmierer die Kinnlade runterklappen lassen, wie viele verschiedene Tasks in einen einzigen MC passen und quasi gleichzeitig laufen. Der Trick ist nur, bei jeglicher Wartezeit zum Main zurückzukehren. Peter
Hi Johannes, hast du schon die HW/SW-Stack Einstellungen überprüft? Die stehen nämlich bei Bascom von Haus aus zu niedrig ein, wenn mit Interrupts arbeitest. Wenn Timer0 jede Sekunde aufgerufen wird, sehe ich keine Probleme, dauert der Code aber eine Sekunde, das ist vieeeeeeel zu lang für ne Interruptroutine. Timer1 funkt ja auch noch kräftig dazwischen. Bei Bascom werden bei jedem Interruptaufruf alle Register(32) + SREg gesichert. Also brauchst schonmal reichlich Stack. Es sei denn du verwendest "NOSAVE", aber das würde ich nicht empfehlen, denn dann werden einfach Register überschrieben und man weiss ja nie an welcher Stelle sich das Programm gerade befindet, wenn der Interrupt dazwischenfunkt. Meine Devise bei Interruptroutinen ist immer: so schnell raus wie nur geht ;-) In der Hauptschleife kann´s ruhig schonmal länger dauern, die unterbricht ja auch niemand bei der Arbeit ;-) Es reicht völlig aus in der Interruptroutine Zähler laufen zu lassen bzw. bits zu setzen, die dann in der Hauptschleife abgefragt werden und ggf. bearbeitet werden. Es werden z.b. keine Strings in Interruptroutinen sortiert ;-) Seit ich das beherzige, spare ich mir viel Zeit bei der Fehlersuche. Das Gemeine ist ja, dass viele Dinger am Anfang laufen, dann ändert man irgendwo was und peng ist der Wurm drin. Und keiner denkt mehr an die Interruptroutine, die viel zu lang war. Hoffe, das hilft dir lg Ralf
Hallo Peter, hallo Togger, Viele Dank für eurere Antworten, der Interrupt von Timer0=Counter kommt nur alle 'heilige Zeit' mal vor, d.h. wirklich nur 1-3 mal alle Stunde. Die BasComEeinstellungen für Stack,... habe ich bereits erhöht, Auch wenn ich NOSAVE nutze ändert sich nichts. Timer1=Timer kommt also regelmässig.... Mit umgestrickter SW läuft es leider auch noch nicht. Viele Grüsse Johannes
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.