Forum: Mikrocontroller und Digitale Elektronik Timer und Compare


von Holger P. (Gast)


Lesenswert?

Habe ich da nun etwas falsch verstande? Ich habe mir nun mal diesen 
kleinen ATTiny13 vorgenommen. Ist ja Geil der kleine Kerl :-)

Nun ich wollte mal alle 500µS für 3,5µs einen Ausgang setzen.
Der Tiny läuft mit 9,6mHz

Also Timer durch 64 so habe ich doch ein 150kHz Takt auf dem Timer oder?
500µS sind 2kHz /somit dachte ich 150/2=75 setze ich den CompareA auf 75
1
.INCLUDE "tn13def.inc"
2
3
.def Dummy1     = r16
4
.def Dummy2     = r17
5
.def Dummy3     = r18
6
.def Dummy4     = r19
7
8
.equ F_CPU  = 9600000  ; Systemtakt in Hz
9
10
.org 0x000     ; kommt ganz an den Anfang des Speichers
11
12
rjmp RESET ; Reset Handler
13
reti       ; IRQ0 Handler
14
reti       ; PCINT0 Handler
15
reti       ; Timer0 Overflow Handler
16
reti       ; EEPROM Ready Handler
17
reti       ; Analog Comparator Handler
18
rjmp Sync  ; Timer0 CompareA Handler
19
reti       ; Timer0 CompareB Handler
20
reti       ; Watchdog Interrupt Handler
21
reti       ; ADC Conversion Handler
22
23
RESET: 
24
ldi Dummy1, low(RAMEND) ; Main program start
25
out SPL, Dummy1         ; Set Stack Pointer to top of RAM
26
27
ldi  Dummy1, 0b11111111
28
out DDRB,Dummy1 ; Port-B Ausgang 
29
30
31
ldi Dummy1, (1<<CS00) | (1<<CS01); Teiler 64
32
out TCCR0B, Dummy1
33
 
34
ldi Dummy1, (1<<OCIE0A)  ; Interrupt bei CompareA
35
out TIMSK0, Dummy1
36
37
ldi Dummy1, 75
38
out OCR0A,Dummy1    ; Compare beladen mit 150/2=75
39
40
sei        ; Interrupts aktivieren
41
42
43
ldi   Dummy4,$00
44
out   PortB,Dummy4
45
46
47
48
Loop:
49
rjmp Loop
50
51
52
Sync:

Doch ich bekomme eine Interruptzeit von 1706.67µS egal was ich im OCR0A 
eintrage. Mach ich da nun ein Gedankenfehler?

von Georg G. (df2au)


Lesenswert?

CTC Mode auch setzen? Wäre hilfreich.

von Holger P. (Gast)


Lesenswert?

Ich habe

nicht
1
ldi   Dummy1,0
2
out   TCNT0,Dummy1

gemacht sondern:
1
ldi   Dummy1,0
2
sts   TCNT0,Dummy1

halt vom ATMega88 übernommen.

Aber wie meinst Du das mit dem CTC????

von Georg G. (df2au)


Lesenswert?

Wenn du den Compare Interrupt nutzen willst, solltest du den Timer auch 
in den passenden Mode 2 schalten (TCRR0A, WGM Bits)

von Holger P. (Gast)


Lesenswert?

Ich dachte WGM0=0 und WGM1=0 ist der normal Mode.
WGM0=0 und WGM1=1 ist der CTC Mode.

Worin besteht nun der Unterschied?

von Georg G. (df2au)


Lesenswert?

Holger P. schrieb:
> Worin besteht nun der Unterschied?

Im Datenblatt sind Diagramme. Es hier zu erläutern wäre zu länglich.

von Eumel (Gast)


Lesenswert?

Holger P. schrieb:
> setze ich den CompareA auf 75

Ne, auf 74 musst du ihn setzen.

von Holger P. (Gast)


Lesenswert?

Ne auf 69 da die Routine auch einwenig Zeit verbraucht :-)

Danke für die Hilfe hier.

von Eumel (Gast)


Lesenswert?

Holger P. schrieb:
> Ne auf 69 da die Routine auch einwenig Zeit verbraucht :-)
>
> Danke für die Hilfe hier

Dann hast du irgendwas falsch gemacht.

von Holger P. (Gast)


Lesenswert?

Viele sagen (und das ist wohl richtig) dass man in einem Interrupt nur 
ein Flag setzt und das eigentliche ausserhalb.

Dieses mach ich hier nicht... deswegen wohl.

von Georg G. (df2au)


Lesenswert?

Die Interrupt Frequenz im Mode 2 sollte unabhängig von der Länge der ISR 
sein (in Grenzen).

von Eumel (Gast)


Lesenswert?

Holger P. schrieb:
> Dieses mach ich hier nicht... deswegen wohl.

Nö, eigentlich sollte das Delay ja locker in die ISR passen. Auch wenn 
das schlechter Stil ist. Also ist irgendwo anders noch der Wurm drin.

von Bernd S. (bernds1)


Lesenswert?

Holger P. schrieb:
>
> Nun ich wollte mal alle 500µS für 3,5µs einen Ausgang setzen.
> Der Tiny läuft mit 9,6mHz
>
Hallo Holger,

wir wissen zwar in diesem Zusammenhang, was gemeint ist, aber wenn du 
die Einheiten bei anderer Gelegenheit so schreibst, gibt es 
Mißverständnisse.
Zur Erläuterung:

500µS sind 10000Ohm (Siemens ist der Leitwert)
s=sekunde, S=Siemens

9,6mHz sind 0,0096Hz (so langsam willst du den armen Tiny bestimmt nicht 
nicht laufen lassen)
m=milli, M=Mega

Das nur als Hinweis, weil sowas hier oft passiert, und dann gibt's 
Mißverständnisse. Nicht krumm nehmen, ist gut gemeint :-)

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.