Dann mach mal ein Update. In irgendeiner Version ist eine fehlerhafte util/delay.h enthalten, die um den Faktor 4 zu langsam ist.Ich programmiere mit AVR Studio 5.
Hallo Leute,
habe heute wieder mal ein Problem wo ich nicht weiter komme. Ich habe ein Atmega 328P. Dort habe ich mir ein kleines Programm geschrieben wo eine LED blinken soll. Das macht sie auch, aber das Timing ist falsch. Wenn ich dort 100ms Toogle Time einstelle, blinkt der in 500ms Takt. Bei anderen Wartezeiten ist es ähnlich. Immer so 4-5x länger als geplant.
Dachte mir, ok, ist der Clock falsch eingestellt. Aber steht in den Fuses auf 8MHz. Habe ir auch auf Pin PB0 die Taktfrquenz ausgeben lassen und mitten Oszi nachgemessen. Die Quarzfrequenz passt. Also letzte Idee habe ich mir ein kleines Bascom Programm geschrieben. Da geht alles supi. Also habe ich irgendwo ein Problem im C-Programm. Finde den Fehler aber nicht. Aber vielleicht ihr
Ich programmiere mit AVR Studio 5.Code:#include <avr/io.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 8000000UL /* Quarz mit 8 Mhz */ #endif int main( void ) { DDRB |= (1<<PB5) | (1<<PB4); //als Ausgang PORTB |= 0b00100000; //setzte von PB5 und PB4 nicht while(1) // Endlosschleife { PORTB ^= (1<<PB5) | (1<<PB4); // Toggle PB0 z.B. angeschlossene LED _delay_ms(100); // warten... } return 0; }
Thx for help
Filzlaus
Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
Sir Isaac Newton
Dann mach mal ein Update. In irgendeiner Version ist eine fehlerhafte util/delay.h enthalten, die um den Faktor 4 zu langsam ist.Ich programmiere mit AVR Studio 5.
Geändert von sternst (17.01.2012 um 21:40 Uhr)
MfG
Stefan
Hi,
AVR-Studio 5 ist up to date und der Fehler ist auch in der 4 vorhanden. Komischer weise geht es auf dem Xmega128A1 ohne Probleme. Fast der selbe Programmcode. Dort läuft es richtig, auf dem Mega 328P nicht.
thx Filzlaus
Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
Sir Isaac Newton
Das F_CPU wird nach dem Inkludieren von util/delay.h definiert. Wenn trotzdem beim Compilieren keine Meldung kommt, dann bedeutet das, dass eine F_CPU-Definition bereits über das Makefile "reinkommt". Ist das auch 8000000?Code:#include <AVR/io.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 8000000UL /* Quarz mit 8 Mhz */ #endif
MfG
Stefan
Damit delay.h funktioniert mußt Du die Optimierung einstellen, -Os.
Mach das mal.
Schau mal unter Fehler oder so ähnlich ob da warnungen sind, die werden nicht automatisch angezeigt.
Hi,
ich habe mal nachgeschaut. Externes Makefile ist abgeschaltet.
Aber wie vorhergesagt gibt es beim Copilieren eine Warnung:
Witzig ist nur, dass ich in einem anderen PRogramm den gleich Kram bei nem Programm mit nem Xmega stehen habe, alsoWarnung 1 #warning "F_CPU not defined for <util/delay.h>" c:\program files (x86)\atmel\avr studio 5.0\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/util/delay.h 89 3 Blinker
und da gehts super. Noch irgend jemand ein Tip wieso ich diese Warnung bekomme?#include <avr/io.h>
#include <util/delay.h>
// Define default CPU frequency (2 MHz), if this is not already defined.
#ifndef F_CPU
#define F_CPU 32000000UL
#endif
thx Filzlaus
Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
Sir Isaac Newton
Hallo sternst,
das wars. Ich danke dir. Ich dachte immer das man erstmal alle Header reinwirft und dann den Rest macht. Also wieder was gelernt
Erst CPU definieren und dann das delay.h reinwerfen.
Edit:
Aber echt seltsam ist, dass ich das jetzt auch bei dem Programm vom Xmega so eingestellt habe:
Da bekomme ich die Warnung hier:#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 32000000UL
#endif
#include <util/delay.h>
also funktioniert es hier genau andersrum Kann mir das jemand erklären wie das zustande kommt?Warnung 1 #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" c:\program files (x86)\atmel\avr studio 5.0\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/util/delay.h 94 3 1_4_2 UART mit Funktionen_Selbst
thx Filzlaus
Geändert von Olle_Filzlaus (18.01.2012 um 19:44 Uhr)
Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
Sir Isaac Newton
schon mal nach gemessen ob beim xmega die zeiten EXACT stimmen, auf die ms ?
könnte nähmlich sein das es nur nicht auffällt dass der Fehler durch die abgeschaltete Optimierung das ausgleicht was du mit dem falsch definierten F_CPU verursachst.
Nicht sehr warscheinlich und warscheinlich auch falsch aber ne besser erklärung fällt mir grad nicht ein.
könnte auch sein das bei den Xmega includes der F_CPU von haus aus schon höher definiert ist.
Lesezeichen