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.
Schau mal bei den Fuses. Da gibt es als Grundeinstellung CKDIV8. Das teilt den Takt durch 8.
Nachdem das genau der achte Teil ist, nehme ich an das du das CKDIV8 in den Fuses nicht gelöscht hast.
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.
So einfach kann die Lösung manchmal sein, danke vielmals. Fragt sich, warum die 328 standartmäßig mit diesem Fuse kommen.
> 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.
Damit man sie bei niedriger Versorgungsspannung betreiben kann.
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_
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.