Forum: Mikrocontroller und Digitale Elektronik AVR SPI Schieberegister C


von J. W. (ontheway)


Angehängte Dateien:

Lesenswert?

Hi Leute,

ich bastel gerade an einem Schieberegister, dem 595er mit SPI rum. Das 
funktionierte schon mit anderer Verkabelung ohne SPI (also 
softwaremäßig).
Es funktioniert so nicht...
Zur Konstellation: Das Steckbrett hängt an einem Pollin-Board. Somit 
sollte folgende Belegung gelten (Steckbrett):

13 = SS = PB4 -> RCK 12
14 = MOSI = PB5 -> SER 14
15 = MISO irrelevant
16 = SCK PB7 -> SCK 11

Weil ich noch keine Ahnung habe, wie ich am besten die 
Breadboard-Verkabelung mit einem Programm einfach erstelle, angehangen 
ein Screenshot.

Der Programmcode ist wie folgt:

#include <avr/io.h>

#define DDR_SPI      DDRB //schieberegister
#define DD_MOSI      DDB5 // MOSI dann auf SIN = SER
#define DD_SCK      DDB7 // dann auf SCK
#define DD_SS      DDB4 // auf RCK
#define F_CPU      7372800ul

void SPI_MasterInit(void) {
  DDR_SPI |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);
}

void SPI_MasterTransmit (uint8_t data) {
  SPDR = data;
  while (!(SPSR & (1<<SPIF)))
  {
    //warten
  }
}

int main(void)
{
  uint8_t zahl = 0b10101010;


  SPI_MasterInit();
  SPI_MasterTransmit(zahl);
  DDR_SPI &= ~(1<<DD_SS);
  DDR_SPI |= (1<<DD_SS);
  DDR_SPI &= ~(1<<DD_SS);
    while(1)
    {
        //TODO:: Please write your application code
    }
}

Tja... nix geht. Also, folgende Probleme:
Die LEDs zeigen nicht das, was sie zeigen sollten. In dem Bild seht ihr, 
alle Leuchten, das soll nicht sein. Stöpsel ich das Pollin-Netzteil ab, 
dann leuchtet nichts mehr. Nehme ich dann ein Multimeter und halte es an 
den Widerstand ganz rechts bei der LED an Masse, dann gehen plötzlich 
alle LEDs an. Halte ich das Multimeter noch mal dran, geht die erste LED 
aus. Wohl gemerkt: Nur das Masse-Kabel vom Multimeter... ich kann so 
auch andere Zustände erzeugen... weiterhin bizarr:
Am Widerstand bei der grünen Led ganz rechts messe ich 3V, aber der 
sollte natürlich auf 5V sein.
Die Widerstände an den LED sind 1k, das sollte kein Ding sein, das ging 
ja auch ohne SPI.
Als JTAG-Interface und Programmer habe ich den Dragon, der hängt über 
JTAG ja nicht an den SPI-Pins des Atmega 32...

Ich muss da was übersehen... danke für Tipps!

LG
Jens

von Karl H. (kbuchegg)


Lesenswert?

1
  DDR_SPI &= ~(1<<DD_SS);
2
  DDR_SPI |= (1<<DD_SS);
3
  DDR_SPI &= ~(1<<DD_SS);

und was soll das da sein?

Da steht:
Schalte den Pin auf Eingang, schalte den Pin auf Ausgang und dann wieder 
auf Eingang.

Du sollte einen Puls erzeugen und nicht an der Datenrichtung des Pins 
rumfummeln!
1
  PORTB |= (1<<DD_SS);
2
  PORTB &= ~(1<<DD_SS);

von J. W. (ontheway)


Lesenswert?

Absolut richtig, logisch wäre wohl

  SPI_MasterInit();
  SPI_MasterTransmit(zahl);
  PORTB &= ~(1<<DD_SS);
  PORTB |= (1<<DD_SS);
  PORTB &= ~(1<<DD_SS);
    while(1)
    {
        //TODO:: Please write your application code
    }

oder? Aber wie bizarr ist das denn, ich habe eine Spannung von 3 Volt an 
der LED rechts.

von J. W. (ontheway)


Lesenswert?

Karl Heinz,
Ja, genau, nun funktioniert es.
Danke!

LG
Jens

von Mr. Tom (Gast)


Lesenswert?

J. W. schrieb:
> Weil ich noch keine Ahnung habe, wie ich am besten die
> Breadboard-Verkabelung mit einem Programm einfach erstelle, ...

Mach es umgekehrt. Zeichne erst einen richtigen, übersichtlichen 
Schaltplan z.B. mit EAGLE oder einem anderen Schaltplaneditor und 
dann setzt den auf deinem Breadboard in eine Schaltung um.

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.