Problem mit Timer/Counter mit Atmega32 und Bascom

Gast #221553
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
Gast #221554
"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
Gast #221555
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
Gast #221556
"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
Gast #221557
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
Gast #221558
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.