mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Codevision: Vorzeitiger Rücksprung aus der ISP


Autor: Wolfgang Staven (bataki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe eine Frage zur ISR bei Codevision: Meine ISR ist in 
mehrere Blöcke (Abfragen z.B., wie if ...) unterteilt. Bis hierhin alles 
problemlos! Nun muss ich aber aus Zeitgründen in der Lage sein, aus 
jedem Block heraus aus der gesamten ISR herausspringen zu können, um 
wieder im Hauptprogramm landen zu können. Ist es erlaubt, dann mit #asm 
(reti) zu arbeiten? Welche Möglichkeiten habe ich sonst, um sicher!!! 
eine ISR zu verlassen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Staven schrieb:
> Hallo, ich habe eine Frage zur ISR bei Codevision: Meine ISR ist in
> mehrere Blöcke (Abfragen z.B., wie if ...) unterteilt. Bis hierhin alles
> problemlos! Nun muss ich aber aus Zeitgründen in der Lage sein, aus
> jedem Block heraus aus der gesamten ISR herausspringen zu können, um
> wieder im Hauptprogramm landen zu können. Ist es erlaubt, dann mit #asm
> (reti) zu arbeiten? Welche Möglichkeiten habe ich sonst, um sicher!!!
> eine ISR zu verlassen?

Ganz normaler return; so wie er in jeder anderen Funktion auch verwendet 
wird. Der Rest ist Sache des Compilers.

Und lass um Himmels Willen ja die Finger von einem Assembler Return. Das 
ist ein ziemlich sicherer Weg ins Desaster, weil der Compiler vor 
Verlassen der Funktion wahrscheinlich noch den Stack aufräumen muss.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Warum kein Sprung zum Ende und dann ganz normaler Ausstieg. Ich arbeite 
eigentlich nur mit Assembler und da die gepushten Register auch wieder 
alte werte erhalten sollen, bleibt da gar nichts andres übrig. Außerdem 
hasse ich es, wenn Unterprogramme mit Break und Co verlassen werden. 
Sauber programmiert heißt, eine Routine hat 1 Einstieg und 1 Ausstieg. 
Ales andere ist Spahetti-Code.
Gruß oldmax

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR mit vielen Böcken und if's, die dann aber aus Zeitgründen vorzeitig 
verlassen zu müssen, klingt nach ziemlich vermurkster 
Softwarearchitektur.

Vielleicht solltest du da nochmals drüber nachdenken, ob das alles so 
ist, wie es sein könnte.

Oliver

Autor: Wolfgang Staven (bataki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an K.H. Buchegger: Das hört sich sehr gut an! Nur   return;    eingeben? 
In meinem C-Handbuch findet sich kein "return;", sondern dort ist nur 
"return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei 
Codevision eine Fehlermeldung! Danke für den Hinweis!
an oldmax: Das hört sich auch gut an, aber wie komme ich mitten aus der 
ISR ans Ende?
an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der 
Materie solche bösartigen Vermutungen anzustellen!

Die Sache ist vereinfacht so zu sehen: Während der ISR muss ein Portpin 
immer wieder abgefragt werden. Bei einer Änderung des Zustands muss 
sofort aus der ISP ins Main Programm zurückgekehrt werden. Da diese 
Änderung zu verschiedenen Zeiten auftritt, muss auch mehrfach abgefragt 
werden und somit dann auch mehrfach die Möglichkeit der Rückkehr gegeben 
sein.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der
>Materie solche bösartigen Vermutungen anzustellen!

Das war nicht bösartig, das war nur ein gut gemeinter Vorschlag. Aber 
das kannst du sicherlich auf Grund deiner Kenntnis der Materie besser 
beurteilen.

Dein C-Buch ist übrigens im Bezug auf return falsch, oder du verstehst 
es nicht richtig.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Staven schrieb:
> an K.H. Buchegger: Das hört sich sehr gut an! Nur   return;    eingeben?
> In meinem C-Handbuch findet sich kein "return;", sondern dort ist nur
> "return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei
> Codevision eine Fehlermeldung! Danke für den Hinweis!

Schmeiss das Buch weg und kauf dir ein richtiges.

> an oldmax: Das hört sich auch gut an, aber wie komme ich mitten aus der
> ISR ans Ende?
> an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der
> Materie solche bösartigen Vermutungen anzustellen!

Bei allem nötigen Respekt.
Ich halte es für bösartig ohne elementare Kentnisse einer 
Programmiersprache ein Program schreiben zu wollen.

Dein jetzt gezeigtes Unwissen zusammen mit der Problembeschreibung im 
Einleitungsposting nährt den Verdacht, dass Oliver recht hat.

>
> Die Sache ist vereinfacht so zu sehen: Während der ISR muss ein Portpin
> immer wieder abgefragt werden. Bei einer Änderung des Zustands muss
> sofort aus der ISP ins Main Programm zurückgekehrt werden. Da diese
> Änderung zu verschiedenen Zeiten auftritt, muss auch mehrfach abgefragt
> werden und somit dann auch mehrfach die Möglichkeit der Rückkehr gegeben
> sein.

Autsch.
Das klingt nach warten in einer ISR.
Olivers Verdacht nähert sich der Gewissheit an.

Autor: Wolfgang Staven (bataki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gedacht, dass man hier, selbst als Anfänger, Hilfe bei 
Problemen bekommen kann, stattdessen gerät man an notorische 
Besserwisser. Dann muss ich eben woanders nach fachlicher Kompetenz 
suchen und melde mich gleich wieder ab.

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte ja auch mal den Code zeigen. Dann haben beide was davon und 
können sichs ausraufen, ob die dort verwirklichte Umsetzung brauchbar 
ist oder nicht.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kannst du natürlich machen.

Aber du könntest auch einfach mal dein Programm zeigen (als Anhang). 
Dann hilft es sich nämlich viel einfacher.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Staven schrieb:
> Ich habe gedacht, dass man hier, selbst als Anfänger, Hilfe bei
> Problemen bekommen kann, stattdessen gerät man an notorische
> Besserwisser.

Mag vielleicht daran liegen, dass diese "Besserwisser" ein paar 
Millionen mehr Lines of Code am Buckel haben als du.

(Kennst du das Stereotyp des Deutschen in der großen weiten Welt da 
draussen? Ein Deutscher ist einer, der einem Arbeiter der seine Arbeit 
schon seit Jahrzehnten macht, erst einmal erklärt wie man es besser 
macht, obwohl er keine Ahnung von der Materie hat. Genau so verhältst du 
dich jetzt)

> Dann muss ich eben woanders nach fachlicher Kompetenz
> suchen und melde mich gleich wieder ab.

Ba ba und foi net

Autor: H.J.Seifert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, scheint was dran zu sein an den Herbstdepressionen und 
Empfindlichkeiten. Nun gut, jeder wie er will :-)

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Nun seid doch mal nicht so streng... Wir haben alle angefangen und so 
manchen Mist gebaut, trotzdem sind Fragen und Antworten zu 
Hilfestellungen geworden. Und Karl Heinz ein

> Bei allem nötigen Respekt.
> Ich halte es für bösartig ohne elementare Kentnisse einer
> Programmiersprache ein Program schreiben zu wollen.
 ist bei allem nötigen Respekt keine Hilfestellung. Ab wann bist du der 
Meinung, das man genug elementare Kenntnisse hat, damit man nicht 
bösartig ein Programm schreibt ?
Zum Thema:
Eine Interruptroutine (ISR) hat die Aufgabe, ein Programm aufgrund eines 
Ereignisses zu unterbrechen, um einen kurzen Programmblock zu 
bearbeiten, der dieses Ereignis behandelt. Das sind z. B. 
Timer-Ereignisse. So kann man einen Timer alle ms einen Interrupt 
auslösen lassen. In der ISR wir nun einfach in einer Variablen die ms 
hochgezählt. Mehr nicht. Im Hauptprogramm schaut man nun einfach nach, 
ob die Variable einen Wert überschritten hat, um dann z.B. 100 
abzuziehen und in einer anderen Variable 0,1 s hochzuzählen. Die ISR 
zählt völlig unabhängig die ms.
Genau so verhält es sich mit den ISR der UART. Auch hier wird beim 
Empfang eines Wertes ( Bytes) ein Interrupt ausgelöst. Die ISR schreibt 
diesen Wert in eine allgemein zugängliche Variable und gut is. Der Rest 
ist für die ISR nicht interessant. Darum kümmert sich das Hauptprogramm. 
Damit das so funktioniert, werden z. B. Flags gesetzt. Man kann eine 
Variable definierern und die Bits entsprechend zuordnen. Die ISR setzt 
z.B. Bit 5 (Zeichen empfangen) . Im Hauptprogramm wird dieses Bit 
abgefrgt (Polling) und ein entsprechendes (normales ) Unterprogramm 
damit beauftragt, dieses empfangene Byte auszuwerten und as Flag 
zurückzusetzen. Eine ISR, die bei einem Ereignis sich selbst verläßt, ( 
so hast du es beschrieben) ist falsch aufgesetzt. Da dein Programmcode 
nicht öffentlich ist, kann man da nur vermuten. Von daher versuch erst 
mal zu verstehen, was ich hier beschrieben hab und dann bau deine ISR so 
um, das dein Hauptprogramm nur durch die ISR unterbrochen wird..
Gruß oldmax

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oldmax schrieb:

>> Bei allem nötigen Respekt.
>> Ich halte es für bösartig ohne elementare Kentnisse einer
>> Programmiersprache ein Program schreiben zu wollen.
>  ist bei allem nötigen Respekt keine Hilfestellung. Ab wann bist du der
> Meinung, das man genug elementare Kenntnisse hat, damit man nicht
> bösartig ein Programm schreibt ?

Das sollte eine Spitze darauf sein

[quote]
an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der
Materie solche bösartigen Vermutungen anzustellen!
[/quote]

Die Vermutung Olivers ist nach dem Vorgeplänkel nicht von der Hand zu 
weisen. Natürlich ist schon klar, dass der TO höchst wahrscheinlich aus 
Unwissenheit in der Situation ist, dass er denkt er müsse aus der ISR 
vorzeitig aussteigen. Wahrscheinlich fehlt ihm nur die Idee der 
Fallunterscheidung mit einem switch-case oder einer if/else-if Leiter. 
Höchst wahrscheinlich hat er auch die ISR mit zuviel Funktionalität 
vollgestopft. Zumindest klingt die ganze Beschreibung danach.


Und dieser Teil hier
[quote]
sondern dort ist nur
"return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei
Codevision eine Fehlermeldung!
[/quote]
hat mich ganz ehrlich schockiert!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>stattdessen gerät man an notorische Besserwisser.

Ja, und wenn Du jetzt noch raffst, dass es diese Leute tatsächlich 
besser wissen als Du, wird vielleicht noch alles gut ;-)  Denn letztlich 
ist es doch genau das, was Du hier suchst: Rat von jemandem, der es 
besser weiß als Du? Oder möchtest Du lieber an notorische Schlechter 
-Wisser geraten?

Also mecker nicht rum :-)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Oder möchtest Du lieber an notorische Schlechter-Wisser geraten?

Wobei, da ist er hier in diesem Forum auch gar nicht so falsch. Es kommt 
immer drauf an, welche Antworten man sich rausfischt ;)

Autor: H.J.Seifert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und um nochmal auf den return-Wert zu kommen: da es bei einer 
Interruptfunktion keine aufrufende Funktion gibt, kann es auch keinen 
Rückgabewert geben. Niemand könnte mit einem Wert was anfangen, und 
Stackprobleme sind vorprogrammiert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
H.J.Seifert schrieb:
> und um nochmal auf den return-Wert zu kommen: da es bei einer
> Interruptfunktion keine aufrufende Funktion gibt, kann es auch keinen
> Rückgabewert geben. Niemand könnte mit einem Wert was anfangen, und
> Stackprobleme sind vorprogrammiert.

Mich hat eigentlich mehr schockiert, dass die Behebung dieses 
Pipifax-"Problems" sofort den Trieb auslöst einen Assembler-reti 
einzubauen.

(Und nein, der Returnwert beim return muss keine Klammern haben. return 
ist ja schliesslich kein Funktionsaufruf oder hat eine abzufragende 
Bedingung wie sie ein if hat)

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.