www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Asynchroner Timer: Zugriff auf Variablen


Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich glaube beobachtet zu haben, dass mein Programm spinnt, wenn ich aus 
dem asynchron getakteten Timer heraus auf Variablen zugreife. Das würde 
ja auch Sinn ergeben, eben weil der Zugriff sozusagen asynchron erfolgt.

Wie kann ich es denn jetzt aber machen, dass z.B. eine Variable in dem 
Timer asynchron hochgezählt und an anderer Stelle ausgelesen werden 
kann?


Gruß
Mr.Green

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

lesen
und Frage überarbeiten.

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

Bewertung
0 lesenswert
nicht lesenswert
"Aus einem Timer heraus" kann auf gar nichts zugegriffen werden. Du 
meinst schätzungsweise einen Timer-Interrupt-Handler...

Ohne Deinen Code zu sehen, kann man auch nur Vermutungen anstellen, was 
da schiefgehen könnte (z.B. volatile bei der Variablendeklaration 
vergessen usw...).

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, natürlich die ISR...
Also: Timer2 ISR.
Timer2 ist asynchron getaktet.

Die Variable ist volatile.

Code:
uint16_t sec_counter = 0;

volatile uint8_t start_meas = 0;

volatile uint8_t meas_time = 0;

#define MEAS_TIME  5  

int main() {

  uint16_t i;

  //Asynchron getaktet

  ASSR |= 1<<AS2;  //async Takt


  //Auf Einschwingen des 32k Quarzes warten

  for(i=0; i<100; i++)
    _delay_ms(10);

  TCCR2 = (1<<CS22)|(1<<CS21);  //genau 2 sec

  while(! ASSR & (1<<TCR2UB))
    ;  //Warten bis Update der Register möglich

  TIMSK |= (1<<TOIE2);

  sei();

  while(1) {
    //Oszi braucht einige Zeit zum Einschwingen
    //Auf Einschwingen des 32k Quarzes warten; dummy write

    OCR2 = 0;

    while(! ASSR & (1<<OCR2UB))
      ;  //Warten bis Update der Register möglich    

    set_sleep_mode(SLEEP_MODE_PWR_SAVE);
    sleep_mode();

    if(start_meas == 1) {

      [...]      



    } 
  }
  return 0;
}


//TImer 2 ISR: Asynchon getaktet
//weckt den Atmega aus dem Sleepmode auf

ISR(TIMER2_OVF_vect) // timer_overflow
{  
  if(meas_time == 1) {
    start_meas = 1;
    meas_time = 0;
  } else
    meas_time++;
}

Die ISR wird aufgerufen, selten wird start_meas auch 1, sodass er in die 
if innerhalb der main reingeht. Manchmal aber auch nicht.

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> selten wird start_meas auch 1
Das es das überhaupt wird, würde mich stark wundern. Es sei denn der 
Code zeigt hier nicht das wesentliche. Was versteckt sich hinter dem 
...?

Auf welche Weise wird denn meas_time == 1?  Voodoo?


Bitte

http://www.avrfreaks.net/index.php?name=PNphpBB2&a...

lesen
und Frage überarbeiten.

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was soll dieses "asynchron" andauernd? Externer Takt oder was? Dann 
schreib das doch, bitte.

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meas_time== 1 wird? Nun, durch den else-Zwei würde ich sagen. Dafür 
braucht es nicht mal Voodoo...

Was in der [...] steckt ist vollkommen ohne Belang, dahin kommt er ja 
nicht (wie ich oben schrieb)

Asynchron heißt asynchron. Genauso, wie Atmel es im Datenblatt 
beschreibt (Mega8: S 119 ff). Nichts anderes. Natürlich extern getaktet; 
intern wäre es synchron zur Main-Clockdomain.

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

Bewertung
0 lesenswert
nicht lesenswert
Maxi wrote:
> Und was soll dieses "asynchron" andauernd? Externer Takt oder was? Dann
> schreib das doch, bitte.
Wozu? Wenn Du Ahnung von der Materie hättest, dann wäre "asynchroner 
Timer 2" im Zusammenhang mit AVR völlig eindeutig.

Du solltest übrigens Deinen Umgangston hier im Forum ganz schnell 
verbessern! Du bist mir in den letzten Tagen häufiger mit extrem 
unverschämten Äußerungen aufgefallen. Man kann sich auch einigermaßen 
normal unterhalten.

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie meas_time== 1 wird? Nun, durch den else-Zwei würde ich sagen. Dafür
>braucht es nicht mal Voodoo...

In dem Fall schon, denn wie kommt er denn in den Else-Zeig?

>Asynchron heißt asynchron.
Aber nicht so, wie Du das Wort verwendest. Es setzt nämlich zwei 
verschiedene Dinge in Beziehung. Wie in "X ist asynchron zu Y". Ob das 
Atmel richtig schreibt ist mir wurscht. Du fragst ja "hier" und nicht 
bei Atmel.

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na gut. Dann halte ich halt die Klappe.

Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wie meas_time== 1 wird? Nun, durch den else-Zwei würde ich sagen. Dafür
>>braucht es nicht mal Voodoo...

>In dem Fall schon, denn wie kommt er denn in den Else-Zeig?

Na, toll. Das war dann auch noch Mist von mir. Grrrr.

Jedenfalls, ist es doch aber so, das er immer zwischen dem if- und dem 
else hin und her pendelt.
Am Anfang ist meas_time == 0, dann geht er einmal in den else-zweig und 
setzt meas_time = 1. Dann wieder in den true-zweig und setzt meas_time = 
0.

Jetzt bin ich aber still.

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja richtig! Das ist der gleiche Effekt, den ein Modulo hätte. Das habe 
ich aber gar nicht zur Diskussion gestellt..............

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

Bewertung
0 lesenswert
nicht lesenswert
Maxi wrote:
> Na gut. Dann halte ich halt die Klappe.
Du sollst nicht die Klappe halten (es ist ja durchaus schön, dass Du 
helfen willst!), sondern Du sollst dieses überhebliche 
"Ich-weiß-alles"-Gehabe sein lassen...

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich sollte es nicht das Problem sein (wegen untersch. Gross / 
Kleinschreibung), aber es ist gefährlich zwei gleichlautende Bezeichner 
zu haben:
volatile uint8_t meas_time = 0;

#define MEAS_TIME  5  

Ruck zuck verliert man den Überblick, was wofür verwendet wird..

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.