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
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.
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.
>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.
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?
> ...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.
Alles was noch nicht gesendet wurde, kann noch gesendet werden... (um in schwammigen Formulierungen zu schwelgen...)
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.