Schieberegister an SPI

Gast #1021280
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:
1
#include <avr/io.h>
2
#define F_CPU 20000000ul
3
#include <util/delay.h>
4
#define DDR_SPI DDRB
5
#define DD_MOSI DDB5
6
#define DD_MISO DDB6
7
#define DD_SCK  DDB7
8
#define DD_SS  DDB4
9
#define DD_RCK  DDB0
10

11

12

13

14

15
void SPI_MasterInit(void)
16
{
17
/* Set MOSI and SCK output, all others input */
18
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
19
/* Enable SPI, Master, set clock rate fck/16 */
20
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
21
}
22
void SPI_MasterTransmit(unsigned char cData)
23
{
24
/* Start transmission */
25
SPDR = cData;
26
/* Wait for transmission complete */
27
while(!(SPSR & (1<<SPIF)));
28
}
29

30

31
int main(void)
32
{
33

34
SPI_MasterInit();
35

36
    SPI_MasterTransmit(255);
37
    SPI_MasterTransmit(255);
38
    SPI_MasterTransmit(255);
39

40
}

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!!
Angehängte Dateien:
Gast #1021360
Lesenswert?

Danke für die schnelle Antwort!!
Habe den Quelltext noch mal verbessert!
1
#include <avr/io.h>
2
#define F_CPU 20000000ul
3
#include <util/delay.h>
4
#define DDR_SPI DDRB
5
#define DD_MOSI DDB5
6
#define DD_MISO DDB6
7
#define DD_SCK  DDB7
8
#define DD_SS  DDB4
9
#define DD_RCK  DDB0
10

11

12

13

14

15
void SPI_MasterInit(void)
16
{
17
/* Set MOSI and SCK output, all others input */
18
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
19
/* Enable SPI, Master, set clock rate fck/16 */
20
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
21
}
22
void SPI_MasterTransmit(unsigned char cData)
23
{
24
/* Start transmission */
25
SPDR = cData;
26
/* Wait for transmission complete */
27
while(!(SPSR & (1<<SPIF)));
28
}
29

30

31
int main(void)
32
{
33

34
int i,k;
35
SPI_MasterInit();
36

37
    SPI_MasterTransmit(255);
38
    SPI_MasterTransmit(255);
39
    SPI_MasterTransmit(255);
40
    PORTB |= (1<<DD_RCK);  
41
    return(0);
42

43
}


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!!
Gast #1021366
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.
Gast #1021375
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!!
Gast #1021448
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!!!
1
#include <avr/io.h>
2
#define F_CPU 20000000ul
3
#include <util/delay.h>
4
#define DDR_SPI DDRB
5
#define DD_MOSI DDB5
6
#define DD_MISO DDB6
7
#define DD_SCK  DDB7
8
#define DD_SS  DDB4
9
#define DD_RCK  DDB0
10

11

12

13

14

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

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

24
void SPI_MasterTransmit(unsigned char cData)
25
{
26
/* Start transmission */
27
SPDR = cData;
28
/* Wait for transmission complete */
29
while(!(SPSR & (1<<SPIF)));
30
}
31

32

33
int main(void)
34
{
35
  SPI_MasterInit();
36
    SPI_MasterTransmit(255);
37
    SPI_MasterTransmit(255);
38
    SPI_MasterTransmit(255);
39
    PORTB |= (1<<DD_RCK);  
40
    return(0);
41
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren