Hallo, Mein Problem wäre dass ich wahrscheinlich den Quarz nicht richtig eingestellt habe, und ich weiß nicht genau wie ich das machen kann. Ich habe an einem ATmega328P einen externen 20 Mhz Quarz angehängt. (auch mit diesen 15µF Kondensatoren) Ich arbeite mit AVR studio 5 und habe schon bei den Fusebits „EXTFSXTAL_16KCK_14CK_65ms“ (Ext. Full-swing Crystal; Start- up time PWRDWN/RESET: 16 K CK/14 CK +65ms) eingestellt. In das Programm hab ich auch noch dies geschrieben: #include <avr/io.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 20000000UL #endif Eine LED sollte nun 1 Sekunde leuchten und 1 Sekunde nicht leuchten. Das passiert aber nicht. Statdessen Leuchtet die LED etwas über einer halben Sekunde, und leuchtet nicht für etwa eine halbe Sekunde. Ich denke dass der Quarz nicht richtig initialisiert wurde, oder dass man das woanders machen muss… Bin schon am verzweifeln. Seit fast zwei Wochen sitz ich auf dem Problem und komm nicht weiter. Kann mir bitte jemand einen Tipp geben?
Lukas schrieb: > Kann mir bitte jemand einen Tipp geben? ja #ifndef F_CPU #define F_CPU 20000000UL #endif muss vor #include <util/delay.h>
Wenn du erst die delay.h einbindest und danach erst die F_CPU festlegst, wie soll die delay.h dann die richtige Frequenz erfahren?
ja, stimmt ich meinte 15pF sorry
also der code siht jetzt so aus:
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
#include <util/delay.h>
int main(void)
{
DDRB = (1 << PB1); //PB1 als Ausgang
while(1)
{
PORTB ^= (1 << PB1); //PB1 toggln
for(int i=0 ; i<100 ; i++) //wartet 1000ms
{
_delay_ms(10);
}
}
return 0;
}
Lukas schrieb: > #ifndef F_CPU > #define F_CPU 20000000UL > #endif F_CPU wurde nicht zufällig im Makefile schon definiert?
Lukas schrieb: > wie kann ich das herausfinden und ändern? Du kannst auch mal einfach diese drei Zeilen auskommentieren. Wenn dann ein Fehler kommt, daß F_CPU nicht definiert ist, dann lag's nicht daran.
Er arbeitet ja mit AVR-Studio 5 da müssten man dann schon selbst eine Makefile einbinden, ansonsten macht das AVR S5 für dich. Du kannst auch einfach _delay_ms(1000) eingeben. Dann kann es noch sein dass bei den fuse ckdiv aktiv ist.
ok, ich habs auskommentiert -> es kam keine fehlermaldung nach dem kompilieren -> also muss es bereits in diesem Makefile definiert sein also muss ich das Makefile finden und die frequenz ausbesser. Simmt das so?
Rolf Magnus schrieb: > Du kannst auch mal einfach diese drei Zeilen auskommentieren. Wenn dann > ein Fehler kommt, daß F_CPU nicht definiert ist, dann lag's nicht daran. Da wird keine Fehlermeldung sondern eine Warnung kommen, weil in der delay.h steht:
1 | #ifndef F_CPU |
2 | /* prevent compiler error by supplying a default */ |
3 | # warning "F_CPU not defined for <util/delay.h>" |
4 | # define F_CPU 1000000UL |
5 | #endif |
ok, jetzt bin ich erst verwirrt ich weiß nicht geau was gemeint ist ich dachte ich soll das makefile finden und da die Frequenz ändern, und nicht im delay.h
Du wirst keine makefile finden in AVR Studio 5, ausser du hast eine extern eingebunden. Was ich mir nicht denken kann.
ok, aber was muss ich jetzt eigentlich machen damit der Mikrokontroller weiß dass er einen 20Mhz Quarz hat? Wo muss ich das hinschreiben?
Das musst du in den Projekt-Einstellungen im AVR Studio angeben. Dort wo du auch angibst welchen Controller Typ du verwendest.
Davon ausgehend dass dein Quarz ein 20MHz Quarz ist. 1. Fuse richtig setzten 2. F_CPU in deinem Code definieren. das war es eigentlich schon.
Chris schrieb: > Du wirst keine makefile finden in AVR Studio 5, ausser du hast eine > extern eingebunden. Was ich mir nicht denken kann. Stell das dort ein, wo Du auch den µC-Typ eingestellt hast. Im Studio 4 ist das unter "Project -> Configuration Options". Btw: Ich finde dieses Konstrukt #ifndef F_CPU #define F_CPU 20000000UL #endif für das schlechteste, was man machen kann. Entweder man definiert es im Source oder man definiert es nicht im Source. Aber so eine Wischiwaschi-Angabe nach dem Motto "Compiler, wenn Du es nicht besser weisst, nimm halt 20 MHz" ist das unbestimmteste und unberechenbarste, was man machen kann. Lieber entweder kein define, um eine Fehlermeldung zu bekommen oder ein unbedingtes(!) define, z.B. #define F_CPU 20000000UL In beiden Fällen bekommt man vom Compiler eine anständige Fehlermeldung, wenn es nicht oder doppelt definiert wurde.
Frank M. schrieb: > In beiden Fällen bekommt man vom Compiler eine anständige Fehlermeldung, > wenn es nicht oder doppelt definiert wurde. welcher Compiler meckert denn bei einem Doppelte #define?
Peter II schrieb: > welcher Compiler meckert denn bei einem Doppelte #define? AVR GCC bringt mir zumindest eine Meldung.
Jakob B. schrieb: > AVR GCC bringt mir zumindest eine Meldung. ich habe es mit dem GCC unter linux mit -Wall getestet da kommt nichts
Frank M. schrieb: > Stell das dort ein, wo Du auch den µC-Typ eingestellt hast. Im Studio 4 > ist das unter "Project -> Configuration Options". Aber im Studio 5 nicht mehr... @Frank Hast du dir mal AVR Studio 5 angeschaut? Da ist das alles etwas anderst.
Peter II schrieb: > welcher Compiler meckert denn bei einem Doppelte #define? Habe ich gerade beim AVR Studio 4.18 probiert: #define F_CPU 1000000UL #define F_CPU 1000000UL -> keine Fehlermeldung #define F_CPU 1000000UL #define F_CPU 100000UL -> 2 Warnungen Gruß Dietrich -
Peter II schrieb: > Jakob B. schrieb: >> AVR GCC bringt mir zumindest eine Meldung. > ich habe es mit dem GCC unter linux mit -Wall getestet da kommt nichts sorry, wenn das define gleich ist kommt keine Meldung, nur wenn es sich unterscheidet.
Ich schaff es einfach nicht, die Fuses sollten stimmen, im programm hab ich jetzt: #include <avr/io.h> #define F_CPU 20000000UL #include <util/delay.h> stehen, und es funktioniert einfach nicht...
Peter II schrieb: > sorry, wenn das define gleich ist kommt keine Meldung, nur wenn es sich > unterscheidet. So ist es. Dann weiß man direkt Bescheid, dass man 2 sich widersprechende Einstellungen getätigt hat. Deshalb ist das "#ifdef F_CPU" einfach suboptimal. Es macht weder den Compiler schlauer noch den Entwickler, der verzweifelt nach dem Fehler sucht.
Lukas schrieb: > die Fuses sollten stimmen, [...] Zeig bitte die Werte von l-fuse, h-fude und e-fuse.
Lukas schrieb: > L-fuse: 0x77 > H-fuse: 0xD9 > E-fuse: 0xFF l-fuse ist falsch. Das muss 0xFF sein, siehe auch http://www.engbedded.com/fusecalc/ Edit: Also "Ext Crystal Osc" und CKDIV nicht vergessen! Sonst wird der Takt durch 8 geteilt!
da hat das problem leider nicht gelöst, jetzt blinkt die LED za. 5 mal in der sekunde (schwer zu sagen)
Lukas schrieb: > da hat das problem leider nicht gelöst, jetzt blinkt die LED za. 5 mal > in der sekunde (schwer zu sagen) Wahrscheinlich blinkt es 8 mal pro Sekunde. Was hast Du eingestellt? 0x7F oder 0xFF? Sorry ich hatte meine Antwort eben nachträglich berichtigt, weil ich zunächst übersehen habe, dass Du auch CKDIV falsch eingestellt hattest. Es muss 0xFF sein. Überprüfe das nochmal.
Ja entschuldigung Chris, ich hatte deine antwort nicht gesehen, da ich warscheinblich meine antwort schrieb währund du deine geschriegen hast, oder so also ich hab jetzt: L-fuse: 0xFF H-fuse: 0xD9 E-fuse: 0xFF ja das kann durchaus auch 8 mal pro sekunde sein... aber eigentlich sollte es 1s leuchten und 1s nicht leuchten
Lukas schrieb: > L-fuse: 0xFF > H-fuse: 0xD9 > E-fuse: 0xFF Also wenn es jetzt noch falsch blinkt, liegt es am Delay-Bug im AVR-Studio 5 (LED blinkt dann 4 mal zu schnell), siehe: Beitrag "AVR-Studio 5, Delay-Bug behoben?" bzw. Beitrag "Re: Thermomixer noch einmal neu - dieses mal nur ein MEGA16"
Jetzt hat er aber den Low Power Crystal Oscillator aktiviert. Das kann auch nicht stimmen. Richtig wäre wohl eher für L-Fuse: 0xF7 Aber schau noch mal im Datenblatt nach.
Chris schrieb: > Jetzt hat er aber den Low Power Crystal Oscillator aktiviert. Das glaube ich nicht. Schau Dir bitte http://www.engbedded.com/fusecalc/ an, das ist ein nettes Tool :-) Mit 0xFF ist ein Quartz oberhalb 8 MHz eingestellt. So muss es auch sein.
also einer der diesen fehler hat, meint dass in version 5.0.1163 behoben sei und genau diese version hab ich. naja dann werd ich mal alles deinstallieren neu runterladen und neu installieren, wenn das nichts hilft, tja dann... kein Mikrokontroller für mich!!
Laut Datenblatt geht die Einstellung mit 0xFF für Low Power Crystal von 8MHz bis 16MHz. Er hat aber einen 20 MHz Quarz dran womit diese Einstellung falsch ist. 0xF7 wäre die richtige für 20 MHz. Oder es steht im Datenblatt falsch. Wobei ich dem Datenblatt von Atmel eher glaube als dem Tool.
also mit 0xFF passiert genau das selbe als mit 0xF7 Also ich kann keinen unterschied erkennen
Hier gibt es eine funktionierende delay.h Kopiere die mal über deine vorhandene (im richtigen Verzeichnis!) Beitrag "Re: Problem mit Atmega32 und LCD (HD44780 kompatibel)"
So ich habe avr studio 5 auf einem anderen Rechner installiert und den Mikrokontroller mit den gleichen Einstellungen wie vorher programmiert Die LED sollte ursprünglich 1s leuchten und 1s nicht leuchten auf dem ursprünglichen Rechner blinkt die LED ca. 8 mal pro Sekunde auf dem anderen Rechner leuchtet die LED jetz etwas länger als 1s und ist auch für etwas länger als 1s dunkel (nach 30s ist´s schonwieder um einem halbe Sekunde daneben) woran kann das jetzt liegen? es ist zumindest ein Teilerfolg, aber das sollte schon genauer sein...
Hi Lukas! Ich bin zwar auch so ein Anfänger wie Du oder vielleicht sogar noch ein blutigerer Anfänger aber ich meine mich zu erinnern, daß die Delay-Funktion nicht gescheit funktioniert wenn man nicht die Optimization auf zumindest "Optimize for Size" eingestellt hat. Hast Du das gemacht? Finden tust Du das unter Project ->DeinProjekt Properties. Dann auf "Toolchain" und dort unter "AVR/GNU C Compiler" auf "Optimization" und da kannst es dann rechts im Fenster auswählen. Wie stellst Du denn die Fuses ein? Auch im AVR-Studio? Aber, wie gesagt, bin selbst erst blutiger Einsteiger. Allerdings meine LEDs blinken brav wie sie sollen nach ersten Mühen. ;-)) LG Ernst
wow es scheint echt zu funktionieren ich habs auf "Optimize for size (-Os)" eingestellt und es tut nun das was es soll komisch find ich nur dass auf den ersten rechner von hausaus "Optimize for size (-Os)" auf auf dem zweiten rechner (wos jetzt eigenartigerweiße funktioniert) war "None (-O0) eingestellt.. aber es geht Ich danke dir DANKE, DANKE, DANKE!!!!
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.