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
Vorweg: ich habe von Assembler nur wenig Ahnung! Aber versuch mal
1 | ldi cnt, 25 ;25 statt 26 |
[EDIT] Das ist unter "Anfangswerte"
Hallo, bei ldi cnt, 25 statt 26 leuchten nur 23 LED's durch Schieberegister statt 24 (3 x 8 ) gruß Peter
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:
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 |
@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
Falk Brunner schrieb: > Die Profis sind eben keine Jukebox, die immer und immer wieder die > gleichen Titel spielt. Großartig :-D
Peter Bednarz schrieb: > Ich hab es jetzt hinbekommen. Hättest du das nicht früher sagen können? Ich zerbrech mir den Kopf... ;-D
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.