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
ohne code kann dir keiner helfen. evtl irgendwo rekursionen o.ä drin?
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.
Vergessen zu sagen... Interrupts sind keine in Verwendung... und PWM, I²C, serielle Schnittstelle und AD/C werden verwendet... Kann da irgendwas sein?
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...
Hmmm... Ich muss zugeben... Ich hab keine Ahnung von Interrupts... Was muss ich denn dazu machen?
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
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?
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??
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.