Forum: Mikrocontroller und Digitale Elektronik Schieberegister, bitte um Hilfe


von Peter B. (pebez)


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

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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

[EDIT] Das ist unter "Anfangswerte"

von Peter B. (pebez)


Lesenswert?

Hallo,

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

gruß Peter

von Silvan K. (silvan) Benutzerseite


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.

von Falk B. (falk)


Lesenswert?

@  Peter Bednarz (pebez)

Netiquette, lange Quelltexte als Anhang
AVR-Tutorial: Schieberegister

von Silvan K. (silvan) Benutzerseite


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:

1
loesch:
2
  push temp1
3
  push temp2
4
  push temp3
5
  push temp4
6
7
    ldi   temp2, 255
8
    ldi   temp3, 255
9
    ldi   temp4, 255
10
11
  mov   temp1, temp4
12
    rcall Schiebe
13
    mov   temp1, temp3
14
    rcall Schiebe
15
    mov   temp1, temp2
16
    rcall Schiebe
17
    rcall SchiebeOut
18
    rcall SchiebeOut  ;das hab ich hinzugefügt
19
20
  lsl temp2
21
     rol temp3
22
     rol temp4
23
  dec cnt
24
  brne loesch
25
26
  pop temp4
27
  pop temp3
28
  pop temp2
29
  pop temp1

von Peter B. (pebez)


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

von Silvan K. (silvan) Benutzerseite


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:
1
rcall SchiebeClock

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

von Peter B. (pebez)


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

von Falk B. (falk)


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

von Peter B. (pebez)


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

von Klaus (Gast)


Lesenswert?

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

Großartig :-D

von Silvan K. (silvan) Benutzerseite


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

von Peter B. (pebez)


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

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.