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 | DDR_SPI &= ~(1<<DD_SS); |
2 | DDR_SPI |= (1<<DD_SS); |
3 | DDR_SPI &= ~(1<<DD_SS); |
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 | PORTB |= (1<<DD_SS); |
2 | PORTB &= ~(1<<DD_SS); |
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.