mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega88 läuft mit falscher Frequenz, ca 122KHz


Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein leichtes Problem mit meiner Umsetzung von Mr. Data, die 
AD-Wandler funktionieren klasse nur die GPS-Komunikation will ned 
hinhauen, nur Datensalat. Ich vermute dass da was mit der Baudrate nicht 
hinhaut, und für die brauch ich die Frequenz des ATmega's.

Habe daher mal folgendes Programm geschieben:
#define PORT_LED PORTB
#define PIN_LED 2 //PORTB

int main(void) {
  int j=0;
  while(1){
    for(j=0;j<=49;j++){
    PORT_LED &= ~PIN_LED;
    //PORT_LED |= PIN_LED;
    }
    for(j=0;j<=49;j++){
    //PORT_LED &= ~PIN_LED;
    PORT_LED |= PIN_LED;
    }
  }
  return 0;
}

Am Oszi messe ich jetzt 1,2279KHz. Mir ist klar dass ich die 
Programmlaufzeit grad ignoriere, aber die sollte ja nur wenige Prozent 
(wenn überhaupt) ausmachen.

Zu den Fusebits:
SUT_CKSEL steht auf Int. RC Osc. 8 MHz 6CK/14CK + 65ms

Ich Programmier mit dem AVRStudio in C. Erfahrung mit C hab ich, leider 
jedoch nur sehr sehr wenig in Verbindung mit Atmegas.

Zur Hardware: ATmega88 in TQFP Bauform. Am XTAL1 ist nichts angelötet, 
an PB1 messe ich. Versorgt wird der AtMega mit 3,3V.

Könnt Ihr mir sagen wie ich meinen ATmega wieder auf 1MHZ oder 8MHZ 
bekomme? Oder eignet sich mein Programm einfach nur nicht um die 
Frequenz zu messen?

Grüße!

KobiP

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
clkdiv8

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
KobiP schrieb:

> Zu den Fusebits:
> SUT_CKSEL steht auf Int. RC Osc. 8 MHz 6CK/14CK + 65ms

Wahrscheinlich ist CKDIV8 programmiert, dann laeuft er mit ca. 1MHz.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du ne saubere RS232 Kommunkation brauchst, solltest Du eh einen 
externen Quartz mit entsprechender Frequenz nehmen:

http://www.mikrocontroller.net/articles/Baudratenquarz

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Burkhart schrieb:
> Wenn Du ne saubere RS232 Kommunkation brauchst, solltest Du eh einen
> externen Quartz mit entsprechender Frequenz nehmen:

nicht wirklich...
ein kalibrierter rc-osz. mit 8-fach teiler ist genau genug

Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal, CKDIV8 war wirklich gesetzt. Hab ich rausgenommen, 
jetzt  messe ich 2,4433KHz bzw 104µs für einen Durchgang.

Ist mein Programm wirklich so schlecht geeignet um die Frequenz 
rauszubekommen? Sind die Programmlaufzeiten wirklich so groß dass sie 
sich bemerkbar machen?

Grüße!

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

Bewertung
0 lesenswert
nicht lesenswert
Bei deinen Laufzeiten könnte die for-Schleife schon einen nicht 
unerheblichen Einfluss haben (hast du den Optimizer eingeschaltet?). 
Zumal du mit int j dem Prozessor eine 16-Bit Arithmetik unnötig 
aufzwingst.

Probier das mal:
Die _delay_ms sind zwar auch nicht ganz genau, aber sie stimmen ziemlich 
gut. Und auf ein paar Hz Abweichungen kommst dir ja nicht an. Du willst 
ja die Größenordnung der F_CPU feststellen.
#define F_CPU 1000000

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

#define PORT_LED PORTB
#define DDR_LED  DDRB
#define PIN_LED 2 //PORTB

int main(void)
{
  DDR_LED |= (1<<PIN_LED);

  while(1){
    PORT_LED &= ~PIN_LED;
    _delay_ms( 500 );

    PORT_LED |= PIN_LED;
    _delay_ms( 500 );
  }
  return 0;
}

Optimizter auf -Os stellen!
Wenn deine CPU mit 1Mhz läuft, blinkt die LED jede 1 Sekunde 1 mal auf. 
Das kann man auch mit freiem Auge ganz gut abschätzen. Blinkt sie 
schneller, läuft auch die CPU mit einem schnelleren Takt.

Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Danke Karl Heinz, hab grad mein Programm noch mal geflashed und siehe da 
es klappt! Hab daher deine Lösung nicht mehr getestet.

Herzlichen Dank euch allen!

KobiP

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.