Forum: Mikrocontroller und Digitale Elektronik Problem beim Schieberegister-Tutorial


von Felix K. (blackbird8690)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich versuche mich gerade an diesem Tutorial: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister. 
Dafür habe ich eine woanders ausgebaute Mehrfachsegmentanzeige mit 
insgesamt 33 Einzel-LEDs verwendet. Von daher habe ich, statt wie im 
Tutorial 2, 4 Schieberegister kaskadiert. Die 33. LED steuer ich direkt 
über den µC (ATMega8) an.

Mein Problem ist nun, dass egal, welches Codebeispiel aus dem Tutorial 
ich verwende, immer alle LEDs aufleuchten. Ich habe auch schon versucht, 
das ganze für 4 Schieberegister anzupassen, oder den Code auf jede 
andere nur erdenkliche sinnvolle Art abzuändern, jedoch ohne Erfolg. Das 
einzige was einmal zu beobachten war, ist dass bei jedem erneuten 
Schließen des Stromkreis scheinbar zufällig irgendwelche LEDs 
aufleuchteten. Allerdings kann ich nicht sagen, wie der Code da 
ausgesehen hat.

Einen Hardwarefehler schließe ich aus. (Ich habe allerdings zur 
Sicherheit trotzdem mal noch den Schaltplan angehängt, falls ich 
irgendwas komplett falsch verstanden haben sollte. Der Max232, der noch 
zu sehen ist, kann ignoriert werden. Der soll später noch Daten zwischen 
PC und µC austauschen, spielt aber zur Zeit noch keine Rolle.)

Was mache ich falsch, bzw. wie komme ich meinem Fehler auf die Schliche?

Mit freundlichen Grüßen

Felix

von Matthias L. (Gast)


Lesenswert?

Mal davon abgesehen, dass du offensichtlich die Hardware-SPI 
Schnittstelle nicht verwendest, sehe ich in der Verschaltung µC-74HC595 
keine Fehler.

Also kann das PRoblem wohl nur an der (nicht bekannten) Software 
liegen...

PS: Der SCL Eingang ist mM nach ziemlich sinnlos und kann direkt auf GND 
gelegt werden.

von hilfe (Gast)


Lesenswert?

hey
probiers nicht mit einem Code-Schnipsel, welchen du gefunden hast..... 
mit Hilfe des Datenblattes für den 595 hast du das Programm ziemlich 
schnell selber geschrieben. (und du hast die Funktion verstanden)

Schau auf das Timing Diagramm im Datenblatt... du must nur alles genau 
wie dort beschrieben schalten und dann funktioniers..

von kurz (Gast)


Lesenswert?

Welche Daten gibts Du denn aus?
Und wie wird das jeweilige Anzeigen-Led angesteuert?


Wenn mal alles funktioniert und Du schlau bist, so ändere den Code, daß 
Du 33 bit ausgibst und häng die 33. Led an den Ausgang QH* des letzten 
Schieberegisters.

von Matthias L. (Gast)


Lesenswert?

>Wenn mal alles funktioniert und Du schlau bist, so ändere den Code, daß
>Du 33 bit ausgibst und häng die 33. Led an den Ausgang QH* des letzten
>Schieberegisters.

"Wenn ... Du schlau bist, so..." liest du dir mal das Datenblatt des 595 
durch.

von Felix K. (blackbird8690)


Lesenswert?

Danke erstmal für eure Hilfe.

kurz schrieb:
> Welche Daten gibts Du denn aus?
> Und wie wird das jeweilige Anzeigen-Led angesteuert?

Die LEDs sind einfach an den einzelnen Ausgängen der Schieberegister 
angeschlossen und haben einen gemeinsamen Plus-Pol.

Ich hab mir jetzt das Datenblatt des 595 mal genau durchgelesen und ein 
einfaches Testprogramm geschrieben:
1
.include "m8def.inc"
2
 
3
.equ RCK  = 3
4
.equ SCL  = 2
5
.equ SCK  = 1
6
.equ SIN  = 0
7
8
9
    ldi   r16, LOW(RAMEND)     ; Stackpointer initialisieren
10
    out   SPL, r16
11
    ldi   r16, HIGH(RAMEND)
12
    out   SPH, r16
13
14
    ldi   r16, 0xFF            ; Port Pins auf Ausgang konfigurieren
15
    out   DDRB, r16
16
  
17
    cbi   PORTB, 4             ; 33. LED ein
18
  
19
    cbi   PORTB, SIN           ; zunächst alle Ausgänge auf 0
20
    cbi   PORTB, SCK
21
    cbi   PORTB, SCL
22
    cbi   PORTB, RCK 
23
24
    sbi   PORTB, SCL           ; Clear Leitung auf 1
25
26
    sbi   PORTB, SIN           ; Erste Stelle des Schieberegisters mit 1 belegen (LED leuchtet nicht)
27
    sbi   PORTB, SCK
28
    sbi   PORTB, RCK             
29
30
    cbi   PORTB, SCK           ; übernehmen
31
    cbi   PORTB, RCK
32
    cbi   PORTB, SIN              
33
34
loop:
35
36
    rjmp  loop

Nach diesem Programm sollte ja eigentlich die erste LED nicht leuchten 
und alle weiteren LEDs sollten leuchten. Allerdings leuchten 
interessanterweise die ersten 8 LEDs, die anderen sind aus. (Die 33. LED 
leuchtet natürlich immer, die lasse ich jetzt einfach mal außen vor) 
Dann nach einem Reset sind die ersten 8 LEDs aus, und der Rest leuchtet. 
Erneuter Reset und alle LEDs leuchten und dann nach dem nächsten Reset 
wieder nur die ersten 8. Und immer so weiter.

Ich weiß solangsam echt nicht mehr, woran es noch liegen könnte!

von Tobias T. (tobytetzi)


Lesenswert?

Hallo,

so wie ich das sehe, musst Du 32 Bit durchschieben, dann erst enablen.
Du schiebst ja nur ein bit.

Wenn ich falsch liege, bitte um Verständniss, das ich kaum Assembler 
kann. ;-)

Gruß Toby

von Felix K. (blackbird8690)


Lesenswert?

Tobias Tetzlaff schrieb:
> Hallo,
>
> so wie ich das sehe, musst Du 32 Bit durchschieben, dann erst enablen.
> Du schiebst ja nur ein bit.

Also laut Datenblatt sollte es auch schon bei einem gehen! Habs aber mal 
ausprobiert und es leuchten trotzdem noch alle! (Also nicht mehr wie 
vorher so abwechselnd, das war glaube ich nur zwischenzeitlicher Effekt 
! ??).

Wenn keiner mehr weis, woran es noch liegen könnte, werde ich mal 
einfach statt des µC vier Schalter an die Schieberegister klemmen und 
versuchen manuell Daten an das Schieberegister zu senden. Dann kann ich 
wenigstens dort die Fehlerquelle ausschließen (bzw. festmachen)!

von Turbo T. (turbotoni)


Lesenswert?

Ich würde dir mal raten, das du dich erst mal mit den Grundlagen 
beschäftigst.
Wenn du nur einen Schiebetakt durchführst,darfst du auch nur 1 LED 
betrachten.
Die anderen LEDs leuchte rein zufällig oder sind zufällig aus.
Und schalter an den Eingängen, an Stelle des AVRs bringen gar nichts, da 
sie auf grund des Kontaktprellens mehre Impulse pro betätigung geben.

MfG Turbotoni

von Felix K. (blackbird8690)


Lesenswert?

Ich betrachte ja auch nur eine LED, nämlich die erste! Entschuldigung, 
wenn man mich falsch verstanden hat, weil ich mich immer auf alle 
bezogen hab. (Das lag daran, dass ich auch versucht habe alle 
anzusteuern. Das Testprogramm ist nur um zu prüfen, ob ein 
Schiebevorgang überhaupt etwas bringt). Die erste LED ist aber eben bei 
obigem Programm immer an, egal ob ich eine 1 oder eine 0 an das 
Schieberegister sende, und dass ist es, was ich nicht verstehe.

Das Kontaktprellen hatte ich ganz vergessen. Natürlich würde es dann 
nicht funktionieren. Ich würde halt nur gerne prüfen, ob die 
kaskadierten Schieberegister auch richtig funktionieren, oder ob 
eventuell eines defekt ist. Kann ja mal passieren!

Ist halt mein erstes Projekt mit Schieberegistern und da ich später noch 
was größeres geplant habe, wofür ich auch Schieberegister benötige, soll 
dieses Projekt zeigen, ob ich alles richtig verstanden hab.

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
Noch kein Account? Hier anmelden.