Forum: Mikrocontroller und Digitale Elektronik 2 Programme Parallel mit Interrupts


von Teemo (Gast)


Lesenswert?

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

von Niels H. (monarch35)


Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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.

von Matthias Kölling (Gast)


Lesenswert?

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

von T.Danielzik (Gast)


Lesenswert?

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

von Teemo (Gast)


Lesenswert?

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

von Huba (Gast)


Lesenswert?

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

von Niels H. (monarch35)


Lesenswert?

1
;+------------------------------------------------------------------------
2
;| LCD CONTROLLER - Overflow Timer1
3
;+------------------------------------------------------------------------
4
go_lcd:
5
      sbi    PORTC,5
6
      rcall wait

genau sowas meinte ich mit "tödlich".

von Teemo (Gast)


Lesenswert?

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

von Teemo (Gast)


Lesenswert?

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

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.