2 Programme Parallel mit Interrupts

Gast #782907
Hallo Leute,

ich sitze hier vor einen kleinen Problem. Ziel ist es eine Ausgabe über 
ein LCD Display zu machen und 'gleichzeitig' einen Schrittmotor zu 
betreiben.

Der Gedanke war dieses mit Hilfe von 2 Interrupts zu machen.
Ich hab 2 Programme für die jeweiligen Abläufe. Diese werden von 2 
Timern über Interrupts aufgerufen.

Leider klappt das nicht. Es scheint als würden sich die Interrupts 
gegenseitig blockieren. Ich habe schon getestet die Interrupts manuell 
wieder freizugeben: "sei" und dann ein "ret" sowie das  ganze über ein 
"reti" zu machen.


Kann mir da vielleicht jemand ein paar Tips geben oder mir vielleicht 
sagen ob das vom Ansatz her falsch ist ?


grüße

Timo
Tödlich für solche Funktions-zusammenführungen sind Interruptroutinen 
mit langen Prozesszeiten oder sogar pausenschleifen, die mit hoher 
Frequenz aufgerufen werden sollen.

Jedenfalls ist es schwierig ohne quellcode irgendetwas genaueres sagen 
zu können.
Warum willst Du das Display auch über Interrupt steuern ?

Beim Schrittmotor macht es Sinn, damit die Pulse schön synchron kommen 
und der Motor rund läuft.
Beim LCD macht es keinen Sinn.

Mach' ne Hauptschleife für das LCD und Interrupts für den Motor.
Übrigens sollen die Interrupt Routinen kurz sein, also keine großen 
Berechnungen in der Motor Interrupt routine machen, sondern eventuell in 
der Hauptschleife die Daten vorbereiten.
Gast
Hallo Teemo,

eigentlich ist die Sache ganz einfach: In der Hauptschleife schaust Du 
nach wieviele Schritte Du gehen mußt und schreibst das in eine globale 
Variable. Dort kannst Du auch Dein Display ansteuern. Der Timerinterrupt 
ist nur dazu da, den Schrittmotor anzusteuern. Dabei entscheidet die 
Zykluszeit des Timers über die Schrittgeschwindigkeit des Motors.

Gruß Matthias
Gast
Hallo Teemo

wenn Du 2 Prozesse steuern willst dann würde ich nur den Zeitkritischen 
Prozess in die Interruptroutine stecken den anderen im normalen 
Programmablauf.

Die Schrittmotor Routine würde ich in den Interrupt bearbeiten,
und die LCD Ansteuerung im normalen Programmablauf.

MfG
Torsten
Gast
Danke für die schnelle Antwort. Also Lange-Warte-Schleifen habe ich 
extra vermieden.

Ich hab die Datei hochgeladen. Hier ist der Link :
http://imojo.de/code.txt

Das Problem umfasst folgende Funktionen :

go_lcd (wird durch Interrupt aufgerufen um das LCD Display anzusteuern)

und
go_sm (um den Schrittmotor aufzurufen)


Die Funktionen alleine und für sich funktionieren. Nur leider nicht 
zusammen.


Bitte nicht meckern für den teilweise unübersichtlichen Code.... es 
handelt sich hierbei um die Arbeit eines Anfängers :D


Grüße

Timo
Gast
Vorschlag zur Interrupt-Service-Routine (ISR):

ISR
  if Timer1_Flag == true
  {
    Schrittmotor-Routine
  }

  if Timer2_Flag == true
  {
    LCD-Modul-Routine
  }
  reti

Alternativ könnte auch nur die Motor-Routine mittels Interrupt 
abgearbeitet werden, da die LCD-Routine vielleicht etwas 
zeitunkritischer ist:

main
  if Timer2_Flag == true
  {
    LCD-Modul-Routine
  }

  call Irgendwas1
  call Irgendwas2
  call Irgendwas3
  goto main

ISR
  if Timer1_Flag == true
  {
    Schrittmotor-Routine
  }
  reti
1
;+------------------------------------------------------------------------
2
;| LCD CONTROLLER - Overflow Timer1
3
;+------------------------------------------------------------------------
4
go_lcd:
5
      sbi    PORTC,5
6
      rcall wait

genau sowas meinte ich mit "tödlich".
Gast
diese Zeile gehört dort eigentlich nicht hin. Wurde nur zu Testzwecken 
eingefügt. Bin hier die ganze Zeit am rumprobieren und hatte vergessen 
sie zu löschen.


Grüße, Timo
Gast
Der Code wurde nun aktualisiert. Die LCD Funktion wird in der Mainloop 
aufgerufen. Der Interrupt springt in die SM Motor Funktion.
http://imojo.de/code.txt

Das Resultat ist foglendes :


Der Schrittmotor läuft und macht das was er soll. Leider dsa LCD Display 
nicht mehr :(  Das reagiert gar nicht mehr.


Ich fummel hier weiter rum aber falls jemand noch ne Idee hat wär ich 
dankbar



THX
Timo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.