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


von KobiP (Gast)


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:
1
#define PORT_LED PORTB
2
#define PIN_LED 2 //PORTB
3
4
int main(void) {
5
  int j=0;
6
  while(1){
7
    for(j=0;j<=49;j++){
8
    PORT_LED &= ~PIN_LED;
9
    //PORT_LED |= PIN_LED;
10
    }
11
    for(j=0;j<=49;j++){
12
    //PORT_LED &= ~PIN_LED;
13
    PORT_LED |= PIN_LED;
14
    }
15
  }
16
  return 0;
17
}

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

von Michael M. (Gast)


Lesenswert?

clkdiv8

von Michael G. (linuxgeek) Benutzerseite


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.

von Thomas B. (escamoteur)


Lesenswert?

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

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

von Michael M. (Gast)


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

von KobiP (Gast)


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!

von Karl H. (kbuchegg)


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.
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define PORT_LED PORTB
7
#define DDR_LED  DDRB
8
#define PIN_LED 2 //PORTB
9
10
int main(void)
11
{
12
  DDR_LED |= (1<<PIN_LED);
13
14
  while(1){
15
    PORT_LED &= ~PIN_LED;
16
    _delay_ms( 500 );
17
18
    PORT_LED |= PIN_LED;
19
    _delay_ms( 500 );
20
  }
21
  return 0;
22
}

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.

von KobiP (Gast)


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

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.