mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts (parallel zum Hauptprogramm?)


Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend!

In dem Interrupt Tutorial hier hab ich zwei widersprüchliche Aussagen 
gefunden:

"Bei bestimmten Ereignissen in Prozessoren wird ein Interrupt ausgelöst. 
Dabei wird das Programm unterbrochen und ein Unterprogramm, die 
sogenannte Interrupt Service Routine (ISR), aufgerufen. Wenn dieses 
beendet ist läuft das Hauptprogramm ganz normal weiter."

und:

"Das Senden sowie Empfangen kann parallel erfolgen und läuft vollkommen 
unabhängig vom Hauptprogramm. Die Daten werden in spezielle Puffer 
kopiert, sodass das Hauptprogramm mit seinen Strings sofort 
weiterarbeiten kann."

Also was nu? Wird das Hauptprogramm unterbrochen oda nicht?

Danke im voraus! :)

Lg, Flo

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm wird unterbrochen uns die ISR wird aufgerufen, deine zweite 
Aussage bezieht sich auf interne Timer oder das UART, das läuft parallel 
ab und meldet wenns fertig ist nen Interrupt, dass man die Daten 
verarbeiten kann.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowohl als auch ;-)

Natürlich wird beim UART Senden/Empfangen über Interrupts das 
Hauptprogramm auch durch die betreffenden Interrupts unterbrochen, so 
wie es im ersten Abschnitt erklärt ist.

Ausser - wenn man spitzfindig ist - wenn man den zweiten Abschnitt nicht 
auf die Interrupts an sich münzt, sondern auf die Art wie die 
Hardware-UART ein Byte als Bits auf die Reise schickt oder empfängt. DAS 
funktioniert für jeweils ein Byte parallel zum Hauptprogramm.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Also was nu? Wird das Hauptprogramm unterbrochen oda nicht?

Es wird unterbrochen. Trotzdem ist die zweite Aussage auch richtig, da 
du die Sachen aus dem Zusammenhang gerissen hast.
Das eine Mal geht es um Interrupts allgemein, das andere Mal geht es um 
den Datenversand und -empfang im Hintergrund.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hm, Ich glaub ich muss konkreter werden... danke für die Antworten 
soweit :).

...ist es während dem Senden einiger hundert Bytes möglich währenddessen 
2 neue Bytes zu empfangen und diese innerhalb dieses Streams 
einzubauen... -während- dieser gesendet wird? Wird der Stream 
unterbrochen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ...ist es während dem Senden einiger hundert Bytes möglich währenddessen
> 2 neue Bytes zu empfangen und diese innerhalb dieses Streams
> einzubauen... -während- dieser gesendet wird?

Ja und ja.

> Wird der Stream unterbrochen?

Kommt darauf an. Wenn du (bzw. deine selbstgeschriebene Empfangsroutine 
im Interrupt) die empfangenen Bytes mitten in den Sendestream packst, 
wird der originale Stream durch die beiden neuen Bytes logischerweise 
unterbrochen. Auch kann es dir passieren, dass du mit dem einbauen in 
den Stream zu lange brauchst und die Senderoutine den Stream unterm 
Hintern weggezogen hat. Das hängt auch etwas von deinen 
Programmierkünsten ab. Wenn du die Bytes hinten an den Stream anhängst, 
sollte es im allgemeinen keine Herausforderungen geben.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles was noch nicht gesendet wurde, kann noch gesendet werden...
(um in schwammigen Formulierungen zu schwelgen...)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man, ich glaub nu kann ich es nimmer weiter abstrahieren.

Also wenn ich darauf nu keine Antwort mehr krieg isses verständlich; nen 
kleines Gedankenspiel so spät am Abend hat doch aber auch was, hmm? ;)

Ich versuch nur meinem Kollegen und mir mehrere Stunden an planlosem 
Rumgerätsle zu ersparen.

-----------------------------------------------------------------------
void send_Data(int Zaehler,int Channel,int Value,int Start_Channel)
{
  for(Zaehler; Zaehler < Channel; Zaehler++)
  {

     if(new_data_available == 1)
     {

       if(interrupt_channel < Zaehler)
        {
         send_Data(Zaehler,interrupt_channel,interrupt_value,Zaehler)
        };
     };

  send_NullInformationsByte;
  };

  send Channel_Byte;
};

//Erster Programmaufruf:

send_Data(1,received_Channel,received_Value,1);
------------------------------------------------------------------------

Kontext ist folgender: Als Input in den uC kommen zwei Bytes; das 
welches sagt an welchen Kanal die Information des zweiten Bytes gehen 
soll.

Am Ausgang werden nun soviele "Null-Bytes" rausgeschickt bis die Anzahl 
mit dem Kanal übereinstimmt. Dann geht der Kanal-Value raus.

Jetzt diese kleine rekursive Funktion: Kommt während dem Senden der 
(maximal 511) "Null-Bytes" nochmal ne neue Information rein soll diese, 
sofern man an dem jeweiligen Kanal noch nicht vorbei ist, eingebaut 
werden. Danach soll es bis zum ursprünglichen Kanal weitergehen.

(...dass ich Probleme kriege sobald sich die Funktion selber zum 2. Mal 
aufruft, und sobald der neue Kanal > als der Ursprungs Kanal ist.... ist 
erstmal nicht wichtig ;)   - es geht nur darum dass der Stream nicht 
abbricht).


So, puh.... Danke zum xten! :)

Lg, Flo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist alles kein Problem, Du kannst senden und empfangen, wie Du lustig 
bist.
Du brauchst nichtmal Interrupts dazu.

Z.B. bei 9600Baud dreht die CPU erstmal 20833 Zyklen Däumchen (bei 
20MHz), ehe sie das nächste Byte in das Senderegister packen darf.

Kannst also bequem testen, ob inzwischen irgendwas empfangen wurde und 
das in den noch nicht gesendeten Stream einfügen.


Peter

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das würde ich anders machen.
Auf jeden Fall keine Rekursion verwenden, da das ein Speicherfresser 
ist, den man sich auf einem Mikrocontroller nicht erlauben sollte.

Besser wäre es, ein Feld (Puffer) von der nötigen Grösse zu senden und 
anhand  eines Zeigers festzustellen, ob die entsprechende Position schon 
gesendet wurde.
Den Sinn muß ich nicht erraten, oder?

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.