Forum: Mikrocontroller und Digitale Elektronik SPI will nicht richtig


von Ingo L. (grobian)


Angehängte Dateien:

Lesenswert?

Ich habe nun mein 74HC595 an den MEGA8 (interner oszi)  angeschlossen 
und unten aufgeführtes Programm geladen, doch leider tut sich am Ausgang 
von HC nicht das was ich möchte.
Kann jemand einen Fehler entdecken ??


#include <avr\io.h>

#define DD_MOSI PINB3
#define DD_SCK  PINB5
#define DD_RCK  PINB2
#define DDR_SPI  PORTB

int main (void)

{
DDR_SPI = (1<<DD_MOSI | 1<< DD_SCK | (1<<DD_RCK));
SPCR =  (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
SPDR = 0x3;
while (!(SPSR & (1<<SPIF)));
while (1)
 {
 }
}

von holger (Gast)


Lesenswert?

#define DDR_SPI  PORTB

Das ist falsch.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

holger schrieb:
> #define DDR_SPI  PORTB
>
> Das ist falsch.
Syntaktisch ist es korrekt
Semantisch nicht

;)

von Ingo L. (grobian)


Lesenswert?

Klammern fehlten, geht aber trotzdem nicht

#include <avr\io.h>

#define DD_MOSI PINB3
#define DD_SCK  PINB5
#define DD_RCK  PINB2
#define DDR_SPI  PORTB

int main (void)

{
DDR_SPI = (1<<DD_MOSI) | (1<< DD_SCK) | (1<<DD_RCK);
SPCR =  (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
SPDR = 0x3;
while (!(SPSR & (1<<SPIF)));
while (1)
 {
 }
}

von holger (Gast)


Lesenswert?

holger schrieb:
> #define DDR_SPI  PORTB
>
> Das ist falsch.

Ist immer noch falsch.

von Ingo L. (grobian)


Lesenswert?

wieso ?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ingo Laabs schrieb:
> wieso ?

DDR = Data Direction Register
PORT != DDR

Also muß da DDRB hin und nicht PORTB.

Wie ich shcon geschrieben hab, der Compiler kann nix falsches dran 
finden (Syntax korrekt), aber es macht nicht das was du möchtest 
(Semantischer Fehler).

von Ingo L. (grobian)


Lesenswert?

#include <avr\io.h>

#define DD_MOSI PINB3
#define DD_SCK  PINB5
#define DD_RCK  PINB2

#define DDR_SPI  DDRB

int main (void)

{
DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR =  (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
SPDR = 0x2;
while (!(SPSR & (1<<SPIF)));
while (1)
 {
 }
}

jepp geändert, aber gleiches problem..nix Ausgang

von Ingo L. (grobian)


Lesenswert?

ALso, nun funktioniert es.
Muss den SS am  PB2 Impuls erzeugen.
Machr dass das SPI eigentlich nicht von selbst ??

#include <avr\io.h>
#define DD_MOSI PINB3
#define DD_SCK  PINB5
#define DD_RCK  PINB2

#define DDR_SPI  DDRB

int main (void)

{
DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR =  (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;



  PORTB &= ~(1 << PB2);   //SS LOW
  SPDR = 3;
  while(!(SPSR & (1<<SPIF)));
  PORTB |= (1 << PB2);    // SS HIGH

while (1)
 {
 }
}

von holger (Gast)


Lesenswert?

>Muss den SS am  PB2 Impuls erzeugen.
>Machr das das SPI eigentlich nicht von selbst ??

Nö.

von spess53 (Gast)


Lesenswert?

Hi

>Muss den SS am  PB2 Impuls erzeugen.
>Machr dass das SPI eigentlich nicht von selbst ??

Nein.

Datenblatt für Master: SS User Defined.

MfG Spess

von Ingo L. (grobian)


Lesenswert?

OK, dann hammas jetzt

#include <avr\io.h>

#define DD_MOSI PINB3
#define DD_SCK  PINB5
#define DD_RCK  PINB2

#define DDR_SPI  DDRB
#define F_CPU 1000000UL
#include <util/delay.h>

int Tabelle[] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2 };
int ElementeAnzahl = sizeof(Tabelle) / sizeof( int );
int Zaehler;
int main (void)
{
DDR_SPI   = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR      = (1<<SPE)     | (1<<MSTR)   | (1<<SPR0) ;

while (1)
{
  for (Zaehler=0; Zaehler<=ElementeAnzahl-1; Zaehler++)
    {
      PORTB &= ~(1 << DD_RCK);   //SS LOW
      SPDR = Tabelle[Zaehler];
      while(!(SPSR & (1<<SPIF)));
      PORTB |= (1 << DD_RCK);    // SS HIGH
      _delay_ms(100);
    }
}
}

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn SPI als nur als Master betrieben wird, kann /SS als Ausgang 
definiert sein und kann dann beliebig genutzt werden.

Datenblatt unter /SS Pin Fuctionality

Gruß aus Berlin
Michael

von Falk B. (falk)


Lesenswert?

@  Michael U. (amiga)

>wenn SPI als nur als Master betrieben wird, kann /SS als Ausgang
>definiert sein

MUSS! als Ausgang definiert sein!
Siehe Datenblatt.

MfG
Falk

von spess53 (Gast)


Lesenswert?

>MUSS! als Ausgang definiert sein!

Nein.

Datenblatt:

If SS is configured as an input, it must be held high to ensure Master 
SPI operation.

MfG Spess

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.