www.mikrocontroller.net

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


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.