mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel Timer1 nicht regelmäßig


Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr,
für ein Projekt verwende ich den Timer1 meines Atmega644p, um die Zeit 
seit Start einer Messung zu speichern. In der Messung werden 
nacheinander Daten von externen ADCs und Chips ausgelesen und auf eine 
SD Karte gespeichert. Das funktioniert auch recht fix mit 650 
Datenpunkten / Sekunde.

Nun mein Problem - die Zeit scheint manchmal für 4 Schleifendurchläufe 
den selben Wert zu haben und dann manchmal für 2 Schleifen oder auch nur 
eine. Ich dachte jedoch, dass der Timer1 bei richtiger Einstellung jeden 
Takt hochgezählt wird. Die Zeit wird im long run auch richtig gemessen, 
Fehler treten jedoch nun in den sehr kleinen Zeitabständen auf. Fällt 
euch ein, wo der Fehler liegen könnte, oder stoß ich hier tatsächlich 
schon an die Grenzen des Atmels ?

Hier noch der Code:
typedef union {  // union erlaubt einen effektiven, seperaten Zugriff auf Teile der Variable
        unsigned long i32;
        struct {uint8_t i8l;  // low
                uint8_t i8m;  // mid
    unsigned int high; // high, soft timer                
               };
              } convert32to8;
        
volatile uint16_t softtimer;

ISR(TIMER1_OVF_vect)     // Timer Überlauf
{ 
  ++softtimer;     // zählen der Überläufe
  //stdmsg("Overflow Int");

}

//returns elapsed time since chip started in ms
inline float time_ms()
{
  convert32to8 cap;     // Variablendeklaration
   
  cap.i8l = ICR1L;      // low Byte zuerst, high Byte wird gepuffert
  cap.i8m = ICR1H;
  
  cap.high = softtimer;  // obere 16 Bit aus Software Zähler
  //zeitdifferenz = cap.i32 - timestamp;

  return (cap.i32 / ( (float)F_CPU ) );
} 


void timer_init()
{
  //TIMER STUFF
  softtimer = 0;   // wird für Zeitdifferenzmessung nicht mal gebraucht,
          // denn Differenz geht auch über Überlauf bei Softtimer  

  // Timer1 initialisieren:
   TCCR1A = 0;    // normal mode, keine PWM Ausgänge
   
  TCCR1B = (1<<CS10);
        
   TIMSK1 = (1<<TOIE1) ;   // overflow und Input-capture aktivieren, Mega32: TIMSK
  
   sei();
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>  cap.i8l = ICR1L;      // low Byte zuerst, high Byte wird gepuffert
>  cap.i8m = ICR1H;

Hast du ein Input Compare Ereignis?

>The Input Capture is updated with the counter (TCNTn) value each time an >event 
occurs on the ICPn pin...

TCNT statt ICR.

MfG Spess

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,
vielen Dank für deine Antwort. Der Hinweis ist SEHR gut und ich werd es 
gleich morgen ausprobieren, hoffe es klappt. Ansonsten meld ich mich 
nochmal.
Vielen Dank nochmal.
Gruß
Benjamin

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benjamin schrieb:
>
> typedef union {  // union erlaubt einen effektiven, seperaten Zugriff
> auf Teile der Variable
> 

Da Du hinterher durch float teilst, brauchst Du Dir um Effizienz keine 
Sorgen mehr zu machen. Die Union reißt da nichtmal ein klitzekleines 
Promille raus.

Aber um race conditions mußt Du Dir wirklich Sorgen machen.
Ich hab da schonmal was vorbereitet:

Beitrag "AVR Timer mit 32 Bit"


Nochn Tip:
Der CPU ist es vollkommen wurscht, ob der Timertick 1ms oder sonstwas 
ist.
Erst zur Ausgabe an den Menschen muß man in s umrechnen. Das könnte dann 
einige float-Rechnungen einsparen.


Peter

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.