Guten Tag ich habe einen i2C Slave in Betrieb der mir Daten Sendet und
empfängt. Da ich das Schreiben von Werten in dem Interuptprogramm
durchfüren möchte, muss ich all diese Parameter übergeben aus dem Main
(in Funktion Set_Sensor1). Ich möchte die Funktion Set_Sensor1 im
Interupt nur durchführen also eigentlich nur Set_Sensor1(void). Da ich
diese Funktion nur benötige um die Variabeln vom Main zu transferieren
und das Senden auszuführen. Mit Globalen Variabeln würde dies ja ohne
probleme gehen aber möchte diese nicht verwenden, damit ich die
übersicht über die Einzelnen Variabeln besitze. Meine Frage wie bringe
ich die Funktion in meinen Interupt um nur die Funktion auszuführen.
Stelle Markiert wo die Funktion hinein sollte. Den eine Funtion in einer
Funktion hab ich ein wernig ausprobiert und erkennt dan die Variabeln
nicht mehr.
TS schrieb:> Mit Globalen Variabeln würde dies ja ohne probleme gehen
Tja, nun, volatile nicht vergessen.
> aber möchte diese nicht verwenden
Meinst du nicht, daß dein Problem hausgemacht ist, wegen deiner
Weigerung, es richtig zu machen ?
Kümmere dich erst mal um die vielen Stellen, an denen dein Programm eher
ungünstig strukturiert ist z.B. Pointer zu übergeben nur weil du die
Werte lesen willst (ein Pointer ist wesentlich grösser als der Wert und
zudem eine weitere Indirektionsstufe), bischen viele Vergleiche wo dein
Pointer gerade steht...
Ich denke Dein Problem hat zunächst mit dem Geltungsbereich von
Variablen zu tun und deren Zusammenhängen mit Parametern.
Ich rate Dir: Nimm ganz einfache Programme um die Grundlagen zu lernen.
Formuliere am besten also ausgehend von Deinen Kenntnissen und anhand
eines Programmes, dass sich auf das Problem konzentriert, Deine Frage
neu. Meine Empfehlung.
Wer nicht versteht, was ich möchte ist dies hier Dargestellt. Nur eben
die Variabeln werden nicht merh erkannt in der Funkton Set_Sensor1. Wie
ändere ich dies?
Ach so. Also ist die Frage wohl speziell auf Interrupts gezielt.
1. In Interrupts ruft man keine Funktionen auf, die Anwendungsdaten
übernehmen und sie senden. (Das gilt nicht unbedingt für gepufferte
Daten).
2. Interrupt-Handler können keine Parameter übergeben werden. Globale
bzw. Modul-Globale Variablen sind die einzige Möglichkeit.
> Wer nicht versteht, was ich möchte ist dies hier Dargestellt.> Nur eben die Variabeln werden nicht merh erkannt in der> Funkton Set_Sensor1. Wie ändere ich dies?
Ich denke wir verstehen schon, was Du willst.
Du verstehst nur nicht, warum das nicht geht. Dir fehlen C-Grundlagen.
Du kannst keine Funktion innerhalb einer Funktionsdefinition definieren.
Nochmal: Mache Dir klar und lerne was der Geltungsbereich von Variablen
ist und was er für Konsequenzen hat. Achte darauf das für Interrupts
besondere Regeln gelten.
TS schrieb:> Michael B. schrieb:>>> Weigerung, es richtig zu machen ?>> Und Globale Variabeln sind nicht übersichtlich. Und ganz sicher nicht> umbedingt richtig!
Da spricht jemand mit jahrzehntelanger Erfahrung in der
Mikrocontrollerpogrammierung....
(findest du das nicht selbst ein bischen peinlich ?)
TS schrieb:> Mit Globalen Variabeln würde dies ja ohne> probleme gehen aber möchte diese nicht verwenden, damit ich die> übersicht über die Einzelnen Variabeln besitze.
Dafür gibt es in C struct und static, damit schafft man Übersicht und
reduziert die Sichtbarkeit von Variablen. Fazit: C-Grundlagen lernen.
Oder gleich C++. Nicht einach nur Code zusammenkopieren.
TS schrieb:> Guten Tag ich habe einen i2C Slave..
So unstrukturiert, wie du dein Anliegen vorbringst, scheint auch dein
Code zu sein.
Also denke dir ein Protokoll aus, also ein Format, in welchem deine
Daten über das Interface gehen sollen.
Dazu guck dir an, wie es andere I2C-Schaltkreise denn so machen.
Zumeist sieht das so aus, daß es als erstes eine Art Statusregister
gibt, wo der Master sehen kann, ob du überhaupt was für ihn hast. Dann
diverse Datenregister, getrennt für Senden und Empfangen. Das sind
logischerweise GLOBALE Daten, was denn sonst!
Denke auch daran, daß der Master jederzeit jede Verbindung von sich aus
beenden kann. Das hat Einfluß darauf, wie du als Slave empfangene Daten
behandeln mußt. Ob und was du puffern mußt, hängt von deiner Art der
Anwendung ab.
Also immer an die Olsenbande denken:
1. Egon macht einen Plan,
2. Egon hat den Plan - und zwar fertig
3. Nun werden die Zutaten beschafft
4. Jetzt erst wird mit dem Programmieren begonnen
So etwa geht das.
W.S.
Michael B. schrieb:> TS schrieb:>> Michael B. schrieb:>>>>> Weigerung, es richtig zu machen ?>>>> Und Globale Variabeln sind nicht übersichtlich. Und ganz sicher nicht>> umbedingt richtig!>> Da spricht jemand mit jahrzehntelanger Erfahrung in der> Mikrocontrollerpogrammierung....>> (findest du das nicht selbst ein bischen peinlich ?)
Also peinlich ist wenn man denkt Globale Variabeln überall einzusetzen.
Wenn du jetzt sagst,dass es Übersichtlicher sei dann solltest du dich
selbst fragen wiso das du überhaupt dir erlaubst deinen Mund
aufzumachen. Ich will ja sehen wen ich dir ein Programm erstelle, wo nur
Globale Variabeln besitzt und 100te von Parametern ausgetauscht werden,
das du noch den überblich behältst wo die Variabel sich gerade verändert
im Programm oke! Aber ist ja übersichtlich stimmt ganz vergessen
TS schrieb:> Michael B. schrieb:>> TS schrieb:>>> Michael B. schrieb:>>>>>>> Weigerung, es richtig zu machen ?>>>>>> Und Globale Variabeln sind nicht übersichtlich. Und ganz sicher nicht>>> umbedingt richtig!>>>> Da spricht jemand mit jahrzehntelanger Erfahrung in der>> Mikrocontrollerpogrammierung....>>>> (findest du das nicht selbst ein bischen peinlich ?)>> Also peinlich ist wenn man denkt Globale Variabeln überall einzusetzen.> ...
Bleiben wir doch ganz ruhig und freundlich.
Es sagt ja keiner dass Du überall globale Variablen einsetzen sollst.
Nur, dass in diesem Fall einfach nicht anders geht.
Ein struct geht auch. Es hat Vorteile wegen der Übersicht. Es erfordert
aber dennoch wenigstens diese eine Variable, die den struct-Typ hat, als
globale Variable.
Es ist eigenartig, aber Grunde genommen kann man, in einer
Unterbrechung, machen was man will. So man die Gültigkeit einiger
Variablen beachtet.
... aber eigentlich sollte man es nicht machen.
Es sind fast immer die gleichen Gründe, die dagegen sprechen einfach
irgendwelche Funktionen aufzurufen.
- Keine Parameterübergabe.
- Keine Kontrolle darüber wann was gemacht wird.
- Keine Übersicht über das zeitliche Verhalten. Bis zum Stacküberlauf.
- Kaum noch Debugmöglichkeiten.
Übrigens: Selbst wenn es 1000 Mal gut geht, heißt das immer noch nicht,
dass es beim 1001-ten Mal auch läuft. Oft hängt die Laufzeit einer
Funktion, von den zu verarbeitenden Werten ab. Nach meiner Meinung sind
hier Fließkommazahlen am schlechtesten vorhersehbar.
TS schrieb:> Wenn du jetzt sagst,dass es Übersichtlicher sei dann solltest du dich> selbst fragen wiso das du überhaupt dir erlaubst deinen Mund> aufzumachen. Ich will ja sehen wen ich dir ein Programm erstelle, wo nur> Globale Variabeln besitzt und 100te von Parametern ausgetauscht werden,> das du noch den überblich behältst wo die Variabel sich gerade verändert> im Programm oke! Aber ist ja übersichtlich stimmt ganz vergessen
Du hast völlig recht, globale Variablen sind nur zu verwenden, wenn es
gar nicht anders geht. Wer darüber herzieht, ist der, der von
strukturierter Programmierung nichts versteht.
Es gibt hier aber Leute, die warten nur auf darauf, dass irgend etwas
"anders" ist. Damit sie sich auf die Schreiber stürzen können wie die
Geier. Einfach ignorieren. Solche Leute sind am allerwenigsten vom Fach.
Denn sonst hätten sie ja Arbeit, und wären nicht (den ganzen Tag) in
Foren. Klar, oder :D