Forum: Mikrocontroller und Digitale Elektronik Timer Compare Interrupt Attiny2313


von Niklas B. (niklas90)


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

von spess53 (Gast)


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

von Niklas B. (niklas90)


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.

von spess53 (Gast)


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

von Niklas B. (niklas90)


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.

von Hannes L. (hannes)


Lesenswert?

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

Nicht, wenn man die richtige Include-Datei benutzt...

>
> .INCLUDE "2313def.inc"

Diese Include-Datei ist für den AT90S2313 und nicht für den ATTiny2313.

...

von Oliver (Gast)


Lesenswert?

Die richtige Include-Datei für den ATTiny2313 heisst "tn2313def.inc".

von Hannes L. (hannes)


Lesenswert?

Oliver schrieb:
> Die richtige Include-Datei für den ATTiny2313 heisst "tn2313def.inc".

Olle Petze... ;-)

Genau das sollte sich Niklas selbst erarbeiten, z.B. durch Stöbern in 
der Dateistruktur seines Assembler-Ordners. Mein Hinweis war als Hilfe 
zur Selbsthilfe gedacht, nicht als fertige Lösung auf dem Silbertablett.

...

von Niklas B. (niklas90)


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!!).

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Niklas Beuster schrieb:
> Ich werd mal in Internet nach
> der richtigen Datei für den 2313 suchen.

Das wird nicht viel bringen. Ich hänge sie Dir trotzdem an, stammt von 
AvrAssembler2 des AVR-Studio 4.12 SP4 Build 498, also einer recht 
betagten Version.

...

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
Noch kein Account? Hier anmelden.