Also es sieht wie folgt aus. Wenn ich einen 74HC595 dran habe dann
funktioniert es jedoch nicht mehr wenn ich 2 kaskadierte dran habe...
Bevor die Frage kommt was icht genau funktioniert möchte ich
diese natürlich vorher klären.
Und zwar kommt mehr oder weniger an
den Ports nur "Mist" an. Wenn ich z.b. serpa[0] = 0xff; serpa[1] = 0xff;
schreibe dann sollten ja alle Ports durchschalten aber es sind nur
vereinzelt LEDs an bzw werden nur einzelne Ports durchgeschaltet.
Atmega32 @16Mhz wird genutzt. Für Hilfe wäre ich sehr dankbar.
Folgenden Code nehme ich dazu:
serpa.h
Code:
/* SERiell nach PArallel (serpa) im SPI-Protokoll */
#ifndef _SERPA_H_
#define _SERPA_H_
/* 4 Bytes (32 Ports) */
#define SERPA_SIZE 2
/* Das muss auf 1 sein, wenn man nur ein Schieberegister benutzt ... das wir dauch bei dem serp-- und so benutzt.*/
extern unsigned char serpa[];
extern void serpa_out (void);
extern void serpa_init (void);
#endif /* _SERPA_H_ */
//SERPA.h ende ------------------------
schiebe.c
Code:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
// SERiell nach PArallel (serpa) mit Hardware-Unterstuetzung
#include <avr/io.h>
#include "serpa.h"
#include <util\delay.h>
unsigned char serpa[SERPA_SIZE];
unsigned char maske(unsigned char input);
// Array fuer die Daten
void serpa_init (void)
{
DDRB=0xff;
PORTB |= (1<<PB4);
// !!! SS muss OUT sein, damit SPI nicht in Slave-Mode wechselt !!!
// entfaellt, falls PORT_RCK = PORT_SS
// SPI als Master
// High-Bits zuerst
// SCK ist HIGH wenn inaktiv
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL);
// pullup an MISO vermeidet Floaten
PORTB |=(1<<PB6);
// maximale Geschwindigkeit: F_CPU / 2
SPSR |= (1 << SPI2X);
}
void serpa_out (void)
{
unsigned char anz = SERPA_SIZE;
unsigned char* serp = serpa+SERPA_SIZE;
do
{
unsigned char data = *--serp;
// SPDR schreiben startet Uebertragung
SPDR = data;
// warten auf Ende der Uebertragung für dieses Byte
while (!(SPSR & (1 << SPIF)));
// clear SPIF durch Lesen von SPDR
SPDR;
}
while (--anz > 0);
// Strobe an RCK bringt die Daten von den Schieberegistern in die Latches
PORTB &=~ (1<<PB4);
PORTB |= (1<<PB4);
}
int main (void)
{
serpa_init();
while(1)
{
serpa[0] = 0xff;
serpa[1] = 0xff;
serpa_out();
}
}
unsigned char maske(unsigned char input)
{
return 0xFF ^ input;
}
Lesezeichen