Goblin
01.11.2006, 09:07
Hallo Leute!
Ich habe gestern mit einem kleinen (bestimmt sehr aufwändigen Lauflicht) angefangen, Asm zu programmieren. Ich habe natürlich das RN-WiKi geradezu aufgesogen, was Assembler angeht. Ausserdem auch gängige anderen Seiten. Aber zurück zum Thema: Beim Lauflicht hab ich ne Verzögerung gebastelt, indem immer 1 Byte hochgezählt wird, wenn es 255 ist, wird ein anderes Byte um 1 hochgezählt. Wenn dieses nun auch 255 ist, geht das Lauflicht weiter. Also quasi 255^2 Scheifendurchläufe. Sagen wir so: Es funktioniert..
Nun wollte ich sowas mal mit dem Timer machen. Zuerst hab ich nur versucht, mit nem Prescaler von 1024 zu Werke zu gehen. Allerdings schien mir das zu schnell, also lasse ich pro OVerflow nen Byte hochzählen und bei dessen "Overflow" das Lauflicht (was in diesem Fall nen Binärzähler ist) weiterlaufen zu lassen. Allerdings will das Teil nicht. Was passiert ist dass alle LEDs an den Ports so halb leuchten, PWM-mäßig. Allerdings ist kein "Takt" zu erkennen, wenn ich die Schaltung im Dunkeln schnell hin-und herschwenke... Zumindest bei 2 LEDs (den 8ern und den 16ern) sollte dies allerdings der Fall sein. Hab ich den Timer überhaupt richtig eingestellt? Hier mein Code:
#include "tn12def.inc"
.org 0x000
rjmp _main
.org OVF0addr ;Vektor für Timer0 Overflow
rjmp _timer0 ;Interrupt Handler anspringen
_definitions:
ldi R25, 255 ;Threshold für Verzögerung
ldi R16, 31
out DDRB, R16 ;PortB as Output
ldi R16, 7
out TCCR0, R16 ;Timer0 on, Prescaler 1024
ldi R21, 21 ;R21 mit 21 initialisieren
sei ;Interrupts enablen
_main:
out PortB, R21 ;R21 anzeigen
rjmp _main
_timer0:
inc R20 ;R20 um 1 hoch
cp R20, R25 ;Wenn Zähler = 255...
brne _main ;...dann springe zu _main
inc R21 ;anderfalls R21 incremetieren
rjmp _main
Ich habe gestern mit einem kleinen (bestimmt sehr aufwändigen Lauflicht) angefangen, Asm zu programmieren. Ich habe natürlich das RN-WiKi geradezu aufgesogen, was Assembler angeht. Ausserdem auch gängige anderen Seiten. Aber zurück zum Thema: Beim Lauflicht hab ich ne Verzögerung gebastelt, indem immer 1 Byte hochgezählt wird, wenn es 255 ist, wird ein anderes Byte um 1 hochgezählt. Wenn dieses nun auch 255 ist, geht das Lauflicht weiter. Also quasi 255^2 Scheifendurchläufe. Sagen wir so: Es funktioniert..
Nun wollte ich sowas mal mit dem Timer machen. Zuerst hab ich nur versucht, mit nem Prescaler von 1024 zu Werke zu gehen. Allerdings schien mir das zu schnell, also lasse ich pro OVerflow nen Byte hochzählen und bei dessen "Overflow" das Lauflicht (was in diesem Fall nen Binärzähler ist) weiterlaufen zu lassen. Allerdings will das Teil nicht. Was passiert ist dass alle LEDs an den Ports so halb leuchten, PWM-mäßig. Allerdings ist kein "Takt" zu erkennen, wenn ich die Schaltung im Dunkeln schnell hin-und herschwenke... Zumindest bei 2 LEDs (den 8ern und den 16ern) sollte dies allerdings der Fall sein. Hab ich den Timer überhaupt richtig eingestellt? Hier mein Code:
#include "tn12def.inc"
.org 0x000
rjmp _main
.org OVF0addr ;Vektor für Timer0 Overflow
rjmp _timer0 ;Interrupt Handler anspringen
_definitions:
ldi R25, 255 ;Threshold für Verzögerung
ldi R16, 31
out DDRB, R16 ;PortB as Output
ldi R16, 7
out TCCR0, R16 ;Timer0 on, Prescaler 1024
ldi R21, 21 ;R21 mit 21 initialisieren
sei ;Interrupts enablen
_main:
out PortB, R21 ;R21 anzeigen
rjmp _main
_timer0:
inc R20 ;R20 um 1 hoch
cp R20, R25 ;Wenn Zähler = 255...
brne _main ;...dann springe zu _main
inc R21 ;anderfalls R21 incremetieren
rjmp _main