Forum: Mikrocontroller und Digitale Elektronik Funktionen, Interups und Variablen


von Andre K. (Gast)


Lesenswert?

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!

von Arne (Gast)


Lesenswert?

Ueberlauf als volatile deklariert?

von Andre K. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

von Andre K. (Gast)


Lesenswert?

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 :-(

von ein (Gast)


Lesenswert?

>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)

von Juppi (Gast)


Lesenswert?

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

von Glitch (Gast)


Lesenswert?

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?

von Severino R. (severino)


Lesenswert?

@ Juppi

In der Sache magst Du ja Recht haben, aber im Ton...

C'est le ton qui fait la musique.

von Andre K. (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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
Noch kein Account? Hier anmelden.