Forum: Mikrocontroller und Digitale Elektronik Atmega64 SPI Problem


von Christoph S. (mcseven)


Lesenswert?

Hi *,

ich bin langsam am verzweifeln, mein SPI am mega64 will keine Bits 
ausspucken (SCK/MOSI kein signal am Ozsi). PORTB ist komplett als Out 
konfiguriert, mein SPCR=0x0b01011000, SPSR=0x00.

Ich kann in SPDR genau ein Byte reinschreiben, dann geht er nach 
"while(!(SPSR & 0b1000000))" eins weiter, aber danach will SPIF nicht 
mehr auf eins gehen und das Programm bleibt hängen.

Die SPI Fuse ist auf enabled gesetzt, sonst könnte ich ja nix reinladen. 
Aber ich hab nirgendwo gesehen, dass ich mit der Fuse enabled das SPI im 
regulären Betrieb nicht benutzen kann...

Gibts da sonst noch Fallstricke?

Danke

von Matthias L. (Gast)


Lesenswert?

Der Fehler ist in Programmzeile 42.

von Christoph S. (mcseven)


Lesenswert?

Du hast natürlich recht :) ist schon spät.... here comes:
1
#include <mega64.h>
2
#include <delay.h>
3
4
void main(void) {
5
PORTA=0x00; //DEBUG LEDS
6
DDRA=0xFF;
7
8
PORTB=0x00; //SPI PORT
9
DDRB=0xFF;
10
11
TIMSK=0x00;
12
ETIMSK=0x00;
13
14
SPCR=0x0b01011000;
15
SPSR=0x00;
16
17
while (1) {
18
  PORTA = 0xFF; //LEDs aus
19
  SPDR = 0x40;
20
  while(!(SPSR & (1<<8))) {}
21
  PORTA.0 = 0; //1. LED an
22
  delay_ms(1000);
23
  SPDR = 0xA1;
24
  while(!(SPSR & (1<<8))) {}
25
  PORTA.1 = 0; //2. LED an
26
  delay_ms(1000);
27
};
28
}

ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer 
beim Programmieren) nichts. Wohl aber ändert SCK die Ruhepolarität, wenn 
ich die Polarität im SPCR ändere. Er kommt aus der ersten While Warte 
Schleife nicht raus, und ich kann mir nicht erklären, weshalb. Quarz ist 
16MHz, Compiler ist CodeVision, neueste Version.

Hab ich etwas übersehen?

Danke.

von Stefan S. (energizer)


Lesenswert?

MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.

von Matthias L. (Gast)


Lesenswert?

>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.

Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein.

ich vermute folgendes:
1
while (1)
2
{
3
  SPDR = 0x40;
4
  while(!(SPSR & (1<<8)));
5
6
  delay_ms(1000);
7
8
  SPDR = 0xA1;
9
  while(!(SPSR & (1<<8)));
10
  delay_ms(1000);
11
}
lt deinen Einstelungen sendest du mit clk/4. ergibt bei 16MHz eine 
Sendedauer von 2µsek!
Und das wird alle 1'000'000µsek  gesendet! Das ist ohne geeignete 
Triggerung nicht "zu finden".
Vorschlag:
Lass mal beide Delays weg, somit müsste der einfach die zwei Bytes 
rausblasen.
Fehler im Code finde ich nicht. Mal abgesehen, dass man einiges schöner 
schreiben kann:
1
while(!(SPSR & (1<<SPIF)));
2
...

von Christoph S. (mcseven)


Lesenswert?

> Das ist ohne geeignete Triggerung nicht "zu finden".
hab ein tds 2014, das findet alles =)

Egal, hier war der Fehler:
1
while(!(SPSR & (1<<SPIF)));
kennt codevision nicht.
1
 while(!(SPSR & (1<<8)));
verursachte einen deadlock
1
 while(!(SPSR & 0b1000000));
tut jetzt und mit timebase 1us schön sichtbar :)

Danke euch und gn8

von Stefan S. (energizer)


Lesenswert?

>>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.
>Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein.

Hm, du meinst wohl eher Eingang, wenn wir von MISO im Mastermode 
sprechen ?
Wie auch immer, im Datenblatt heist es dass MISO sowieso fest auf 
Eingang geschaltet wird wenn der SPI Mastermode aktiviert wird. Der Rest 
(MOSI, SCK und SS) sind "user defined" und sollten auf Ausgang 
geschaltet werden, was er auch schön getan hat.

>ich messe hier mir dem oszi
Da würde ich mich mal Matthias anschließen. Dieser Peak-Tech Logic-Probe 
(früher sagte man da mal Logiktester) tut für sowas hervorragende 
Dienste, weil du damit auch sehr kurze Impulse sichtbar machen kannst.

von Stefan S. (energizer)


Lesenswert?

Tja, mein Betrag war ein paar Sekunden zu spät um sinnvoll zu sein :-)
1
while(!(SPSR & (1<<8)));

Hoppla, da fällt es mir wie Schuppen von den Haaren. 1<<8 ist das neunte 
Bit, aber SPSR hat nur 8 :-)

Das hier sollte es dann tun:
1
while(!(SPSR & (1<<7)));

von Johannes M. (johnny-m)


Lesenswert?

Christoph Söllner wrote:
> ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer
> beim Programmieren) nichts.
Wieso ändert sich beim Programmieren was an MOSI? Du hast doch nicht 
etwa den ISP-Anschluss an MOSI und MISO angeschlossen? Wenn dem so wäre, 
dürftest Du den µC allerdings überhaupt nicht programmieren können.

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.