Forum: Compiler & IDEs 74HC595 am SPI-Interface


von Sascha (Gast)


Lesenswert?

Hallo,

bin gerade erst in die Welt der µC's eingestiegen...
Jetzt stehe ich "mal wieder" vor einer Hürde.
Ich möchte einen 74HC595 am SPI des Atmega32 betreiben.
Problem:
Die Daten erscheinen erst nach dem zweiten aufruf der Funktion 
SPI_MasterTransmit() am Schieberegister.

Ich hoffe ihr könnt mir helfen.

#include  <avr\io.h>
#include   "uart.h"

void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */

DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);

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

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

int main( void )

{
unsigned char temp=0;

  SPI_MasterInit();

  uart_init( MYUBRR);

  while(1)
  {
    temp=uart_Receive();

  if( temp=='1') {SPI_MasterTransmit(0b11111111);}
  if( temp=='2') {SPI_MasterTransmit(0b11111110);}
  if( temp=='3') {SPI_MasterTransmit(0b11111100);}
  if( temp=='4') {SPI_MasterTransmit(0b11111000);}





}
return 0;
}



Mfg

Sascha

von Matthias L. (Gast)


Lesenswert?

>Die Daten erscheinen erst nach dem zweiten aufruf der Funktion
>SPI_MasterTransmit() am Schieberegister.

Du meinst, am Ausgang des 74HC595?

Falls du an PB4 das Ladepin des 595 (Pin 12) angeschlossen hast, dann 
versuch es mal so:
1
void SPI_MasterInit(void)
2
{
3
  // Set MOSI and SCK output, all others input
4
  DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
5
  // disable \ss
6
  PORTB |= (1 << PB4);
7
  // Enable SPI, Master, set clock rate fck/16
8
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
9
}
10
11
void SPI_MasterTransmit(char cData)
12
{
13
  // Start transmission
14
  PORTB &= ~(1 << PB4);
15
  // shift out data
16
  SPDR = cData;
17
  // Wait for transmission complete
18
  while(!(SPSR & (1<<SPIF)));
19
  // disable \ss
20
  PORTB |= (1 << PB4);
21
}

von Sascha (Gast)


Lesenswert?

Supi...danke das wars!!

Mfg

Sascha

von René (Gast)


Lesenswert?

was ist eigendlicg das ladepin?

von Karl H. (kbuchegg)


Lesenswert?

RCK

Laden der Outputlatches vom momentanen Zustand der Schieberegister
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

René schrieb:
> was ist eigendlicg das ladepin?

Der Takteingang des Ausgangs-Latches, Pin 12.

Bitte mach für eine völlig unverwandte Frage einen neuen Thread auf.
Das hat mit GCC auch gar nichts zu tun, hätte besser nach "Allgemeine
Elektronik" gepasst.

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.