Hi Leute,
ich bastel gerade an einem Schieberegister, dem 595er mit SPI rum. Das
funktionierte schon mit anderer Verkabelung ohne SPI (also
softwaremäßig).
Es funktioniert so nicht...
Zur Konstellation: Das Steckbrett hängt an einem Pollin-Board. Somit
sollte folgende Belegung gelten (Steckbrett):
13 = SS = PB4 -> RCK 12
14 = MOSI = PB5 -> SER 14
15 = MISO irrelevant
16 = SCK PB7 -> SCK 11
Weil ich noch keine Ahnung habe, wie ich am besten die
Breadboard-Verkabelung mit einem Programm einfach erstelle, angehangen
ein Screenshot.
Der Programmcode ist wie folgt:
#include <avr/io.h>
#define DDR_SPI DDRB //schieberegister
#define DD_MOSI DDB5 // MOSI dann auf SIN = SER
#define DD_SCK DDB7 // dann auf SCK
#define DD_SS DDB4 // auf RCK
#define F_CPU 7372800ul
void SPI_MasterInit(void) {
DDR_SPI |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);
}
void SPI_MasterTransmit (uint8_t data) {
SPDR = data;
while (!(SPSR & (1<<SPIF)))
{
//warten
}
}
int main(void)
{
uint8_t zahl = 0b10101010;
SPI_MasterInit();
SPI_MasterTransmit(zahl);
DDR_SPI &= ~(1<<DD_SS);
DDR_SPI |= (1<<DD_SS);
DDR_SPI &= ~(1<<DD_SS);
while(1)
{
//TODO:: Please write your application code
}
}
Tja... nix geht. Also, folgende Probleme:
Die LEDs zeigen nicht das, was sie zeigen sollten. In dem Bild seht ihr,
alle Leuchten, das soll nicht sein. Stöpsel ich das Pollin-Netzteil ab,
dann leuchtet nichts mehr. Nehme ich dann ein Multimeter und halte es an
den Widerstand ganz rechts bei der LED an Masse, dann gehen plötzlich
alle LEDs an. Halte ich das Multimeter noch mal dran, geht die erste LED
aus. Wohl gemerkt: Nur das Masse-Kabel vom Multimeter... ich kann so
auch andere Zustände erzeugen... weiterhin bizarr:
Am Widerstand bei der grünen Led ganz rechts messe ich 3V, aber der
sollte natürlich auf 5V sein.
Die Widerstände an den LED sind 1k, das sollte kein Ding sein, das ging
ja auch ohne SPI.
Als JTAG-Interface und Programmer habe ich den Dragon, der hängt über
JTAG ja nicht an den SPI-Pins des Atmega 32...
Ich muss da was übersehen... danke für Tipps!
LG
Jens
1 | |
2 | |
3 | |
und was soll das da sein? Da steht: Schalte den Pin auf Eingang, schalte den Pin auf Ausgang und dann wieder auf Eingang. Du sollte einen Puls erzeugen und nicht an der Datenrichtung des Pins rumfummeln!
1 | |
2 | |
Absolut richtig, logisch wäre wohl
SPI_MasterInit();
SPI_MasterTransmit(zahl);
PORTB &= ~(1<<DD_SS);
PORTB |= (1<<DD_SS);
PORTB &= ~(1<<DD_SS);
while(1)
{
//TODO:: Please write your application code
}
oder? Aber wie bizarr ist das denn, ich habe eine Spannung von 3 Volt an
der LED rechts.
Karl Heinz, Ja, genau, nun funktioniert es. Danke! LG Jens
Gast
#3168718
J. W. schrieb: > Weil ich noch keine Ahnung habe, wie ich am besten die > Breadboard-Verkabelung mit einem Programm einfach erstelle, ... Mach es umgekehrt. Zeichne erst einen richtigen, übersichtlichen Schaltplan z.B. mit EAGLE oder einem anderen Schaltplaneditor und dann setzt den auf deinem Breadboard in eine Schaltung um.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
