-
Seltsames Problem
Hallo, ich ein total komisches Problem:
Wenn ich _delay_ms() aufrufe wartet es nicht nur ungenau, nein viel schlimmer, es wartet jedesmal anders.
Code:
#include <avr/io.h>
#include <util/delay.h>
void long_delay(uint16_t ms) {
for(; ms>0; ms--) _delay_us(1000);
}
int main(void)
{
DDRB=0xFF;
// Insert code
//init();
//set_pin(PORTB,PIN1);
while(1)
{
long_delay(100);
clear_pin(PORTB,PIN0);
long_delay(10000);
set_pin(PORTB,PIN0);
}
return 0;
}
Wenn ich das baue und auf meinen Mega8@1MHz lade ist die an phase länger als die ausphase (obwohl es eigentlich umgekehrt sein sollte) und die Wartezeit mit nichten 100ms sondern deutlich über 1 Sekunde.
Ich hab nicht die leiseste Ahnung woran das liegen könnte.
Im simulator funktioniert das Programm einwandfrei.
Ich werde es morgen auch noch auf einem anderen AVR Testen
-
Wird irgendwo F_CPU gesetzt? (Bevorzugt über die Entwicklungsumgebung oder das Makefile, wenn es Quick & Dirty sein muss, auch über #define F_CPU 1000000UL als erste Zeile im Code)
Davon abgesehen: Wie überprüfst du das Ausgangssignal? Mit einer LED? Ist die auch entsprechend verdrahtet (gegen GND)?
mfG
Markus
-
F_CPU wird von der IDE gesetzt, ich prüfe die Ausgabe mit einer LED, die gegen GND liegt.
Der Takt kommt vom internen Oscillator und laut fuses auf 1MHz gesetz.
Hab jetzt mal was neues Probiert:
Code:
int main(void)
{
DDRB=0xFF;
// Insert code
//init();
//set_pin(PORTB,PIN1);
while(1)
{
for(uint8_t i=0;i<10;i++) {
_delay_ms(100);
toogle_pin(PORTB,PIN1);
}
toogle_pin(PORTB,PIN0);
}
return 0;
}
Funktionierd prima, solange die funktion nicht das ende der while schleife erreicht.
Auf Deutsch:
Die Led an PB1 blinkt genau 5 mal und dann schaltet sich die grüne ein.
Sobald die grüne leuchtet bleibt der controller stehen.
-
Davon abgesehen, dass du mit einer Menge Funktionen um dich wirfst, die ich nie gesehen/gebraucht habe, folgender Code funktioniert in der Simulation ohne Probleme:
Code:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF;
while(1)
{
for(uint8_t i=0;i<10;i++) {
_delay_ms(100);
PORTB ^= (1 << PB1);
}
PORTB ^= (1 << PB0);
}
return 0;
}
Unterschiede: Keine komischen Funktionen zum setzen/umschalten von Pins, keine komischen Bezeichner für die einzelnen Pins.
mfG
Markus
-
Bei mir ist nichts komisch, die Bezeichner werden vom GCC definiert und sind mit denen von PB0 etc identisch.
Und die "unbekannten" Funktionen sind Compiler Makros, die genau das machen was du geschrieben hast.
In der Simulation (SimulAVR) funktionierds bei mir auch ganz normal, aber auf dem Mega nicht.
//EDIT:
Hab grade den Code von dir gebaut und auf den AVR gebrannt, gleiches Phänomen.
Die LED an PB1 blinkt bis die an PB0 angeht und dann ist schluss.
Die an PB0 bleibt an und die an PB1 aus.
-
Habe beide Programme mit dem AVR-Studio4 kompiliert, funktionieren beide.
Das tooggle_pin und clear_pin kenne ich allerdings nicht, vielleicht liegt dort der Fehler?
-
habs grade editierd:
Hier noch die Macros:
Code:
#define set_pin(port,pin) ((port) |= (1<<pin))
#define clear_pin(port,pin) ((port) &= ~(1 <<pin))
#define toogle_pin(port,pin) ((port) ^= (1<<pin))
Der bleibt einfach stehen sobald er das ende der while schleife erreicht.
-
Funktioniert auch mit deinen define.
-
Hm dann probier ich mal nen anderen AVR, denn meiner bleibt einfach stehen.
So hab grade nochmal einen neuen AVR genommen, gleiches Problem.
Ist das möglicherweise ein Bug im avr-gcc oder der avr-libc ?
-
Probleme mit der Spannungsversorgung? Eine LED funktioniert, die zweite bringt den AVR in einen instabilen Zustand. Aber dass der Fehler so reproduzierbar auftritt, macht mich stutzig ...
mfG
Markus