www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schieberegister an SPI


Autor: Nils (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe 3 Schieberegister 74595 kaskadiert und an den SPI Port des MC 
(Atmega644) angeschlossen.
Habe die Ports des MCs wie folgt mit den Eingängen der Schieberegister 
verbunden:

MC       Schieberegister
MOSI      SER an das 1. Schieberegister
SCK       SCK von allen
PB0       RCK von allen
          SCL von allen an VCC
          G von allen an GND

Schaltplan der Schieberegister hängt auch an!!

Mein programm lautet wie folgt:
#include <avr/io.h>
#define F_CPU 20000000ul
#include <util/delay.h>
#define DDR_SPI DDRB
#define DD_MOSI DDB5
#define DD_MISO DDB6
#define DD_SCK  DDB7
#define DD_SS  DDB4
#define DD_RCK  DDB0





void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}


int main(void)
{

SPI_MasterInit();

    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);

}

Nur leider tun die Schieberegister nicht das was sie sollen. In diesem 
Fall sind nicht alle Ausgänge "1".
Egal welchen Wert ich in die Klammern (cData) schreibe. Die Ausgänge 
haben nicht die richtigen Werte.
Habe auch schon mal jeden Port einzeln angesprochen und das hat 
funktioniert. Insofern gehe ich davon aus, dass es nicht an der 
Schaltung liegt.

Auf eine Antwort freue ich mich!!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt die Bits auch noch in die Ausgangsregister schreiben: DD_RCK

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!!
Habe den Quelltext noch mal verbessert!
#include <avr/io.h>
#define F_CPU 20000000ul
#include <util/delay.h>
#define DDR_SPI DDRB
#define DD_MOSI DDB5
#define DD_MISO DDB6
#define DD_SCK  DDB7
#define DD_SS  DDB4
#define DD_RCK  DDB0





void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}


int main(void)
{

int i,k;
SPI_MasterInit();

    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);
    PORTB |= (1<<DD_RCK);  
    return(0);

}


Es sind dadurch aber immer noch nicht alle Bits high.
Mal ist ein Bit high und mal ein Bit low!!
ich weiß nicht mehr weiter woran das liegen könnte!!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib das mal so:

/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK) | (1<<DD_SS);

Wenn SS kein Ausgang ist können merkwürdige Dinge
geschehen beim SPI Master.

Das solltest du auch noch mal kontrollieren

          SCL von allen an VCC
          G von allen an GND

Laut Schaltplan sieht das nicht so aus.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort!!

Also alle G sind auf GND
alle SCL sind auf VCC

Wenn ich nun wie oben gesagt den Quelltext ändere sind alle Ausgänge auf 
high. Dieses ändert sich aber auch nicht, wenn ich ein anderes Bitmuster 
hinein schiebe. Also irgendwo ist da noch der Wurm drin!!

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So das Thema hat sich erledigt!! Habe RCK anPB0 gehangen, deshalb muss 
ich diesen natürlich noch als Ausgang definieren.
Für alle noch mal das richtige Programm!!!
#include <avr/io.h>
#define F_CPU 20000000ul
#include <util/delay.h>
#define DDR_SPI DDRB
#define DD_MOSI DDB5
#define DD_MISO DDB6
#define DD_SCK  DDB7
#define DD_SS  DDB4
#define DD_RCK  DDB0





void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK) | (1<<DD_SS) | (1<<DD_RCK);

/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}


int main(void)
{
  SPI_MasterInit();
    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);
    SPI_MasterTransmit(255);
    PORTB |= (1<<DD_RCK);  
    return(0);
}

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.