Atmega88 läuft mit falscher Frequenz, ca 122KHz

Gast #1549668
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
Gast #1549681
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
Gast #1549690
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!
#1549695
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren