Atmel springt aus Schleife

Gast #159283
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
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 #159287
Vergessen zu sagen... Interrupts sind keine in Verwendung...
und PWM, I²C, serielle Schnittstelle und AD/C werden verwendet...

Kann da irgendwas sein?
Gast #159288
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.