Hallo zusammen, ich möchte über ein Schieberegister eine LED-Zeile steuern. Leider tut sich da aktuell gar nichts... Folgende Verbindungen von Prozessor zu Schieberegister hab ich gelötet: PB7(SCK) --> SH_CP PB5(MOSI) --> DS PB4(SS) --> ST_CP Und folgendes kleine Programm geschrieben: // Init Port DDRB = (1<<PB4) | (1<<PB5) | (1<<PB7); PORTB = (1<<PB4); // Init SPI SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); output = 1; // Sende Output SPDR = output; while (!(SPSR & (1<<SPIF))); // Daten von Schieberegister in Latches PORTB &= ~(1<<PB4); PORTB |= (1<<PB4); Wie gesagt leuchtet keine LED in der Zeile... Ist an den Verbindungen und/oder am Coding etwas grundlegend falsch/vergessen? Muss ich den MR-Pin vom Schieberegister zwingend mit VCC verbinden (hab ich irgendwo als empfehlenswert gelesen, aber noch nicht gemacht)? Vielen Dank!
Mike schrieb: > Ist an den Verbindungen und/oder am Coding etwas grundlegend > falsch/vergessen? Muss ich den MR-Pin vom Schieberegister zwingend mit > VCC verbinden (hab ich irgendwo als empfehlenswert gelesen, aber noch > nicht gemacht)? ja, das solltest Du aber tun (!MR = Master Reset für das Schieberegister). Somit wäre das Schieberegister immer zurückgesetzt. Und wie hast Du !OE beschaltet?
Andreas W. schrieb: > ja, das solltest Du aber tun (!MR = Master Reset für das > > Schieberegister). ok, mach ich - dachte wäre "optional" ;-) Andreas W. schrieb: > Und wie hast Du !OE beschaltet? auch gar nicht, hängt in der Luft... muss das an GND? Vielen Dank!
Mike schrieb: > auch gar nicht, hängt in der Luft... muss das an GND? Hat dein Bauteil kein Datenblatt?
Eumel schrieb: > Hat dein Bauteil kein Datenblatt? Lieber Eumel, eigentlich hast du nichts zu sagen, also halt die Klappe. Schreib mal ein Datenblatt über dich selbst und verschone uns mit deinem Spam hier und anderswo.
Hallo Holzknüppel, der Hinweis auf ein Datenblatt ist sicher hilfreich, denn wenn man nicht lernt Datenblätter zu lesen wird man nie eine Schaltung so entwerfen können, dass man das geplante Ergebnis ohne endloses Fummeln erreicht. Selbst mit guten Datenblättern bleibt, gerade bei SPI u.ä., noch genug Raum für klärende Schaltungsanalyse. Drei Signale mit verschiedenen Phasenbeziehungen und Polaritäten reichen schon für 1-2 Tage Fehlersuche aus :-). Es ist also ein guter Rat, wenn man Mike das Studium der Datenblätter nahelegt. Grüße, Kurt
Hallo Mike, der Code ist OK. Schau mal die Anmerkungen von Andreas nach und lies in Ruhe die Datenblätter :-). Je nach Flankenverhalten des Latches musst Du noch CPHASE und CPOL anschauen und evetuell entsprechend setzen. Grüße, Kurt
Mike schrieb: > auch gar nicht, hängt in der Luft... muss das an GND? Manchmal fragt man sich, wofür die Hersteller in ihren Datenblättern sinntragende Pin-Bezeichnungen verwenden, Logik-Diagramme zeigen und Pin-Beschreibungen aufnehmen. Was ist an dem Satz "Data in the storage register appears at the output whenever the output enable input (\OE) is LOW" so schwer zu verstehen?
T.Roll schrieb: > Mike schrieb: >> auch gar nicht, hängt in der Luft... muss das an GND? > > Manchmal fragt man sich, wofür die Hersteller in ihren Datenblättern > sinntragende Pin-Bezeichnungen verwenden, Logik-Diagramme zeigen und > Pin-Beschreibungen aufnehmen. > > Was ist an dem Satz "Data in the storage register appears at the output > whenever the output enable input (\OE) is LOW" so schwer zu verstehen? Naja, eben ob es wirklich muss. Wegrenn ;-)
Danke für die Tips. Mit den beiden zusätzlichen Verbindungen funktioniert es prinzipiell - sorry, da hätte ich durch etwas sorgfältigere Recherche im Datenblatt sicher selbst drauf kommen können. Aber ein kleines Problem gibt es noch: also ich habe zwei Schieberegister kaskadiert und daran zwei 8er-LED-Zeilen gehängt (also insgesamt 16 LEDs). Jetzt habe ich das Phänomen, dass bei der Ansteuerung die LEDs immer eine Stelle "zu weit rechts" reagieren - z. B. ich möchte mit folgendem Code LED 8 und LED 16 zum Leuchten bringen, aber es sind LED 7 und LED 15 an. Ist da noch ein Fehler im Coding, oder gibt es einen "Trick"? int main(void) { uint8_t output = 0; // Init Port DDRB = (1<<PB4) | (1<<PB5) | (1<<PB7); // Init SPI SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPI2X) | (1<<SPR1) | (1<<SPR0); output = 0b01111111; sendOutput(output); output = 0b01111111; sendOutput(output); activateOutput(output); } void sendOutput(uint16_t output) { // Send output SPDR = output; while (!(SPSR & (1<<SPIF))); } void activateOutput() { // Daten von Schieberegister in Latches PORTB &= ~(1<<PB4); PORTB |= (1<<PB4); } Thx.
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.