mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel springt aus Schleife


Autor: Thomas Klingbeil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohne code kann dir keiner helfen. evtl irgendwo rekursionen o.ä drin?

Autor: anonym (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
interrups nicht richtig initialisiert?

Autor: Thomas Klingbeil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Klingbeil (Gast)
Datum:

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

Kann da irgendwas sein?

Autor: anonym (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas Klingbeil (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Klingbeil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M103C in der EFuse...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Thomas Klingbeil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Klingbeil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.