mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI will nicht richtig


Autor: Ingo Laabs (grobian)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)
 {
 }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define DDR_SPI  PORTB

Das ist falsch.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

;)

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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)
 {
 }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> #define DDR_SPI  PORTB
>
> Das ist falsch.

Ist immer noch falsch.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso ?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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)
 {
 }
}

Autor: holger (Gast)
Datum:

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

Nö.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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);
    }
}
}

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.