PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-Rotieren



Exodus
12.06.2006, 09:49
Hallo,

Hab eine frage zu meinem Code!
1.) Kann ich da noch was verkürzen oder passt es eh so wie ich ihn geschrieben habe?

2.) Wenn code passt, dann wie kann ich die LED weiterlaufen lassen am PB0-PB2!

.include <m8535def.inc>

.org 0x0000
rjmp Reset

.org OC0addr
rjmp Compare

Reset:
;---------------REIFEN-------------------
;In Register laden
ldi R17, 0x01
ldi R18, 0x00

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

;Timer
ldi R16, (1<<CS00) | (1<<CS02)
out TCCR0, R16

;Compare-output
ldi R16, 60
out OCR0, R16

;Flags setzen
ldi R16, (1<<OCIE0)
out TIMSK, R16

;Flags aktivieren
sei

;Hauptprogramm
Reifen:
rjmp Reifen

Compare:
sei
out TCNT0, R18
rol R17
out DDRA, R17
rcall Reifen

MFG
Michael

Florian
12.06.2006, 12:05
Hallo Michael!
Ich nehme mal an Du meinst mit LED-Rotieren bzw. Reifen ein LED-Lauflicht!?

1.) Kann ich da noch was verkürzen oder passt es eh so wie ich ihn geschrieben habe?Bei "Compare" musst Du statt "rcall Reifen" einfach nur "reti" hinschreiben, dann kannst Du nämlich auch das sei rauslassen.
"rcall" geht da garnicht, zumindest nicht in dem Zusammenhang, aber "reti" ist quasi "ret" und "sei" in einem.

2.) Wenn code passt, dann wie kann ich die LED weiterlaufen lassen am PB0-PB2!Du schnappst Dir ein Register, dass Du hochzählen lässt und bei >>Register = Maximum<< fängst Du von vorne an.
Die Werte gibst Du einfach am Port aus.

Viele Grüße
Florian

Exodus
12.06.2006, 13:02
Ja schon aber wie verknüpfe ich dass am besten, dass er am PORTB weiterscheibt von PB0-PB1!

Und wie ist der Code so für dich? Ich meine ist er gut geschrieben oder kann man da noch etwas besser/verständlicher machen?


Grüße
Michael

Florian
12.06.2006, 14:01
Hallo Michael!
Du musst einfach in der Interrupt-Routine das register um eins weiterschieben und beim Maximum dann wieder auf das Minimum setzen.
Den Wert gibst Du dann einfach mit "out PORTB , rxx" aus.

Und wie ist der Code so für dich? Ich meine ist er gut geschrieben oder kann man da noch etwas besser/verständlicher machen?Jeder hat einen eigenen Schreibstiel, das musst Du selber für Dich herausfinden, womit Du am Besten arbeiten kannst.

Viele Grüße
Florian

Exodus
12.06.2006, 14:12
Ich glaube du verstehst mich nicht! Ich meine zuerst sollen LED1-8 nacheinander leuchten. Dann soll dass Lauflicht weitergehen am PORTB! ABer nur 2 LED´s.

MFG
Michael

Florian
12.06.2006, 17:52
Hallo Michael!

Ich glaube du verstehst mich nicht!Das glaube ich auch langsam! *schmunzel*

Viele Grüße
Florian

linux_80
12.06.2006, 20:43
schau ma mal ...
Du hast also 10 oder 11 LEDs die nacheinander leuchten sollen ?
Dann nimm nicht ein Byte, sondern 2 Byte zum rotieren, und immer beide Werte an beide Ports ausgeben, bei PortB halt nur die beiden Bit vom 2. Byte.
Wenn beim rotieren das 11. Bit erreicht wurde, gleich wieder das 1. setzen.

So wäre jetzt mein Ansatz gewesen.

Florian
12.06.2006, 20:48
Hallo linux_80!
Jetzt habe ich die Problematik erst richtig verstanden, ich habe nicht kapiert, dass sich alles um 10 LEDs dreht!

Viele Grüße
Florian

Exodus
13.06.2006, 07:13
Hallo,

Ja aber die led´s am PORTB sollen erst leuchten, wenn dass erste byte mit dem rotieren fertig ist!

MFG
Michael