Forum: Mikrocontroller und Digitale Elektronik AVR TWI Dauerschleife


von Osccon (Gast)


Lesenswert?

Hallo,
ich versuche gerade das TWI Modul vom ATmega2560 zum laufen zu bringen.
Ein Ausschnitt meines C Codes sieht folgendermaßen aus:
1
  // Start
2
  TWCR |= (1 << TWINT) | (1 << TWSTA);
3
4
  while(!(TWSTA & (1 << TWINT)))
5
  {
6
  }

Leider bleibt das Programm aber immer an der While Schleife hängen.
Ich habe zuerst gedacht, dass das vermutlich so ist, weil die TWINT Flag 
aus irgendeinem Grund nicht gesetzt wird aber als ich das ganze mit dem 
Debugger und JTAG untersucht habe bin ich auf eine komische Stelle in 
der Disassemblierung gekommen:
1
TWCR |= (1 << TWINT) | (1 << TWSTA);
2
00000094  LDD R24,Z+0    Load indirect with displacement 
3
00000095  ORI R24,0xA0    Logical OR with immediate 
4
00000096  STD Z+0,R24    Store indirect with displacement 
5
00000097  RJMP PC-0x0000    Relative jump

Es macht doch überhaupt keinen Sinn, dass der Compiler hier ein RJMP 
PC-0x0000 hinsetzt!?
Das ist doch eine unendliche Schleife ohne eine Bedienung oder nicht?
Ich habe das ganze ausprobiert mit der O0 und O1 Optimierung und beides 
mal das gleiche Problem gehabt.

Vielleicht hat jemand eine Idee was da falsch läuft.

von spess53 (Gast)


Lesenswert?

Hi

>Das ist doch eine unendliche Schleife ohne eine Bedienung oder nicht?

Nein, das Programm geht nach dem  'RJMP PC-0x0000' weiter.

MfG Spess

von Osccon (Gast)


Lesenswert?

Wieso das denn?
Er springt doch quasi zur gleichen Stelle zurück was also eine 
unendliche Schleife ergeben würde.
Außerdem sehe ich das ja im Debugger.
Ich kann so viele Schritte weiter machen wie ich möchte und er bleibt 
immer an der gleichen Stelle nämlich bei 'RJMP PC-0x0000'.

von Martin (Gast)


Lesenswert?

TWSTA ist ja eine konstante, damit ist die Schleife immer true. Daher 
eine Endlosschleife

von Jim M. (turboj)


Lesenswert?

Osccon schrieb:
> Es macht doch überhaupt keinen Sinn, dass der Compiler hier ein RJMP
> PC-0x0000 hinsetzt!?

Doch. Du hast da nämlich nur Konstanten in der while() Bedingung, und 
der Compiler erkennt das, weil es auf ein while(1) hinausläuft.

Schau Dir mal an wie das entsprechende Status Register wirklich 
heisst.

von Osccon (Gast)


Lesenswert?

Oh. Verdammt.
Da habe ich was übersehen...

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.