Hallo alle zusammen, ich bin hier neu, frisch angemeldet, vorher mit Assembler, jetzt mit C angefangen. Das Forum lese ich aber schon seit längerer Zeit. Ich habe schon viele Antworten auf meine Fragen bekommen, ohne einen Post geschickt zu haben (alle Achtung!). Thema Delay war auch schon unzählige Male gewälzt, aber nirgendwo habe ich 'ne Antwort gefunden. Mein Problem: Delay Zeiten bei mir viel zu lange (8-10 mal zu lang). 200ms sollten es sein, ung. 1600 sind es. Ich habe auch ein Beispielprogramm von irgendwo kopiert, F_CPU-Bedingung hinzugefügt (make file ist automatisch generiert), auf M8 und M128 ausprobiert, Parameter "20" ist auch constant und auch nicht zu groß, alles leider ohne Erfolg. Sieht jemmand einen versteckten Fehler? Der Code: #include <avr/io.h> #ifndef F_CPU #define F_CPU 8000000UL #warning "F_CPU war noch nicht definiert, wird nun mit 8000000 definiert" #endif #include <util/delay.h> int main(void) { DDRB = 0xFF; int i; while(1) { PORTB ^= (1 << PB0); // LED for(i=0;i<10;i++) { _delay_ms(20); } } return 0; } Ich verwende: AVR Studio 4.13.557, Service Pack 1 mit eingebautem WinAVR. Danke im Voraus!
Hört sich für mich so an, als ob du mit internem RC-Oszillator als Taktquelle arbeitest und den mit den 1 MHz wie ab Werk betreibst, aber das Programm fälschlicherweise über F_CPU gesagt bekommt, es wäre ein 8 MHz Taktquelle am werkeln. Eine andere Fehlerursache könnte sein, dass beim Übersetzen mit AVR-GCC die Codeoptimierung nicht eingeschaltet ist. Mehr im Abschnitt Warteschleifen im AVR-GCC-Tutorial
Hallo, die Optimierung ist auf -O2 eingestellt. Und welche "Flag" ist für Clock-Auswahl verantwortlich?
> Und welche "Flag" ist für Clock-Auswahl verantwortlich? Keins. Taktauswahl machst du über den Hardwareaufbau (interne Taktquelle oder externe z.B. Quarz) und die Fuses-Einstellung passend tzm Hardwareaufbau. Damit das Programm (bzw. hier die delay Routinen in der Library) passend zur Taktquelle läuft, wird der eingestellte Takt über das Makro F_CPU bekannt gemacht. Andere Funtionen, die mit diesem Makro arbeiten, können sein UART (serielle Übertragung), Timer, ... Mehr dazu im Artikel AVR Fuses
Gar kein Flag, die Taktfrequenz lässt sich nur von aussen durch umprogrammieren der entsprechenden Fuses ändern. Das define F_CPU dient nur dazu, dem Programm mitzuteilen, welche Taktfrequenz extern eingestellt wurde, hat aber keinen Einfuß auf den Prozessor. Mehr Info dazu gibts im DAtenblatt, und auch z.B. hier: http://www.mikrocontroller.net/articles/AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen Oliver
> Gar kein Flag, die Taktfrequenz lässt sich nur von aussen durch > umprogrammieren der entsprechenden Fuses ändern. Das kommt auf den Typ an. Bei manchen kann der Takt-Vorteiler über ein I/O-Register eingestellt werden.
Das war das! Die Fuses CKSEL3..0 waren einfach im Originalzustand - "0001" also "1 MHz internal RC". Ich habe es auf "0000" gesetzt, also "External clock" (auf XTAL1), also meine Config. und es funzt! Ich danke euch! PS. Das beste Forum die es je gab!!!
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.