www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage: Variablen (unsigned int) vom main und Interrupt


Autor: Detlev Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe da mal eine generelle Frage,

nehmen wir an ich deklariere mir eine eine globale variable als
unsigned int die heißt timeout. Nun läuft in meinen AVR programm ein
genereller Softwaretime

ISR (TIM1_OVF_vect)    
{
      TCNT0=0x67;         // Timer für 1 msec vorsetzen

      SEI(); 

  if(timeout > 0)    // Erhöhe Software-Clock-Zähler, 
  {
     timeout--;    // solange Höchstwert nicht erreicht ist
  }  

}

Im Main setzt ich jetzt dentimeout wert aof sagen wir 300
und wart in einer while schleife bis der Wert null ist. Es
läuft noch ein weiterer interrupt in der Maschine der ist nicht
unterbrechbar. Jetzt meine Frage, ein schreiben einer 16Bit Variable
passiert nicht in einem prozessor zyklus, kann es bei der konstellation
zu falsch interpretaionen kommen des 16 bit wertes kommen? Main oder 
interrupt. muss ich dieses bei dem zugriff sperren? Wenn ja wie mach ich 
das in einer Warteposition


Gruß

Detlev

Danke

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

Bewertung
0 lesenswert
nicht lesenswert
Detlev Neumann schrieb:


> unterbrechbar. Jetzt meine Frage, ein schreiben einer 16Bit Variable
> passiert nicht in einem prozessor zyklus,

genau

> kann es bei der konstellation
> zu falsch interpretaionen kommen des 16 bit wertes kommen?

Natürlich

> Main oder
> interrupt. muss ich dieses bei dem zugriff sperren?

in main().

Im Interrupt kann das Schreiben und Lesen ja sowieso nicht unterbrichen 
werden. Da sind weitere Interrups ja sowieso gesperrt.

> Wenn ja wie mach ich
> das in einer Warteposition

Was meinst du damit?
Im schlimmsten Fall muss man sich eben unter INterruptsperre den 
kompletten Wert in eine lokale Variable holen, kann dann die Interrupts 
wieder freigeben und mit der lokalen Kopie des Wertes weiterarbeiten.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die *atomic.h* an.

Autor: Detlev Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl-Heiz,

>Im schlimmsten Fall muss man sich eben unter INterruptsperre den
>kompletten Wert in eine lokale Variable holen, kann dann die Interrupts
>wieder freigeben und mit der lokalen Kopie des Wertes weiterarbeiten.

Diesen Teil verstehe ich noch nicht ganz

Sagen wir mein main sieht wie folgt aus.

while(1)
{

 if (fehler)
 timeout = 300
 ......
 while(timeout)
 .......


}

   SEI(); ist ein MAKRO und macht meinen Interrupt unterbrechbar.

wie soll ich jetzt timeout schutzen so das ich es nicht durch zwei 
Seiten zeitgleich anfasse?

Danke

Detlev

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

Bewertung
0 lesenswert
nicht lesenswert
Detlev Neumann schrieb:

> Diesen Teil verstehe ich noch nicht ganz
>
> Sagen wir mein main sieht wie folgt aus.
>
>
> 
> while(1)
> {
> 
>  if (fehler)
>  timeout = 300
>  ......
>  while(timeout)
>  .......
> 
> 
> }
> 

   ....

   cli();
   localTimeout = timout = 300;
   sei();

   while( localTimeout ) {
     cli();
     localTimeout = timeout;
     sei();
   }

   ...

anstelle von sei und cli kann man natürlich auch die von Skript Kiddy 
angesprochenen Makros sinnvoll einsetzen. Das Prinzip bleibt aber das 
gleiche.

Autor: Detlev Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Ich meine Karl-Heinz

Und danke Skript Kiddy

genau das

>Schau dir mal die *atomic.h* an.

beantwortet meine Frage

Danke euch

Detlev

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.