Gast
#2116626
hallo,
ich habe hier einen Brotbrett-Aufbau mit zwei funktionsfähigen
HC595-Schieberegistern. Die Softwarelösung aus dem Tutorial funktioniert
einwandfrei. Allerdings komme ich mit der SPI-Ansteuerung nicht ganz
klar. Hier mal mein Quelltext:
------------------------------
#include <avr/io.h>
#define RCK PB3
#define SIN PB5
#define SCK PB7
void SchiebeClk()
{
loop_until_bit_is_set(SPSR, SPIF);
PORTB |= (1<<RCK);
PORTB &= ~(1<<RCK);
}
int main()
{
// DDRB - die SPI Pins als Ausgänge konfigurieren
DDRB |= (1 << SIN) | (1 << SCK) | (1 << RCK);
// SPI-Modul konfigurieren; Takt gaanz langsam
SPCR |= (1 << MSTR)| (1 << SPE) | (1 << SPR0)| (1 << SPR1);
// Dummy Daten, um SPIF zu setzen
SPDR = 0b00000001;
char a = 0b10101010;
while(1)
{
loop_until_bit_is_set(SPSR, SPIF);
a = ~a;
SPDR = a;
SchiebeClk();
}
return 0;
}
-------------------------------
Die Verschaltung der drei Signale SIN, SCK, RCK ist mehrmals geprüft und
daher korrekt. Während Programmieren über SPI sieht man eingehende
Signale auch an den Schieberegistern (ca. 1sek "Rauschen").
Wenn man den Controller ohne SPI-Programmer anschaltet liegen die
Schieberegisterausgänge stets auf anderen Pegeln. Sie sind aber konstant
und wechseln nicht, wie eigentlich vom Programm vorgegeben. Man müsste
ja aufgrund der Geschwindigkeit alle Ausgänge im Mittel als "halb
aktiviert" sehen.
Mit angestecktem und vom PC über Spannung versorgtem SPI-Programmer
wechselt der Ausgang nicht mehr bei jedem Starten des uCs, sondern nur
noch ab und zu. Vom gewünschten "Flimmern" an den SReg-Ausgängen auch
hier keine Spur.
was sehe ich nicht?