PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Probleme mit der Prozessor Frequenz



Olle_Filzlaus
17.01.2012, 18:21
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 :-)



#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;
}


Ich programmiere mit AVR Studio 5.

Thx for help

Filzlaus

sternst
17.01.2012, 20:14
Ich programmiere mit AVR (http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht) Studio 5.Dann mach mal ein Update. In irgendeiner Version ist eine fehlerhafte util/delay.h enthalten, die um den Faktor 4 zu langsam ist.

Olle_Filzlaus
17.01.2012, 20:24
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

sternst
17.01.2012, 20:41
#include <avr (http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht)/io.h>
#include <util/delay.h>

#ifndef F_CPU
#define F_CPU 8000000UL /* Quarz mit 8 Mhz */
#endifDas 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?

PuraVida
18.01.2012, 07:51
Damit delay.h funktioniert mußt Du die Optimierung einstellen, -Os.

Mach das mal.

Thalhammer
18.01.2012, 13:35
Schau mal unter Fehler oder so ähnlich ob da warnungen sind, die werden nicht automatisch angezeigt.

Olle_Filzlaus
18.01.2012, 17:48
Hi,

ich habe mal nachgeschaut. Externes Makefile ist abgeschaltet.

Aber wie vorhergesagt gibt es beim Copilieren eine Warnung:



Warnung 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


Witzig ist nur, dass ich in einem anderen PRogramm den gleich Kram bei nem Programm mit nem Xmega stehen habe, also


#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


und da gehts super. Noch irgend jemand ein Tip wieso ich diese Warnung bekomme?

thx Filzlaus

sternst
18.01.2012, 17:58
Noch irgend jemand ein Tip wieso ich diese Warnung bekomme?Ja, ließ den ersten Satz von meinem letzten Post nochmal.

Olle_Filzlaus
18.01.2012, 18:11
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:

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 32000000UL
#endif
#include <util/delay.h>

Da bekomme ich die Warnung hier:

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


also funktioniert es hier genau andersrum :-) Kann mir das jemand erklären wie das zustande kommt?

thx Filzlaus

Thalhammer
18.01.2012, 20:26
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.

sternst
18.01.2012, 20:40
Da bekomme ich die Warnung hier:
...
also funktioniert es hier genau andersrumDie gezeigte Warnung hat rein gar nichts mit F_CPU zu tun, oder damit, ob es vor oder nach dem Inkludieren von delay.h definiert wird.

Und wenn die falsche Reihenfolge ein richtiges Blinken ergibt, und die richtige Reihenfolge ein falsches, dann würde ich mich fragen, ob der XMega überhaupt mit dem gedachten Takt läuft.

Thalhammer
19.01.2012, 12:57
Unter umständen ist noch der interne resonator anstatt dem quarz aktiviert ?