Hallo Leute, habe da mal eine Frage zu Thema "Funktionen" und "ISR". Habe ein kleines Program geschrieben womit ich einen Motor takten möchte. Wenn ich einen Überlauf Zähler in der Funktion selber hoch zähle funktioniert es: (Schrittzahl und Takt sind volatile int welche woanders geschrieben werde; Überlauf ist ebenfalls als volatile int deklariert) void starten (void) { i = 0; Ueberlauf = 0; while (i<Schrittzahl) { if (Ueberlauf >= Takt) { PORTC |= (1<<Servo_Takt); Ueberlauf = 0; i += 1; } else { PORTC &= ~(1<<Servo_Takt); } Ueberlauf += 1; } } wenn ich denn Ueberlauf allerdings über einen Timer Overflor hochzählen lassen will funktioniert da nichts mehr? Programm wie folgt: ISR(TIMER0_OVF_vect) { Ueberlauf += 1; } void starten (void) { i = 0; Ueberlauf = 0; while (i<Schrittzahl) { if (Ueberlauf >= Takt) { PORTC |= (1<<Servo_Takt); Ueberlauf = 0; i += 1; } else { PORTC &= ~(1<<Servo_Takt); } } } der Timer Overflor funktioniert auf jeden Fall, dass habe ich mit einer LED die ich in dieser Routine angeschaltet habe getestet. KAnn es sein das der Wert Ueberlauf nur am Anfang der Funktion einmal übergeben wird und sich dann nicht mehr von außen ändern lässt? Vielen dank schon mal im vorraus!
Hui das ging ja schnell mit der Antwort, danke! Werde mir dann mal was anderes ausdenken, mal schauen ob ich das Prinzip verstanden habe... :-) volatile int? das heißt doch soweit ich weiß, dass die variable gobal ist!?
Andre K. wrote: > Hui das ging ja schnell mit der Antwort, danke! > > Werde mir dann mal was anderes ausdenken, mal schauen ob ich das Prinzip > verstanden habe... :-) > > volatile int? > > das heißt doch soweit ich weiß, dass die variable gobal ist!? nicht notwendigerweise. volatile heisst lediglich, dass sich der Compiler mit dieser Variablen bei der Optimierung zurückhalten soll, da es Wege gibt wie sich die Variable verändert, die für den Compiler nicht erkennbar sind. Hat aber nichts damit zu tun, ob die Variable lokalen oder globalen Scope hat.
Oh, dachte das heißt global. Aber es ist doch richtig, dass ich die variable überall im programm verwenden und ändern kann, nicht wahr. oder gibt es da eine andere dekleration für? Hat sich jetzt aber eh erst einma für mich erledigt, habe meinen AVRISP MK2 Contoller geschossen und kann jetzt erst mal nicht mehr ausprobieren :-(
>das heißt doch soweit ich weiß, dass die variable gobal ist!?
Nein.
Das heißt in etwa, dass jeder Zugriff auf den Wert der Variable auch
einen Zugriff auf den Speicherplatz bedeutet.
Wichtig ist es zum Beispiel bei Variablen, die sich unvorhergesehen
ändern können. (z.B. Variablen, die sowohl in einem Interrupt als auch
außerhalb dieses Interrupts verwendet werden)
Es heißt aber auch, dass der Zugriff auf den Speicherplatz nicht vom
Compiler wegoptimiert werden darf. (z.B. in busy wait schleifen in
Verwendung)
> Oh, dachte das heißt global. Warum behaupten die Leute immer, sie haetten gedacht, wenn sie offensichtlich genau das nicht getan haben? > Aber es ist doch richtig, dass ich die variable überall im programm verwenden und ändern kann, nicht wahr. > oder gibt es da eine andere dekleration für? Haettest du gedacht, haettest du a) Spaetestens jetzt das Tutorial gelesen b) Die Suchfunktion benutzt Und nicht zum 100ten Mal die gleiche Frage gestellt. > Hat sich jetzt aber eh erst einma für mich erledigt, habe meinen AVRISP MK2 Contoller geschossen und kann jetzt erst mal nicht mehr ausprobieren :-( Wahrscheinlich hast du da vorher auch "gedacht". Denken ist nicht das, was Finger und Mund tun...
Hallo Juppi, Du ätzt hier aber ganz schön rum! Warum verschwendest Du Deine Zeit - und die der anderen Forumsteilnehmer -, wenn Du nichts Konstruktives beizutragen hast, oder kleidest Deine Kritik wenigstens in eine etwas höflichere Form?
@ Juppi In der Sache magst Du ja Recht haben, aber im Ton... C'est le ton qui fait la musique.
Danke Juppi für deine Hilfe, zum glück gibt es auch noch die schlauen Menschen auf der Welt. Hoffe ich habe deine Kostbare Zeit nicht zu sehr vergoldet. Danke natürlich auch denen die mir Konststuktiv helfen konnten...
Global wird eine Variable dadurch, dass sie außerhalb jeglicher Funktionen definiert wird. (*) Lokal ist eine Variable dann, wenn sie innerhalb einer Funktion definiert ist. Ihr Gültigkeitsbereich (Scope) erstreckt sich dann nur innerhalb der betreffenden Funktion. volatile ist ein sogenannter Typqualifizierer und hat als solcher nichts mit dem Gültigkeitsbereich einer Variable zu tun. volatile sagt dem Compiler lediglich (wie Karl heinz schon schrieb), dass die Variable sich außerhalb des ZUgriffsbereichs des Compilers ändern kann (z.B. eben durch Hardware-Ereignisse) und er an einer so "qualifizierten" Variable keine Zugriffsoptimierung durchführen soll. (*)Genaugenommen ist sie aber erst dann wirklich global (d.h. in allen Source-Modulen eines Projektes nutzbar), wenn sie außerhalb von Funktionen und nicht static definiert ist, was aber bei Programmen, die nur aus einem Source-File bestehen, gehopst wie gesprungen ist.
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.