Forum: Mikrocontroller und Digitale Elektronik Taktprobleme beim Umstieg auf Mega328P


von Philipp J. (philippj)


Lesenswert?

Hallo!

Für ein Projekt habe ich ein relativ umfangreiches Programm für den 
Mega8 geschrieben. Das Problem ist, dass ich aufgrund diverser 
zusätzlicher Ideen inzwischen an die Kapazitätsgrenze gekommen bin und 
deshalb auf einen anderen chip ausweichen möchte. Aufgrund der 
zusätzlichen Funktionen bei gleichzeitig gleicher Grundausrüstung bin 
ich beim Mega328P gelandet. Dieser sollte bei weitem genug Speicher 
bieten und könnte ggf sogar noch durch den Mega168P ersetzt weren.

Als Entwicklungsumgebung dient das AVR Studio 5 in Verbindung mit einem 
STK 500.

Die Portierung auf den neuen Chip schien einfach. Einige Registernamen 
ändern ect. Leider funktioniert die Kommunikation über RS232 nicht wie 
gedacht, weshalb ich skeptisch wurde.

Ich habe nun rausgefunden, dass mein Mega328P anscheinend zu langsam 
arbeitet. Zum Vergleich habe ich folgendes Programm auf die beiden Chips 
aufgespielt:

/*
 * MEGA328P_Test.c
 *
 * Created: 12.01.2014 19:59:29
 *  Author: YD
 */

#define F_CPU 8000000

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

int main(void)
{

  DDRB = 0xFF;
  TCCR1A = (1<<COM1A1|1<<COM1A0|1<<WGM11|1<<WGM10);
  TCCR1B = (1<<CS11);
  OCR1A = 0x0200;

  sei();
    while(1)
    {
    _delay_ms(5000);
    PORTB ^= 0x2F;
    }
}

Zudem sind die Fuses so eingestellt, dass beide auf 8MHz intern laufen 
sollten.

Der Mega 8 toggelt damit recht genau im 5s Takt die freien Pins an 
PortB, was genau dem entspricht, was der Fall sein sollte.

An PB1 wird ein PWM Signal mit etwa 500Hz ausgegeben. Soweit ist also 
alles in Ordnung.

Nun kommt der Mega 328P ins Spiel.Das Toggeln findet etwa alle 40s 
statt, PB1 hat eine PWM mit ca 61Hz. Es wirkt so, als würde der Chip 
etwa 1/8 der gewünschten Frequenz sehen.

Da es auf mehreren Chips das selbe Verhalten zeigt, gehe ich davon aus, 
dass ich irgendetwas übersehen habe. Gibt es da einen bekannten Bug, bzw 
eine Sache, die gerne übersehen wird? Irgendein Fuse Setting, dass über 
die Oszillator Einstellung hinaus geht?

Vielen Dank im Vorraus für hilfreiche Antworten.

von Helmut S. (helmuts)


Lesenswert?

Schau mal bei den Fuses. Da gibt es als Grundeinstellung CKDIV8. Das 
teilt den Takt durch 8.

von Hubert G. (hubertg)


Lesenswert?

Nachdem das genau der achte Teil ist, nehme ich an das du das CKDIV8 in 
den Fuses nicht gelöscht hast.

von m.n. (Gast)


Lesenswert?

Als erste Anweisung in main() schreibe ich zumeist:
CLKPR = 0x80; CLKPR = 0x0; // CKDIV auf 0, voller CPU-Takt

Die Einstellung der betreffenden 'Sicherung' ist dann egal.

von Philipp J. (philippj)


Lesenswert?

So einfach kann die Lösung manchmal sein, danke vielmals. Fragt sich, 
warum die 328 standartmäßig mit diesem Fuse kommen.

von Helmut S. (helmuts)


Lesenswert?

> Fragt sich, warum die 328 standartmäßig mit diesem Fuse kommen.

Das ist notwendig, weil manche Leute einen 8MHz Quarz dran haben, aber 
den Prozessor nur mit 2V versorgen. Da kann der aber gar nicht mit 8MHz 
Befehle ausführen, weil die Gatter/Speicher/Flipflops bei 2V nicht 
schnell genug arbeiten.

von Falk B. (falk)


Lesenswert?

Damit man sie bei niedriger Versorgungsspannung betreiben kann.

von T.roll (Gast)


Lesenswert?

Philipp J. schrieb:
>Fragt sich, warum die 328 standartmäßig mit diesem Fuse kommen.
Nicht nur die. Auch bei anderen neueren Modellen ist das der Fall (z.B. 
Mega88).

Achja: Standar_d_

von Philipp J. (philippj)


Lesenswert?

An die Low voltage Kompabilität hatte ich gar nicht gedacht. Klingt 
allerdings schlüssig. Wiedereinmal eine Sache, auf die man achten 
sollte. Andererseits ist das ja genau das, was dieses Hobby so 
interessant macht.

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.