Forum: Mikrocontroller und Digitale Elektronik Frequenz messen mit ATMEGA16


von Raimund (Gast)


Lesenswert?

Hallo ,

erst einaml vorne weg, dies ist eine sehr informative und Hilfreiche 
Homepage. Ich lese hier jetzt schon seit mehreren Jahren mit.
Nun zu meinem Problem.
Ich möchte eine Freuquenz mit einem ATMEGA 16 Messen und auf einem LCD - 
Display ausgeben.
Nur liegt die von mir Gemessene Freuquenz immer etwas daneben.
Wenn ich 100 Hz Anlege zeigt mir mein Display 69hex an was 105 dez 
entspricht.
Bei 1000 Hz 467hex bzw. 1127dez
Und bei 3000 Hz d49 bzw. 3401dez.

Hier ist der von mir verwendete Code:
#include "main.h"
#include "lcd_drv.h"
#include "avr/interrupt.h"
#include "util/delay.h"

volatile uint16_t freq_alt;
volatile uint16_t freq;
volatile uint16_t frequenz;

char buf[15];

ISR (TIMER1_CAPT_vect)
{
  freq_alt = freq;
  freq = ICR1;

  }


int main()
{


 lcd_init();

  lcd_pos( 0, 0 );
  lcd_text( (u8*)"TEST");


  TCCR1B |= (1<<ICNC1);
  TCCR1B |= (1<<ICES1);     // pos Flanke
  TCCR1B |= (1<<CS10);
  TIMSK  |= (1<<TICIE1);    //Input Capture enable




        ACSR |= (1<<ACO);
  ACSR |= (1<<ACI);     //komparaton an
  ACSR |= (1<<ACIC);    //Verbindung zu Timer1 Capture
  ACSR |= (1<<ACIS1);    //steigende Flanke */



  freq = 0;
  freq_alt = 0;


  sei();

  for(;;)
  {
    cli();
    frequenz = freq - freq_alt;
    sei();

   frequenz = 1000000/frequenz;



utoa( frequenz, buf, 15);

  lcd_init();

  lcd_pos( 0, 0 );
  lcd_text( (u8*)buf);

  }
}

von David M. (md2k7)


Lesenswert?

Hallo!

Hört sich ganz danach an, als würde der Mega16 mit dem internen Takt 
laufen. Der interne Takt ist (ohne Kalibrierung) äußerst ungenau.

Hänge mal ein Quarz oder einen Quarzoszillator dran, und stelle die 
Fuses so um, dass der Mega den Takt extern bezieht (dabei aufpassen und 
nicht aussperren :-)

Gruß
David

von STK500-Besitzer (Gast)


Lesenswert?

Welche Taktquelle benutzt du denn?

von Raimund (Gast)


Lesenswert?

Hallo,

Danke für die Antworten. Ich habs fast befürchtet das der Interne Takt 
etwas ungenau ist. Werde mal mit einem externen Quarz Takten.
Leider habe ich mir schon einen verfust.
Benutze Ponyprog.

Beim ATMEGA8 habe ich keine Probleme da nehm ich die CKSEL3 ,CKSEL2, 
CKSEL1 die Haken raus und setzten einen bei CKSEL0.

Leider hat das bei ATMEGA16 nicht funktioniert.
Benutze das Pollin Evalution Board.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Raimund schrieb:
> 100 Hz Anlege zeigt mir mein Display 69hex an was 105 dez entspricht.
5% Fehler
> Bei 1000 Hz 467hex bzw. 1127dez
12,7% Fehler
> Und bei 3000 Hz d49 bzw. 3401dez.
13,3% Fehler

Ergo muss der Fehler in der Software liegen.
Zusätzlich zum ungenauen internen Takt.
Habe das Programm mal überflogen aber den Fehler auch nicht gefunden.

Mit [ c ]C-Code[ /c ] kannst du den Code lesbarer machen.

von David M. (md2k7)


Lesenswert?

@Raimund:

Falls noch aktuell - warum nimmst du nicht einfach einen "Fuse 
calculator" á la

http://www.engbedded.com/fusecalc

das macht die Fuse-Berechnungen einfacher. Dann muss man nur noch auf 
die Logik der Programmierer der Brennsoftware (was ist 1 / was ist 
programmiert / was ist "hakerl gesetzt"?) aufpassen.

von Hc Z. (mizch)


Lesenswert?

Raimund schrieb:

> utoa( frequenz, buf, 15);

Vielleicht schreibst Du dort einfach 16 statt 15 rein (oder rechnest im 
15er-Zahlensystem um) ... :)

Manchmal hat man Tomaten auf den Augen, ich weiß.

von Karl H. (kbuchegg)


Lesenswert?

Hazeh Zimmerer schrieb:
> Raimund schrieb:
>
>> utoa( frequenz, buf, 15);
>
> Vielleicht schreibst Du dort einfach 16 statt 15 rein (oder rechnest im
> 15er-Zahlensystem um) ... :)
>
> Manchmal hat man Tomaten auf den Augen, ich weiß.

Wobei sich natürlich die Frage erhebt:
Seit mindestens 15 Jahren (ich weiß ja nicht wie alt er ist) ist er an 
Dezimalzahlen gewöhnt. Warum also nicht einfach 10?

von Raimund (Gast)


Lesenswert?

Vielen Dank,

das war der Fehler.


Allerdings kann ich meinen ATMEGA16 auf dem Pollin Board nicht mit 16 
MHZ laufen lassen.
Evtl. Board defekt.
Denn mit dem externen Takt von einem Quarzoszillator funktionierts ohne 
Probleme.

von Peter R. (pnu)


Lesenswert?

Auf meinem Board läuft ein 16MHz-Quarz, aber das kann bei etwas anderer 
Temperatur oder Exemplarstreuung schon anders aussehen.

16 MHZ macht der atmega8 erst dann sicher, wenn die CKOPT-fuse gesetzt 
ist. Dann schwingt der Oszillator des atmega auf Kosten der 
Stromersparnis auch bei schwierigeren Schwingbedingungen.

von Raimund (Gast)


Lesenswert?

Alles erledigt.
Der Quarz auf dem Pollin Board war defekt.
Alten Ausgelötet neuen rein und schon geht´s.

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.