Timer Compare Interrupt Attiny2313

OP #2179915
Lesenswert?

Hallo Leute,
nachdem ich mir die Artikel hier zu Timer und Interrupts angeschaut 
habe, wollte ich mal was eigenes auf meinem Attiny2313 realisieren. In 
meinem Assembler-Code soll das Register R17 bei jedem Timer Interrupt 
durch Compare eins hochgezählt werden, allerdings scheine ich die Bits 
falsch gesetzt zu haben, denn der Timer verhält sich, als würde er nur 
beim Overflow interrupten.
1
.INCLUDE "2313def.inc"
2

3
.org 0x0000
4
RJMP main
5
.org 0x000E
6
RJMP zeit  ;Timer0 Interrupt
7

8
main:
9
LDI R16, 255
10
OUT DDRB, R16
11

12
LDI R16, 5  ;Prescale 1024
13
OUT TCCR0, R16
14
LDI R16, 4  ;Compare Mode
15
OUT TIMSK, R16
16
LDI R16, 5
17
OUT $3C, R16  ;Timer zählt bis OCR0B bzw R16 in dem Fall
18
SEI    ;Interrupts erlauben
19
CLR R17
20

21
loop:
22
OUT PORTB, R17
23
RJMP loop
24

25
zeit:
26
INC R17
27
reti

Ich würde erwarten, dass R17 schneller hochzählt, wenn ich OCR0B z.b. 1 
mache und langsamer, wenn ich es auf 255 setze, aber tatsächlich gibt es 
keine Geschwindigkeitsunterschiede.

Zum Vergleich, das Ergebnis (ich gebe das Register R17 ja immer auf 
PORTB (Led's) aus), entspricht genau dem, was ich mit dem unteren Code 
erziele, hier mache ich tatsächlich "nur" Overflow Interrupt.
1
.INCLUDE "2313def.inc"
2

3
.org 0x0000
4
RJMP main
5
.org 0x0006
6
RJMP zeit  ;Timer0 Interrupt
7

8
main:
9
LDI R16, 255
10
OUT DDRB, R16
11

12
LDI R16, 5  ;Prescale 1024
13
OUT TCCR0, R16
14
LDI R16, 2  ;Overflow Mode
15
OUT TIMSK, R16
16
SEI    ;Interrupts erlauben
17
CLR R17
18

19
loop:
20
OUT PORTB, R17
21
RJMP loop
22

23
zeit:
24
INC R17
25
reti

Ich hoffe jemand kann mir helfen,
Gruß Niklas
Gast #2179927
Lesenswert?

Hi

>Ich würde erwarten, dass R17 schneller hochzählt, wenn ich OCR0B z.b. 1
>mache und langsamer, wenn ich es auf 255 setze, aber tatsächlich gibt es
>keine Geschwindigkeitsunterschiede.

Wie sollte es? Der Timer löst beim Erreichen vom OCR-Wert den Interrupt 
aus. und zählt dann weiter bis 255. Du änderst nur den Zeitpunkt des 
Interrupts, nicht den Abstand zwischen zwei Interrupts. Versuche es mal 
mit CTC.

MfG Spess
OP #2179994
Lesenswert?

Hm, mit dem TCCR0B kann ich aber kein CTC machen oder? Das hat ja nur 1 
WGM Bit (WGM02), aber um CTC anzuschalten braucht man doch WGM12 oder 
heißt das einfach nur anders und ich muss das WGM02 auf 1 setzen?

Mit FOC0B gehts schonmal nicht^^:

"A FOC0B strobe will not generate any interrupt, nor will it clear the 
timer in CTC mode using OCR0B as TOP."

Danke erst mal, ich werde morgen weiter rumprobiern. Im schlimmsten Fall 
nehm' ich halt einen anderen Timer.
Gast #2180017
Lesenswert?

Hi

>Hm, mit dem TCCR0B kann ich aber kein CTC machen oder? Das hat ja nur 1
>WGM Bit (WGM02), aber um CTC anzuschalten braucht man doch WGM12 oder
>heißt das einfach nur anders und ich muss das WGM02 auf 1 setzen?

Es gibt auch noch TCCR0A. Da findest du die restlichen WGM-Bits.

Noch etwas:

LDI R16, 1<<CS02 | 1<<CS00  ;Prescale 1024

liest sich wesentlich besser als

LDI R16, 5  ;Prescale 1024.

Und so etwas:

OUT $3C, R16  ;Timer zählt bis OCR0B bzw R16 in dem Fall

solltest du ganz vermeiden.

MfG Spess
OP #2181529
Lesenswert?

spess53 schrieb:
> OUT $3C, R16  ;Timer zählt bis OCR0B bzw R16 in dem Fall
>
> solltest du ganz vermeiden.

Tja, leider ist die Include-Datei ziemlich unvollständig und teilweise 
sogar fehlerhaft, deshalb musste ich die direkte Adresse angeben.

Ich habe es jetzt hinbekommen, dass er macht was er soll :)
1
.INCLUDE "2313def.inc"
2
.equ OCIE0B = 2
3
.equ WGM01 = 1
4
.equ OCR0A = $36
5
.equ TCCR0A = $30
6
.def temp = R16
7

8
.org 0x0000
9
RJMP main
10
.org 0x000E
11
RJMP zeit      ;Timer0 Interrupt
12

13
main:
14
LDI temp, 255
15
OUT DDRB, temp
16

17
LDI temp, (1<<CS02)|(1<<CS00)  ;Prescale 1024
18
OUT TCCR0, temp      ;TCCR0 = TCCR0B (die include Datei ist Mist)
19
LDI temp, (1<<WGM01)    ;CTC Mode
20
OUT TCCR0A, temp
21
LDI temp, (1<<OCIE0B)    ;Compare mit OCR0A
22
OUT TIMSK, temp
23
LDI temp, 12
24
OUT OCR0A, temp      ;Timer zählt bis OCR0A bzw R16 in dem Fall
25
SEI        ;Interrupts erlauben
26
CLR R17
27

28
loop:
29
OUT PORTB, R17
30
RJMP loop
31

32
zeit:
33
INC R17
34
reti

Danke für den Hinweis mit dem CTC nochmal, das hat mich auf die richtige 
Spur gebracht, jetzt funktioniert das Programm korrekt.
OP #2182377
Lesenswert?

Hehe, danke für den Hinweis. Leider gibt es die Datei für den Attiny2313 
scheinbar nicht bei meinem Assembler. Ich nutze den WAVRASM, da sind die 
Include-Dateien in dem appnotes-Ordner, für die Attiny-Reihe sind da nur 
die Dateien für Attiny11, -12,  und 22. Ich werd mal in Internet nach 
der richtigen Datei für den 2313 suchen.

Edit: Ich hab sie mir jetzt mal vom AVR-Studio gemopst ;-) Aber 
eigentlich egal, ich werde demnächst eh von WAVRASM und Ponyprog auf das 
AVR-Studio umsteigen, da ich mir das "mySmartUSB light" geholt hab, das 
hat mir immer zu lange gedauert mit USB-seriel Konverter (5 min!!).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren