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
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.
@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:
@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
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.
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
@ 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
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
@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