AVR SPI Schieberegister C

OP #3168657
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
Angehängte Dateien:
#3168701
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);
OP #3168708
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.