mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung mittels Input Capture mode ( mega 32 )


Autor: Tim (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich würde gerne die Zeit zwischen 2 Signalen messen mittels des Input 
Capture modes.
Hizu habe ich auch hier im Forum einen ganz nützlichen Code Gefunden, 
jedoch wirft mir mein Compiler jedes mal einen Fehler aus, mit dem ich 
absolut nichts anfangen kann.

 und zwar:

../Frequenzmessung.c:72: error: redefinition of 'ISR'
../Frequenzmessung.c:41: error: previous definition of 'ISR' was here



Ich sitze jetzt schon Stunden da und komme einfach nicht weiter.
Könnte mir bitte jemand dabei einen Tip geben.

Danke!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR wird normalerweise hier definiert:

#include <avr/interrupt.h>

Da das bei dir nicht hilft, benutzt du offensichtlich eine hornalte
Version der Bibliothek (vor 1.4.x, aktuell ist 1.6.7).  Dafür sind
leider mittlerweile die Supportverträge abgelaufen. ;-)

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info!

Ich habe mir alerdings erst kürzlich die neueste Version von AVR-Studio 
runtergeladen. (4.16)
Habe leider keine Ahnung ob das auch mit der Bibliothek zusammenhängt.
Kann man die irgend wie updaten?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim schrieb:

> Ich habe mir alerdings erst kürzlich die neueste Version von AVR-Studio
> runtergeladen. (4.16)

Davon abgesehen, dass es meines Wissens schon eine 4.17 gibt
(zumindest als Beta), AVR Studio hat damit nichts zu tun.

Sehr wahrscheinlich hast du ein WinAVR da drunter, das müsstest du
mal auf einen aktuellen Stand bringen.  Deiner muss noch von ca.
2005 stammen.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt; die Version ist von 2005.

Habe sie jetzt auf Stand gebracht ( 2009 ) Version 1.6.6.
ändert jedoch nichts an meinem Problem

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

Bewertung
0 lesenswert
nicht lesenswert
Ich bin so frei und poste den Code einfach mal hier herinnen.
Das ständige zum *.txt wechseln (warum eigentlich *.txt und nicht *.c) 
ist mir nämlich zu blöd.
Und damit man das alles auch lesen kann, lege ich wieder mal Hand an und 
formatiere das mal etwas
(Ist es nicht erstaunlich. Diejenigen bei denen der Source Code auch 
optisch in Ordnung ist haben meistens auch viel weniger 'seltsame 
Probleme')
#ifndef F_CPU
#define F_CPU 8000000
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

#include <stdlib.h>
#include "lcd.h"

#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

volatile unsigned char NrOverflows = 0;   // Anzahl der Timer Overflows die während der Messung passiert sind
volatile unsigned int StartTime = 0;   // ICR-Wert bei der 1.High-Flanke speichern
volatile unsigned int EndTime = 0;    // ICR-Wert bei der 2.High-Flanke speichern
volatile unsigned char UpdateDisplay;  // Job Flag

//#define LCD_LINE1 0x00 // Position an der das ERgebnis der Frequenzmessung ausgegeben wird

ISR( TIMER1_CAPT_vect )
{
  static unsigned char ErsteFlanke = TRUE;
    
  if (UpdateDisplay)  // das Display wurde mit den Ergebnissen der vorhergehenden Messung
    return;      // noch nicht upgedatet. Die nächste Messung verzögern, bis der Start
              // und EndTime Variablen wieder gefahrlos beschrieben werden können.

  // Bei der ersten Flanke beginnt die Messung, es wird der momentane 
  // Timer beim Input Capture als Startwert gesichert
  //

  if ( ErsteFlanke )
  {
    StartTime = ICR1;
    NrOverflows = 0;
    ErsteFlanke = FALSE;    // Die nächste Flanke ist das Ende der Messung
  }

  // das ist die zweite Flankte im Messzyklus. Die Messung wird gestoppt

  else 
  {
    EndTime = ICR1;
    UpdateDisplay = TRUE;  // Eine vollständige Messung. Sie kann ausgewertet werden
    ErsteFlanke = TRUE;    // Bei der naechsten Flanke beginnt der nächste Messzyklus
  }
}

ISR( TIMER1_OVF_vect )
{
  NrOverflows++;
}

int main()
{
  char lcdCounterString[8];
  double Erg = 0.0;

  lcd_clrscr();

  TCCR1B = (1<<ICES1) | (1<<CS10);  // Input Capture Edge, kein PreScale
  TIMSK = (1<<TICIE1) | (1<<TOIE1); // Interrupts akivieren, Capture + Overflow

  sei();

  while(1)
  {
    if( UpdateDisplay )    // liegt eine vollständige Messung vor?
    {
                           // Berechnung der Zeitdauer zwischen den Takten
                           // EndTime und StartTime sind unsigned darum braucht kann EndTime auf
                           // kleiner sein als StartTime, nur Overflows müssen berücksichtigt werden
        
        
      Erg = ( NrOverflows * 65536 ) + EndTime - StartTime; // ausrechnen der Takte
         
        // aufbereiten fürs Display

      Erg = F_CPU / Erg;   // f=1/t Signalfrequenz

      itoa(Erg, lcdCounterString, 8);

      //dtostrf( Erg, 5, 3, lcdCounterString ); // 3 Nachkommastellen
                                                // ausgeben
      lcd_clrscr();
      lcd_gotoxy ( 0,0 );
      lcd_puts (lcdCounterString);
        
      UpdateDisplay = FALSE; // nächste Messung kann Starten                
    }
  }
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
%% avr-gcc -Wall -Wextra -mmcu=atmega128 -Os -o foo.elf foo.c lcd.c
In file included from foo.c:7:
/usr/local/lib/gcc/avr/4.3.2/../../../../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."

Diese Warnung ist das einzige, was mein Compiler daran auszusetzen
hat.

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.