PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tiny12: Timer0 (Anfänger)



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

izaseba
01.11.2006, 10:45
Hallo Goblin,

willkommen bei Assembler :-)

So wie ich es sehe hast Du eine Kleinigkeit noch vergessen, Du mußt den Interrupt im TIMSK noch einschalten



ldi R16,(1<<TOIE0)
out TIMSK,R16


Schau ml im Dattenblatt nach TIMSK

Gruß Sebastian

albundy
02.11.2006, 10:21
Hallo Goblin,

du hast noch etwas übersehen.
Dein Programm wird die Port und Timerdefinitionen nie ausführen, da du am Anfang zu _main und nicht zu _definitions springst.

olfi13
02.11.2006, 13:10
Hi!
Die Int-Routine darf nur mit reti beendet werden.
Wirf mal den Simulator an, da lernst Du viel.

Gruß, olfi