www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 Programme Parallel mit Interrupts


Autor: Teemo (Gast)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

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

Autor: Matthias Kölling (Gast)
Datum:

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

Autor: T.Danielzik (Gast)
Datum:

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

Autor: Teemo (Gast)
Datum:

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

Autor: Huba (Gast)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;+------------------------------------------------------------------------
;| LCD CONTROLLER - Overflow Timer1
;+------------------------------------------------------------------------
go_lcd:
      sbi    PORTC,5
      rcall wait

genau sowas meinte ich mit "tödlich".

Autor: Teemo (Gast)
Datum:

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

Autor: Teemo (Gast)
Datum:

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

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.