Forum: Mikrocontroller und Digitale Elektronik Atmel springt aus Schleife


von Thomas Klingbeil (Gast)


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

von Tobi (Gast)


Lesenswert?

ohne code kann dir keiner helfen. evtl irgendwo rekursionen o.ä drin?

von anonym (Gast)


Lesenswert?

interrups nicht richtig initialisiert?

von Thomas Klingbeil (Gast)


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.

von Thomas Klingbeil (Gast)


Lesenswert?

Vergessen zu sagen... Interrupts sind keine in Verwendung...
und PWM, I²C, serielle Schnittstelle und AD/C werden verwendet...

Kann da irgendwas sein?

von anonym (Gast)


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...

von Thomas Klingbeil (Gast)


Lesenswert?

Hmmm... Ich muss zugeben... Ich hab keine Ahnung von Interrupts...
Was muss ich denn dazu machen?

von Matthias (Gast)


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

von Thomas Klingbeil (Gast)


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?

von OldBug (Gast)


Lesenswert?

M103C in der EFuse...

von Sebastian (Gast)


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??

von Thomas Klingbeil (Gast)


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...

von Matthias (Gast)


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

von Thomas Klingbeil (Gast)


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

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
Noch kein Account? Hier anmelden.