Forum: Mikrocontroller und Digitale Elektronik SPI Problem: Warte ich in der Senderoutine auf InterruptFlag hängt sich Atmega8 auf


von Jens N. (midibrain)


Angehängte Dateien:

Lesenswert?

Guten Abend,
hier mal wieder ein SPI Problem:

Nachdem ich nun den zweiten Tag versuche einen DigiPoti (MCP41010) via 
SPI anzusprechen möchte ich Euch um Rat bitten.

Wenn ich in der Senderoutine das InterruptFlag abfrage bleibt der 
Controller hängen als würde das Flag nie gesetzt werden. Kommentiere ich 
die beiden Zeilen aus läuft der Controller, SPI geht natürlich nicht.

Im Anhang der betreffende Code, sollte das nicht reichen kann ich auch 
gern den Rest posten der allerdings umfangreich ist.

Dank für Eure Antworten.

von Chose (Gast)


Lesenswert?

Keine INT Routine! Der muß sich aufhängen.....Errata lesen auch nicht 
vergessen!

von Jens N. (midibrain)


Lesenswert?

Hallo,

die ISR ist nicht mit gepostet, tschuldigung...

Sie ist allerdings auch leer da ich sie ja nur zum selbständigen löschen 
des Flag`s brauche.

Was soll ich beachten? Errata? Bitte um Aufklärung!

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Jens Neumann schrieb:
> die ISR ist nicht mit gepostet, tschuldigung...
>
> Sie ist allerdings auch leer da ich sie ja nur zum selbständigen löschen
> des Flag`s brauche.

Was erwartest du?

Interruptbedingung tritt ein --> (leerer) Interrupthandler wird 
aufgerufen, bevor dein Unterprogramm dazu kommt das Flag abzufragen --> 
durch den Aufruf des (leeren) Interrupthandlers wird das Flag natürlich 
gelöscht und deine while Schleife schleift sich nen Wolf!

von Jens N. (midibrain)


Lesenswert?

Das bedeutet doch ads ich ohne die while_schleifen arbeiten kann?

von Cyblord -. (cyblord)


Lesenswert?

Jens Neumann schrieb:
> Das bedeutet doch ads ich ohne die while_schleifen arbeiten kann?

Ohne While-Schleife läuft dein Programm zum Ende der main(). Dort 
springt es in eine Endlosschleife. Vorher wird noch das I-Bit gelöscht. 
Du hast also keine Interrupts mehr. Daher brauchst du aufjedenfall 
irgendeine Endlosscheife vor dem Ende der main().

gruß cyblord

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Jens Neumann schrieb:
> Das bedeutet doch ads ich ohne die while_schleifen arbeiten kann?

Nein.... Das bedeutet, dass Du

gänzlich ohne den Interrupt und den dazugehörigen Handler arbeiten 
könntest, wenn du nach dem while(...) das Flag "händisch" wieder 
zurücksetzt.

von Jens N. (midibrain)


Lesenswert?

Hallo Magnus M.,
bin eigentlich auch nicht scharf auf den Interrupt da der ja sowieso nix 
macht.

o.k.: Hab mal das InterruptFlag aus dem INIT_SPI genommen und hinter die 
while_schleifen ein SPSR &= ~(1<<SPIF) geschrieben.

Hängt sich trotzdem auf...

von xfr (Gast)


Lesenswert?

Ein Blick ins Datenblatt ergibt:

SPIF is cleared by hardware when executing the corresponding interrupt 
Handling Vector. Alternatively, the SPIF bit is cleared by first reading 
the SPI Status Register with SPIF set, then accessing the SPI Data 
Register (SPDR).

Auf Deutsch: Du musst SPDR lesen um SPIF zurückzusetzen.

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.