Forum: Mikrocontroller und Digitale Elektronik Schieberegister an SPI


von Nils (Gast)


Angehängte Dateien:

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!!

von Gast (Gast)


Lesenswert?

Du mußt die Bits auch noch in die Ausgangsregister schreiben: DD_RCK

von Nils (Gast)


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!!

von holger (Gast)


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.

von Nils (Gast)


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!!

von Nils (Gast)


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
}

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.