Hi Community
Ich wollte hier mal anfragen, ob mir evtl. jemand weiterhelfen kann..
Folgendes: Ich möchte gerne Daten per SPI über MOSI und SCK ausgeben an
einem ATMEGA644.
Ich habe dazu im Datenblatt den Beispielcode gefunden, aber irgendwie
tut sich da nichts.
Hier mein Programm:
1
/**************** INCLUDES ***************************************/
Mit einem DSO kann ich leider nicht mal ein ruckeln am MOSI oder am SCK
Pin feststellen, der Controller funktioniert aber sonst (Display
angeängt als Test).
Kann mir evtl. jemand einen Tipp geben, woran das liegen könnte?
Gruss und Danke fürs lesen :)
SPIAnfänger schrieb:> Karl Heinz Buchegger schrieb:>> Du musst den SS Pin auf Ausgang programmieren.>> Wow, danke für die schnelle Antwort :)>> /* Set MOSI and SCK and SS output, all others input */> SPI = (1<<MOSI)|(1<<SCK)|(1<<SS);
#define SPI PORTB
Damit setzt du die Pins auf 1, wenn sie auf Ausgang wären.
Aber wo ist deine Programmierung des DDRB, um den Pin überhaupt mal auf
Ausgang zu setzen!
Karl Heinz Buchegger schrieb:> SPIAnfänger schrieb:>> Karl Heinz Buchegger schrieb:>>> Du musst den SS Pin auf Ausgang programmieren.>>>> Wow, danke für die schnelle Antwort :)>>>>> /* Set MOSI and SCK and SS output, all others input */>> SPI = (1<<MOSI)|(1<<SCK)|(1<<SS);>> #define SPI PORTB>> Damit setzt du die Pins auf 1, wenn sie auf Ausgang wären.> Aber wo ist deine Programmierung des DDRB, um den Pin überhaupt mal auf> Ausgang zu setzen!
Kann es sein, dass du dich da vertan hast und du eigentlich
#define SPI DDRB
haben wolltest?
Karl Heinz Buchegger schrieb:> #define SPI DDRB>> haben wolltest?
Ja, das habe ich in der Tat, habe das gerade gemerkt, als du geschrieben
hast, dass ich SS als Ausgang setzen muss.
Ist also bereits bereinigt.
Hier nochmal der ganze Code, damit es keine Missverständnisse mehr gibt:
1
/**************** INCLUDES ***************************************/
Hi
>#define MOSI 0x20 (32)>#define SCK 0x80 (128)> SPI = (1<<MOSI)|(1<<SCK)|(1<<SS);
Was meinst du, was bei 8 Bit herauskommt, wenn man eine 1 32 oder 128
mal nach links schiebt?
MfG Spess
Spess53 schrieb:> Was meinst du, was bei 8 Bit herauskommt, wenn man eine 1 32 oder 128> mal nach links schiebt?
Oh, peinlich :S
DDRB = 0xB0 hat Abhilfe gebracht.
Die korrekte Schreibweise lese ich noch im Tut. auf der Seite nach, bin
da immer ein wenig zerstreut.
Danke für eure Hilfe!
Wäre es möglich, dass die SCK Rate beim ATMEGA644 entgegen dem
Datenblatt NICHT die fosc/2 schafft?
Bei:
SPCR = (1<<SPE)|(1<<MSTR);
Habe ich (wie im Datenblatt beschrieben -> siehe Anhang) einen Vorteiler
von 4. Will ich nun aber
SPCR = (1<<SPE)|(1<<MSTR)| (1 << SPI2X);
Habe ich einen Vorteiler von 16?
Wo liegt mein Denkfehler?
Ach so.. das konnte ich jetzt irgendwie nicht rauslesen.
Habe mich allerdings schon gewundert, warum nur die Bits SPR1 und SPR0
in der Beschreibung erwähnt werden.
Ein bisschen undurchsichtig, finde ich.
Danke nochmals für eure Hilfe, jetzt läuft alles wie ich wollte!
8 Bit in 800ns, perfekt.
SPIAnfänger schrieb:> Ach so.. das konnte ich jetzt irgendwie nicht rauslesen.> Habe mich allerdings schon gewundert, warum nur die Bits SPR1 und SPR0> in der Beschreibung erwähnt werden.>> Ein bisschen undurchsichtig, finde ich.
Du darfst in dieser Beziehung NIE nach den Tabellen gehen. Egal ob SPI
oder Timer oder ADC oder UART oder ...
Die Tabellen sind immer nur die logische Zusammenfassung von
Configurationsbits. Aber das bedeutet nicht, dass sie auch im selben
Register beheimatet sind.
Aus den Tabellen entnimmst du nur die Information, welche Bits du
brauchst und dann gehst du alle Register durch, bis du dasjenige hast,
in welchem das Bit beheimatet ist. Wenn du es in einem Register nicht
findest, dann ist es eben in einem anderen. Aber so viele
Konfigurationsregister gibt es ja bei einer Komponente nicht. Und die
sind im Datenblatt dann ja auch beim Modul alle aufgeführt.
> Die korrekte Schreibweise lese ich noch im Tut.
Das schreibt sich eigentlich ganz einfach
#define MOSI PB5
#define SCK PB7
#define SS PB4
also einfach die Pinnummern aus dem Datenblatt. Dann passt es auch mit
SPI = (1<<MOSI)|(1<<SCK)|(1<<SS);
Karl Heinz Buchegger schrieb:> Das schreibt sich eigentlich ganz einfach>> #define MOSI PB5> #define SCK PB7> #define SS PB4
Ah, klasse, danke für den Tipp!
Meiner Schreibweise nach hätte es dann wohl so aussehen müssen?
SPI = MOSI + SCK + SS;
Spricht etwas gegen diese Schreibweise?
Karl Heinz Buchegger schrieb:> Die Tabellen sind immer nur die logische Zusammenfassung von> Configurationsbits. Aber das bedeutet nicht, dass sie auch im selben> Register beheimatet sind.
Das wusste ich wirklich nicht. Habe ich bis jetzt noch nie so erlebt
(bei Timer & ADC, UART habe ich noch nicht ausprobiert).
Werde mir das aber merken, gibts wieder eine Frage weniger im Forum :)
SPIAnfänger schrieb:> Karl Heinz Buchegger schrieb:>> Das schreibt sich eigentlich ganz einfach>>>> #define MOSI PB5>> #define SCK PB7>> #define SS PB4>> Ah, klasse, danke für den Tipp!> Meiner Schreibweise nach hätte es dann wohl so aussehen müssen?>> SPI = MOSI + SCK + SS;>> Spricht etwas gegen diese Schreibweise?
Im Prinzip nicht.
Es scheint so, als ob das die auf einem MSP gebräuchlichere Schreibweise
ist, während die andere die eher auf AVR gebräuchlichere Schreibweise
ist.
Wo du jetzt genau den Teil 1<< hinschiebst bleibt sich ja egal
1
#define XYZ PB5
2
Register|=(1<<XYZ)
und
1
#define XYZ (1<<PB5)
2
Register|=XYZ
laufen ja aufs gleiche hinaus.
Nur eines würde ich nicht tun
#define XYZ 0x20
denn: warum willst du dir selber ausrechnen, welches Bitmuster du
brauchst um den Pin 5 auf 1 zu setzen. Lass das doch den Compiler
machen. Der macht dabei keine Fehler :-)
Karl Heinz Buchegger schrieb:> Im Prinzip nicht.> Es scheint so, als ob das die auf einem MSP gebräuchlichere Schreibweise> ist, während die andere die eher auf AVR gebräuchlichere Schreibweise> ist.
Naja, gebräuchlich ist, was einem am leichtesten fällt, oder :)?
Karl Heinz Buchegger schrieb:> Nur eines würde ich nicht tun>> #define XYZ 0x20>> denn: warum willst du dir selber ausrechnen, welches Bitmuster du> brauchst um den Pin 5 auf 1 zu setzen. Lass das doch den Compiler> machen. Der macht dabei keine Fehler :-)
Ja, da hast du natürlich recht. Bin mich irgendwie gewöhnt immer mit
Ausmaskierungen zu arbeiten, weiss gar nicht recht woher das kommt.