Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer/Counter mit Atmega32 und Bascom


von Johannes (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

"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

von Johannes (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

"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

von Togger (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.