Forum: Mikrocontroller und Digitale Elektronik SPI lässt sich nicht aktivieren Atmega328P


von Jumper M. (jumper1416)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
Ich habe folgendes Problem: Mein Atmega 328P auf einem Arduino UNO Bord 
lässt nicht zu, dass ich das SPE Register im SPCR (Kontrollregister von 
SPI) beschreibe.
Das Programm soll an sich nicht viel machen sondern nur das Register 
beschreiben und eine LED danach zum blinken bringen. Allerdings kommt 
der Prozessor nie zu dem Punkt dass er blinkt, wenn der Befehl SPCR |= 
(1<<SPE) aktiv ist. Ich benutze das Atmel Studuio, habe das ganze aber 
auch schon mit der Arduino IDE auf Linux und Windows versucht. Kann es 
irgendwie an den zwei Arduinos liegen die ich benutze?
Vielen Dank schonmal

von Falk B. (falk)


Lesenswert?

Jumper M. schrieb:
> Hallo zusammen,
> Ich habe folgendes Problem: Mein Atmega 328P auf einem Arduino UNO Bord
> lässt nicht zu, dass ich das SPE Register im SPCR (Kontrollregister von
> SPI) beschreibe.

Glaub ich nicht.

Du MUSST das IO-Pin mit dem SS Signal VORHER auf Ausgangs setzen. Siehe 
Datenblatt, ""SS pin functionality".

Es ist übrigens im Allgemeinen eine gute Idee, ZUERST alle IO-Pins 
passend zu konfigurieren und DANACH erst irgendwelche IO-Module.

von Jumper M. (jumper1416)


Lesenswert?

Ich weiß es klingt unglaublich, ich hatte SPI davor auch aktiviert 
bekommen und bekam ein Signal bei SPI, aber als ich es nochmal versucht 
hatte ging es nicht. Die IO Pins hatte ich auch davor ursprünglich 
geschrieben gehabt, aber mit dem gleichen Ergebnis.

von Cyblord -. (cyblord)


Lesenswert?

Jumper M. schrieb:
> Ich weiß es klingt unglaublich, ich hatte SPI davor auch aktiviert
> bekommen und bekam ein Signal bei SPI, aber als ich es nochmal versucht
> hatte ging es nicht. Die IO Pins hatte ich auch davor ursprünglich
> geschrieben gehabt, aber mit dem gleichen Ergebnis.

Deine Einschätzung dass dein Programm "abstürzt" nur weil du ein Bit in 
einem Register setzt ist falsch, weil an dieser Stelle unmöglich.
Du musst damit aufhören Lösungen für unmögliche Probleme zu suchen und 
statt dessen nochmal genau nachforschen was wirklich passiert.

Wahrscheinlich funktioniert einfach nur das programmieren des Flash 
nicht und dein Programm wird gar nicht ausgeführt.

: Bearbeitet durch User
von BlaBla (Gast)


Lesenswert?

Hat der 328P überhaupt ein SPCR Register. Im Datenblatt wird vom SPCR0 
geschrieben.

von Cyblord -. (cyblord)


Lesenswert?

Und die hirntote Zeile:

PORTB = (0 << DDB5);

Ist sowieso Unsinn.
Es setzt den gesamten PORTB auf 0.

Richtig wäre um ein Bit zu löschen:

PORTB &= ~(1<<DDB5);

zum setzen dann:

PORTB |= (1 << DDB5);

: Bearbeitet durch User
von Jumper M. (jumper1416)


Lesenswert?

Vielen Dank schonmal für die Antworten.
Nein ich habe bisher noch nicht debuggt, allerdings lässt sich das 
Programm ohne Probleme auf unter Atmel compilieren. Erst auf dem Arduino 
tritt das Problem auf, dass er nur bis zu dem Befhel arbeitet, und nicht 
weiter kommt.

von Jim M. (turboj)


Lesenswert?

Jumper M. schrieb:
> Das Programm soll an sich nicht viel machen sondern nur das Register
> beschreiben und eine LED danach zum blinken bringen.

Hänge die LED mal an einen anderen Pin. PB5 ist SCK, und damit NICHT 
mehr als normaler GPIO nutzbar wenn SPI "scharf" gestellt wird.

Das sollte man dem Manual entnehmen können als Programmierer...

von Jumper M. (jumper1416)


Lesenswert?

Das Problem ist ja, dass OHNE den Befehl SPCR = (1<<SPE); ohne Probleme 
durchläuft und anfängt zu blinken, mit dem Befehl aber nicht zum blinken 
kommt, da er schon vorher nicht weiter kommt.

Beitrag #6396193 wurde vom Autor gelöscht.
von Cyblord -. (cyblord)


Lesenswert?

Jim M. schrieb:
> Das sollte man dem Manual entnehmen können als Programmierer...

Wenns schon an korrekter Bitmanipulation scheitert kann man so viel 
nicht erwarten.

von jo mei (Gast)


Lesenswert?

Cyblord -. schrieb:
> Wenns schon an korrekter Bitmanipulation scheitert kann man so viel
> nicht erwarten.

Dass man nicht viel erwarten kann spiegelt sich schon in der
Ausdrucksweise wieder.

Jumper M. schrieb:
> Mein Atmega 328P auf einem Arduino UNO Bord
> lässt nicht zu, dass ich das SPE Register im SPCR (Kontrollregister von
> SPI) beschreibe.

Er wehrt sich sozusagen mit Händen und Füssen.

von Peter D. (peda)


Lesenswert?

Hatten wir das nicht schonmal vor ein paar Tagen durchgekaut?

Beitrag "Atmega168pb bleibt bei spi konfiguration hängen"

: Bearbeitet durch User
von BlaBla (Gast)


Lesenswert?

BlaBla schrieb:
> Hat der 328P überhaupt ein SPCR Register. Im Datenblatt wird vom SPCR0
> geschrieben.

Merkwürdig: Im Datenblatt vom 06/2016 heißt das Register SPCR0. Im 
aktuellen Datenblatt SPCR. ???

von Einer K. (Gast)


Lesenswert?

Jumper M. schrieb:
> Das Problem ist ja, dass OHNE den Befehl SPCR = (1<<SPE); ohne
> Probleme
> durchläuft und anfängt zu blinken, mit dem Befehl aber nicht zum blinken
> kommt, da er schon vorher nicht weiter kommt.

Es wurde dir schon gesagt!

PB5 dient bei dir zum blinken.
PB5 wird von der SPI Schnittstelle benutzt.

Bei einem Auto kannst du auch nicht aus beiden Türen gleichzeitig 
aussteigen.
Merke: Es gibt Situationen, wo man sich entscheiden muss.


Also:
Sobald du SPI benutzt/aktivierst endet das blinken.
Das Verhalten ist das erwartete Verhalten.
Es ist kein anderes Verhalten plausibel/denkbar.

Alles ok.
Nur deine Diagnose ist völlig daneben.

von Jumper M. (jumper1416)


Lesenswert?

Okay super vielen Dank!

Beitrag #6396302 wurde von einem Moderator gelöscht.
Beitrag #6396314 wurde von einem Moderator gelöscht.
Beitrag #6396337 wurde von einem Moderator gelöscht.
Beitrag #6396355 wurde von einem Moderator gelöscht.
Beitrag #6396442 wurde von einem Moderator gelöscht.
Beitrag #6396501 wurde von einem Moderator gelöscht.
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.