www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schieberegister, bitte um Hilfe


Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

als Anfänger hänge ich wieder einmal fest.

Ich habe eine LED-Kette aus 25 LED's aufgebaut.
24 LED's werden über Schieberegister gesteuert, 1 LED direkt über einen
Port. Die einzelne LED habe ich über ein Port gesteuert,
weil ich folgendes nicht hin bekomme:

Timer 1 erzeugt die ISR. Beim OVF1 geht die erste LED ON.
Nächster OVF1 zweite LED usw. usw... bis alle 24 LED's ON sind.
Mit OVF1 Nr.25 gehen alle LED's OFF. Bis hierher funktioniert alles.

Nun soll mit OVF1 Nr.26 das Spiel von vorne beginnen, und da haperts.
Das Spiel startet erst wieder mit OVF1 Nr.27. Deshalb habe ich die
LED Reihe auf 25 LED's erweitert und die LED Nr.25 über einen Port
gesteuert. Nun funktioniert der Ablauf optisch wie gewollt.
Eine LED nach der anderen geht ON, nach Nr.25 alle OFF und einen OVF1
später beginnt es von vorn.

Es muss doch möglich sein, den Port einzusparen und nur die 24 LED's
über die Schieberegister diesen Effekt erzeugen zu lassen, nur wie ??

Kann mir jemand helfen, meinen Code dahingehend zu ändern?

.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def temp4 = r19
.def cnt = r20
.def SubCount = r21
.equ SCHIEBE_DDR  = DDRB
.equ SCHIEBE_PORT = PORTB
.equ NLS          = PB2 ;LED 25 , PIN 10 direkt auf Vcc
.equ RCK          = PB3 ;PIN 12
.equ SCK          = PB1 ;PIN 11
.equ SIN          = PB0 ;PIN 14

.org 0x0000
        rjmp    main

.org OVF1addr
        rjmp timer1_compare


main:
;*************** Stackpointer ********************************

    ldi   temp1, LOW(RAMEND)
    out   SPL, temp1
    ldi   temp1, HIGH(RAMEND)
    out   SPH, temp1

;*************** TIMER 1 *************************************

  ldi temp1, high(20000)
    out OCR1AH, temp1
    ldi temp1, low(20000)
    out OCR1AL, temp1
    ldi temp1, (1 << CS10)| (1<<WGM12)
    out TCCR1B, temp1
    ldi temp1, 1 << OCIE1A
    out TIMSK, temp1

  cbi SCHIEBE_PORT, NLS
  ldi   temp1, (1<<RCK) | (1<<NLS) |(1<<SCK) | (1<<SIN)
    out   SCHIEBE_DDR, temp1

;*********** Anfangswerte ***********************************
  ldi   cnt, 26
    ldi   temp2, 255
    ldi   temp3, 255
    ldi   temp4, 255
  sei

loop:
    rjmp  loop

;******************** ISR ***********************************

timer1_compare:

    push temp1
    in temp1, SREG
    inc SubCount
    cpi SubCount, 100
    brne end
    clr SubCount


;************** LED's einschalten ****************************
Ausgabe:
    mov   temp1, temp4
    rcall Schiebe
    mov   temp1, temp3
    rcall Schiebe
    mov   temp1, temp2
    rcall Schiebe
    rcall SchiebeOut
  sbi SCHIEBE_PORT, NLS

  lsl temp2
     rol temp3
     rol temp4
  dec cnt
  brne end
  cbi SCHIEBE_PORT, NLS
;**************** Alle Led's wieder ausschalten ***************

loesch:
  push temp1
  push temp2
  push temp3
  push temp4

    ldi   temp2, 255
    ldi   temp3, 255
    ldi   temp4, 255

  mov   temp1, temp4
    rcall Schiebe
    mov   temp1, temp3
    rcall Schiebe
    mov   temp1, temp2
    rcall Schiebe
    rcall SchiebeOut

  lsl temp2
     rol temp3
     rol temp4
  dec cnt
  brne loesch

  pop temp4
  pop temp3
  pop temp2
  pop temp1


end:
     out SREG, temp1
     pop temp1
     reti

;**************** Schiebe Routine ****************************

Schiebe:
    push  temp2
    ldi   temp2, 8

Schiebe_1:
    rol  temp1
    brcs Eingangsimpuls
    cbi  SCHIEBE_PORT, SIN
    rjmp Schiebe_Clock

Eingangsimpuls:
    sbi  SCHIEBE_PORT, SIN

Schiebe_Clock:
    sbi   SCHIEBE_PORT, SCK
    cbi   SCHIEBE_PORT, SCK

    dec   temp2
    brne  Schiebe_1

    pop   temp2
    ret

;************ Ausgabe Schieberegister ************************

SchiebeOut:
    sbi   SCHIEBE_PORT, RCK
    cbi   SCHIEBE_PORT, RCK
    ret


Gruß  Peter




















Wenn alle LED'S ON sind werden sie a

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorweg: ich habe von Assembler nur wenig Ahnung!
Aber versuch mal
ldi   cnt, 25  ;25 statt 26


[EDIT] Das ist unter "Anfangswerte"

Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei ldi cnt, 25 statt 26 leuchten nur 23 LED's durch Schieberegister
statt 24 (3 x 8 )

gruß Peter

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah. Ich hatte gerade einen Gedankenblitz. Guck mal in das Datenblatte 
des 74HC595. Du verwendest dessen "Löschleitung", oder? Ich glaube er 
löscht einen Takt verspätet.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter Bednarz (pebez)

Netiquette, lange Quelltexte als Anhang
AVR-Tutorial: Schieberegister

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk Brunner:
So viel wird in dem Tutorial zur SCLR-Leitung ("Löschleitung") nicht 
gesagt. Nur, dass sie Asynchron ist. Das Wort hab ich schon häufig 
gelesen und kenne dessen Bedeutung immer noch nicht :( Da lob ich mir 
das Timing-Diagramm im Datenblatt.

@Peter Bednarz
Dass heißt für dein Programm, dass du beim Löschvorgang noch einen Takt 
nachschieben musst. Ich versuchs mal umzusetzen:

loesch:
  push temp1
  push temp2
  push temp3
  push temp4

    ldi   temp2, 255
    ldi   temp3, 255
    ldi   temp4, 255

  mov   temp1, temp4
    rcall Schiebe
    mov   temp1, temp3
    rcall Schiebe
    mov   temp1, temp2
    rcall Schiebe
    rcall SchiebeOut
    rcall SchiebeOut  ;das hab ich hinzugefügt

  lsl temp2
     rol temp3
     rol temp4
  dec cnt
  brne loesch

  pop temp4
  pop temp3
  pop temp2
  pop temp1




Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk Brunner
Sorry für den Verstoß gegen die Netiquette, werd's mir merken.

@Silvan König

Danke für die Konstruktiven Hinweise.
Aber mit einem zusätzlichen "rcall SchiebeOut" klappt es auch nicht.
Aus dem Datenblatt kann ich als Newbee noch nicht soviel rauslesen.
Nur soviel, dass ich im Timing Diagramm erkennen kann, dass der
Master Reset gegenüber dem Shift register Input wohl die doppelte
Impulslänge hat :(

Hm, muss doch irgendwie gehen ?
Als Anfänger fehlen einem natürlich die Fähigkeiten mal um die "Ecke"
zu denken. Werde heute abend nochmal an die Sache rangehen.

Gruß  Peter

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay. Hab mich vertan. (ich erinnere nochmals an meine lausigen 
Assembler Kenntnisse.) Versuch das mal anstelle von dem rcall, den ich 
eingefügt hatte:
rcall SchiebeClock

Dein Ziel sollte auf jeden Fall sein einen weiteren Clock-Impuls zu 
generieren. Ich hoffe das erreichst du damit.

Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja,
mit heute abend wird's wohl nix mehr.
Bin leider der Versuchung erlegen in die Veltins Arena zu gehen um
mit zu erleben wie Schalke den Hannoveranern mit 2:1 unterliegt.

@Silvan König
vielen Dank für dein Arengement. Klar, ich muss einen Impuls schneller 
sein. Aber woher nehm ich den b.z.w. wo setze ihn ein?
Vielleicht muss ich auch hergehen und die gesamte Struktur ändern?
Da Schalke morgen nicht spielt, werde ich die Sache morgen erneut 
angehen.
Es gibt halt noch ein Leben nach Schalke :o)
Das "probieren" welcher Befehlssatz wo hinkommt bringt aber nix.
Muss doch irgendwo eine erklärbare Logik geben ?

Schade finde ich hier das Schweigen der Profis, für die es an Sicherheit
grenzender Wahrscheinlichkei ein Klacks wäre für Aufklärung zu sorgen:(

Gruß Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter Bednarz (pebez)

>Schade finde ich hier das Schweigen der Profis, für die es an Sicherheit
>grenzender Wahrscheinlichkei ein Klacks wäre für Aufklärung zu sorgen:(

C'est la vie.

Die Profis sind eben keine Jukebox, die immer und immer wieder die 
gleichen Titel spielt. Darum der Verweis auf die Artikel. Dort sind die 
Sachen ziemlich gut erklärt. Hilfe zur Selbsthilfe.

MfG
Falk

Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Die Profis sind eben keine Jukebox, die immer und immer wieder die
> gleichen Titel spielt. Darum der Verweis auf die Artikel. Dort sind die
> Sachen ziemlich gut erklärt. Hilfe zur Selbsthilfe.

Mea Culpa,

da hast du recht. Ich hab es jetzt hinbekommen.
Das Problem lag ja nicht an der SCL, da diese ja direkt auf Vcc liegt,
sondern in der Löschroutine.


@Silvan König
Deine Anregungen haben mir letztendlich geholfen, vielen Dank dafür.
Ein zusätzlicher Clock Impuls in Verbindung mit der Reduzierung
der cnt, das war's. Nochmals Danke.

Gruß  Peter

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Die Profis sind eben keine Jukebox, die immer und immer wieder die
> gleichen Titel spielt.

Großartig :-D

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Bednarz schrieb:
> Ich hab es jetzt hinbekommen.

Hättest du das nicht früher sagen können? Ich zerbrech mir den Kopf... 
;-D

Autor: Peter Bednarz (pebez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Silvan,

tut mir leid für deinen Kopf :o)
Ich hoffe er ist nicht zu sehr in Mtleidenschaft gezogen.
Aber ich habe es ja erst vorhin (11:32) hin bekommen.
Wenn man Morgen's ausgeschlafen hat klappt's halt besser :o)

Gruß  Peter

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.