www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktionen, Interups und Variablen


Autor: Andre K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Arne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ueberlauf als volatile deklariert?

Autor: Andre K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

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

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

Autor: Andre K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: ein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Glitch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Juppi

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

C'est le ton qui fait la musique.

Autor: Andre K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.