Danke Markus für Deine Antwort.
Aber es bleibt dennoch eine Unklarheit im Raum:
Ich habe nirgendwo den /SS auf LOW gesetzt. Warum funktioniert mein Programm? Alle Werte, die ich vom MEGA8 auf die beiden 74HCT595 schicke, werden bitgenau angezeigt. Immer!
Jemand muss doch den /SS auf LOW setzen, damit der 74HCT595 die Ausgänge freigeben, oder?
Hier mein kleiners Testprogramm, OHNE LOW für /SS!!
Code:
// SPI mit 74HCT595 2 Bytes an 2 ICs 74HCT595
#define F_CPU 12000000UL
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t data1=3, data2=3, count;
//############################################################################
void spi_shift(uint8_t data1, uint8_t data2)
{
SPDR = data1; //=== Start transmission
while(!(SPSR & (1<<SPIF))); // warten, bis Übertragung zuende ist
SPDR=data2;
while(!(SPSR & (1<<SPIF))); // warten, bis Übertragung zuende ist
PORTB=1<<PB2;// Store
}
//############################################################################
void HC595Init()
{
DDRB = (1<<DDB2)|(1<<DDB3)|(1<<DDB5); // DDB2 ist SS DDB3 ist MOSI, DDB5 ist SCK
SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR0);// enable | master | CPHA | 1/16clk
}
//############################################################################
int main(void)
{
HC595Init();
while(1)
{
spi_shift(data1,data2);
}
}
Lesezeichen