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); } }
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
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.
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.
@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.
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ß.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.