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?
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.