Atmel springt aus Schleife

Gast #159283
Lesenswert?
• ▲
▼
Hallo,
ich habe einen ATmega128, programmiert mit avr-gcc und folgendes
Problem:
Während der Controller eigentlich in einer

while(1) {
 [etwas code, aber nichts, was zu einem Abbruch führen kann]
    }

Schleife ist, springt dieser dort einfach heraus und ruft eine andere
Funktion auf - und zwar so, wie es nirgends im Code vorkommt (Debugging
per LCD-Display)
Außerdem habe ich das Problem, dass der Controller sich manchmal bei
anderen Funktionen einfach "aufhängt" - ich denke mal, dass da
irgendein Zusammenhang zwischen den Probleme besteht, oder?

Hat jemand eine Idee, wo da das Problem liegt und wie man das ganze
beheben kann?

Danke schonmal im Vorraus,
Thomas
Gast #159286
Lesenswert?
• ▲
▼
hmmm... nein... keine rekursion drin...

in dieser while-schleife wird eine funktion aufgerufen, die ein paar
portpins setzt --> scheint nicht weiter schlimm zu sein...

eine sleep-funktion:

   void sleep(void)
   {
     long count,count1;

     for(count = 0; count < 2000;count++)
     {
       for(count1 = 0; count1 < 100;count1++)
       {
       }
     }
   }

die wird per schleife mit einer anderen variable noch ein paarmal
(300mal) aufgerufen... (dass die variable in der schleife darüber den
gleichen namen hat macht doch nichts, oder?)

und dann ist da noch eine funktion, die daten auf ein LCD ausgibt...
und dort werden zeiger benutzt... (wär ja mein persönlicher favorit für
den verdacht ;)) -> in dem programm sind einige zeiger in verwendung...

würd ja eigentlich gern den kompletten code posten... aber dabei
handelt es sich um etwas für einen wettbewerb, der in ein paar tagen
stattfindet... geht also leider nicht.
Gast #159288
Lesenswert?
• ▲
▼
trozdem initialisieren!
wenn z.B. durch einen Impuls von aussen ein Interrupt auftritt springt
der Atmel nicht zurück sondern läuft einfach weiter ab der Stelle wo
dier Interruptvektor hinzeigt. Das ist bei Assembler schon nicht
einfach zu finden, aber bei c...
Gast #159290
Lesenswert?
• ▲
▼
Hi

Darf ich mal vermuten das du deinen Mega128 noch nicht so lange hast
und die Funktion in der while()-Schleife die erste ist die du aufrufst?
Wenn dem so ist, ist noch die Mega103 Kompatibilitätsfuse gesetzt. Das
führt dazu das der SP ins Nirvana zeigt und damit das zurückkehren aus
der Funktion schief geht und der AVR (meistens) wieder von vorne
startet.

Matthias
Gast #159291
Lesenswert?
• ▲
▼
Naja... Eigentlich hab ich den schon länger... Bzw... Ich habe gerad den
 alten Mega128 durch einen neuen ersetzt (war defekt)

Der Atmel springt auch nicht an den Anfang, sondern eine andere
Funktion wird aufgerufen... wie gesagt... mit einem argument, dass an
keiner anderen stelle vorkommt...

Welches Fuse Bit ist das?
Gast #159293
Lesenswert?
• ▲
▼
hast schon mal ein "nop" in die innere for-schleife gemacht?
sowas wie deine schleifen (ohne inhalt) sollen doch manchmal einfach
weg-optimiert werden.
I²C, serielle Schnittstelle und AD/C... alles ohne Interrupts??
Gast #159294
Lesenswert?
• ▲
▼
okay... doch interrupts ;)
fuse ist nicht gesetzt.

aber es gibt den aufruf von dieser funktion doch... aber da ist
keinerlei verbindung zu der main... (ist eine vollkommen ungenutze
funktion)... der controller springt also irgendwo mitten in den code...
Gast #159295
Lesenswert?
• ▲
▼
Hi

auch das kanns durchaus bei gesetzter M103C-Fuse passieren. Glaubs
einfach und schau nach bzw. sag uns mal wie die drei Fuse-Bytes
eingestellt sind. Dann kann man das zumindest mal ausschließen. Aber
wenn du ihn gerade gewechselt hast ist es höchst wahrscheinlich eben
diese Fuse.

Matthias
Gast #159296
Lesenswert?
• ▲
▼
wie im beitrag drüber schon geschrieben ;) fuse ist nicht gesetzt...
hmmm....

hab jetzt mal eine abgespeckte version von dem prog gemacht... nurnoch
AD/C und I²C (mit i2cMasterSendNI usw.)

der controller hängt sich einfach mittendrin... ohne irgendwas zu sagen
:-P

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren