www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim Schieberegister-Tutorial


Autor: Felix Klein (blackbird8690)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

ich versuche mich gerade an diesem Tutorial: 
http://www.mikrocontroller.net/articles/AVR-Tutori.... 
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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hilfe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: kurz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Felix Klein (blackbird8690)
Datum:

Bewertung
0 lesenswert
nicht 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:
.include "m8def.inc"
 
.equ RCK  = 3
.equ SCL  = 2
.equ SCK  = 1
.equ SIN  = 0


    ldi   r16, LOW(RAMEND)     ; Stackpointer initialisieren
    out   SPL, r16
    ldi   r16, HIGH(RAMEND)
    out   SPH, r16

    ldi   r16, 0xFF            ; Port Pins auf Ausgang konfigurieren
    out   DDRB, r16
  
    cbi   PORTB, 4             ; 33. LED ein
  
    cbi   PORTB, SIN           ; zunächst alle Ausgänge auf 0
    cbi   PORTB, SCK
    cbi   PORTB, SCL
    cbi   PORTB, RCK 

    sbi   PORTB, SCL           ; Clear Leitung auf 1

    sbi   PORTB, SIN           ; Erste Stelle des Schieberegisters mit 1 belegen (LED leuchtet nicht)
    sbi   PORTB, SCK
    sbi   PORTB, RCK             

    cbi   PORTB, SCK           ; übernehmen
    cbi   PORTB, RCK
    cbi   PORTB, SIN              

loop:

    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!

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Felix Klein (blackbird8690)
Datum:

Bewertung
0 lesenswert
nicht 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)!

Autor: Turbo Toni (turbotoni)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Felix Klein (blackbird8690)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.