Forum: Mikrocontroller und Digitale Elektronik AVR Frequenzmessung


von Jakov K. (jackenkoffer)


Lesenswert?

Hallo !

Ich habe folgende Methode für den AVR Atmega8 geschreiben um am Pin PB0 
eine anliegende Frequenz zu messen. Jedoch habe ich einen fiesen Bug 
drin, den ich nicht finden kann.
Wie man sieht habe ich nur ein teil meines Quelltextes gepostet, da der 
Rest unwichtig ist.
1
#define TICKS 16000000 // 16 MHZ Quarz
2
3
volatile u16 ic_zp_A,ic_zp_B; // Variablen, um das Register ICR1 auszulesen
4
volatile u8 i; // job-Variable
5
volatile u8 overflow; // zählt die Überlaufe
6
7
inline void ICP_init()
8
{
9
  TCCR1B |= (0<<ICNC1)|(0<<ICES1)|(0<<CS12)|(0<<CS11)|(1<<CS10); 
10
  // Prescaler = 1, 
11
  //Input capture enable, noise canceler disable, reagiere auf fallende flanke
12
  TIMSK |= (1<<TICIE1); // Input capture Interrupt enable
13
  DDRB &= ~(1<<PB0); // PB0 ( ICP1) als eingang
14
}
15
16
ISR(TIMER1_CAPT_vect)
17
{
18
  if (i == 0)    // 1.High Flanke
19
  {
20
    ic_zp_A = ICR1;
21
    overflow = 0;
22
    i = 1;
23
  }
24
  else           // 2.High Flanke
25
  {
26
    ic_zp_B = ICR1;  // Messung fertig
27
    i = 2;
28
  }
29
}
30
31
ISR(TIMER1_OVF_vect)
32
{
33
  overflow++;
34
}
35
36
float frequenzmessen(void)
37
{
38
  float fr;
39
  float icr1;
40
  u16 zw_Erg;
41
  
42
  lcd_string("Wird Gemessen"); // "Debug-funktion"
43
  i = 0;
44
  sei();
45
  TCNT1 = 0;
46
  while(i<2){}
47
  
48
  zw_Erg = ((overflow*65536) + ic_zp_B - ic_zp_A);  // Overflow berücksichtigen
49
  fr = TICKS / zw_Erg;      //16MHz Quarz
50
  cli();
51
  set_cursor(0,2);
52
  lcd_string("Wurde Gemessen");// "Debug funktion"
53
  _delay_ms(500);
54
  lcd_clear();
55
  return(fr);
56
}

Ich habe als "debug"-Funktion für die Frequenzmessung das LCD Display 
benutzt, um erkennen zu können, wo der Fehler ist.
Der Text "Wurde Gemessen" erscheint nicht auf meinem Display. daher 
denke ich , dass es die While-Schleife ist, die zu einer endlosschleife 
wird.
Fazit: ich suche eine möglichkeit den whileschleifen-Fehler zu 
eliminieren.
Bitte um eure Hilfe &&
Danke im Voraus !
Jakov

von Fuenf Tassen (Gast)


Lesenswert?

Schmeiss mal alles raus, was nicht absolut wichtig ist und lass dir den 
capture wert geben. zB auf das UART.

von Jakov K. (jackenkoffer)


Lesenswert?

Das funktioniert, das habe ich schon gemacht ;)
Einfach ein Programm, das bei tastendruck den Capture-wert an das LCD 
gibt.
Ich habe jedoch das Problem, dass ich die Zeit zwischen zwei Flanken 
brauche.
Gruß, Jakov

von Karl H. (kbuchegg)


Lesenswert?

Jakov K. schrieb:

> Wie man sieht habe ich nur ein teil meines Quelltextes gepostet, da der
> Rest unwichtig ist.

Das sagen sie immer. Und dann stellt sich ein ums andere mal heraus, 
dass es nicht stimmt.

Hast du denn wenigstens den abgespeckten Teil getestet ob er den Fehler 
zeigt?

von Jakov K. (jackenkoffer)


Angehängte Dateien:

Lesenswert?

Hier ist der ganze quelltext.
der quelltext lässt sich feherfrei compilieren , und die hex datei lässt 
sich auch auf den controller laden, doch Der controller tut nicht das 
was man ihm sagt.

von Fuenf Tassen (Gast)


Lesenswert?

Wenn man die zeit zwischen den flanken braucht, muss man im ersten 
interrupt die flanke umschalten.

von STK500-Besitzer (Gast)


Lesenswert?

Jakov K. schrieb:
1
   u16 zw_Erg;
2
   zw_Erg = ((overflow*65536) + ic_zp_B - ic_zp_A);  // Overflow berücksichtigen
Wie willst du den 65536 in eine 16-Bit-Veriable bekommen?

von Karl H. (kbuchegg)


Lesenswert?

Lass dir halt mal in der Schleife dein i (übrigens: ganz schlechter 
Name. i heißt jede 3. Hilfsvariable. Diese Variable ist WICHTIG. Die hat 
sich auch einen sprechenden Namen verdient) ausgeben. Bzw. in der ISR 2 
LED schalten, damit du siehst ob die Steuerung dort funktioniert.

von Elmar (Gast)


Lesenswert?

Hi

Du ahst nach der While Schleife beide geschw. Klammern, also eine 
Endlosschleife!!

von Elmar (Gast)


Lesenswert?

Ok i wird in der ISR Routine erhöht bzw. gesetzt.....

von 900ss (900ss)


Lesenswert?

Jakov K. schrieb:
> doch Der controller tut nicht das was man ihm sagt.

Doch, er tut genau(!) das, was du ihm sagst. ;-)

SCNR :-)

von Jakov K. (jackenkoffer)


Lesenswert?

sag bloß..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.