Forum: Mikrocontroller und Digitale Elektronik 8 Bit Timer mit Tiny26


von Daniel R. (Gast)


Lesenswert?

Hallo alle zusammen!!!

Da ich bisher nur einen ATmega16 hatte, jetzt aber einen ATTiny26 habe,
möchte ich mein Programm von dem ATmega16 auf den ATTiny26 portieren.
Das einzige Problem dabei ist der Timer. Im Atmega16 habe ich den
16-Bit Timer mit dem ClearTimerOnCompareMatch (CTC) Modus verwendet. Da
der Tiny26 jedoch keinen 16 Bit Timer hat, muss ich wohl oder übel den 8
Bit Timer nehmen.
Soweit zur Vorgeschichte..... Nun zum Problem.
Kurz gesagt: Ich bring den 8 Bit Timer nicht zum Laufen.
Ich sitze seit heute morgen um 8 Uhr vor dem Tiny26 Datenblatt und
werde einfach nicht schlau daraus. Es funktioniert einfach nicht.
Hier mal mein bisheriger Assemblercode:
1
.include "tn26def.inc"
2
.org 0x00      ;InterruptVektorTable
3
rjmp reset      ;Reset
4
.org 0x03
5
rjmp timer_int      ;Timer1 CompareMatch 1A Interrupt
6
7
reset:
8
  ldi r16,RAMEND    ;Stackpointer initialisieren
9
  out SP,r16    ;"""""""""""""""""""""""""""
10
11
  ldi r16, 0b00000000  ;0x00 in r16
12
  out TCCR1A, r16    ;TCCR1A mit 0x00 initialisieren
13
  ldi r16, 0b10000111  ;Bit7 für CTC Mode,Bits 0-3 fürCLK/64
14
  out TCCR1B, r16    ;TCCR1B initialisieren
15
  ldi r16,0x03    ;0x03 in r16, ...für den Debugger
16
  out OCR1A,r16    ;Wert in das Timerregister schreiben
17
  sei      ;Interrupts zulassen
18
main:
19
  rjmp main
20
21
22
timer_int:      ;Timer Interrupt
23
                        
24
  ser r16      ;SetAllBits in r16
25
  out DDRB,r16    ;DDRB als Ausgang...fürs Debuggen
26
  ldi r16,0x03    ;Timer reloaden
27
  out OCR1A,r16    ;""""""""""""""
28
  reti      ;zurück zu main

Warum geht das so nicht? Ich komme einfach nicht darauf. Weiß jemand
von euch wie man den Timer für den CTC Modus initialisiert? Hat
vielleicht gerade jemand den Code zur Initialisierung zur Hand und kann
ihn posten? Bitte helft mir! Ich wäre über einen funktionierenden
Beispielcode wirklich dankbar!!!

Mit freundlichen Grüßen

Daniel!

von Werner B. (Gast)


Lesenswert?

Der Tiny26 vergeleicht mit OCR1C im CTC Mode (Datenblatt S.71 bei der
Beschreibung des CTC1 Bits).

Was Deine Interruptroutime macht versteh' ich allerdings auch nicht,
für mich relativ sinnlos? Warum bei jedem interrupt Port B auf output
und warum OCR1A mit 3 laden ?

von Peter Dannegger (Gast)


Lesenswert?

Wo ist das TIMSK ?

Und nimm das OCR1A ausm Interrupt raus, das hat sich doch nicht
geändert.


Peter

von Daniel R. (Gast)


Lesenswert?

Danke erst einmal für die Antworten!
@Werner B.
PortB bei jedem Interrupt auf Output, damit ich das im Debugger sehe,
wenn ich auf dem F11 Knopf draufbleibe, damit der nächste Int auslöst.
Und 0x03 in OCR1A, damit eben was drinsteht(also einfach nur, dass der
Timer im Debugger relativ schnell wieder auslöst).

@ Peter Dannegger

Also beim ATmega16 musste ich aus welchem Grund auch immer das OCR1A in
der Timer ISR neu laden, sonst lief der Timer immer bis 0xFFFF (das Oszi
bestätigte das).

Ich werde mal versuchen aus euren Tips schlau zu werden.
Ich med mich auf jeden Fall nochmal: Entweder erfolglos oder
erfolgreich :)

Wenn jemand zufällig den Code für den Timer parat hat kann derjenige
den Code ja mal posten   (: ;)

Danke!

MfG Daniel!

von Peter Dannegger (Gast)


Lesenswert?

Kannst Du C ?

Hier verwende ich den T1 im ATTiny26:

http://www.mikrocontroller.net/forum/read-4-210743.html#new


Und beim ATMega16 braucht man das OCR1A auch nur einmal zu setzen.
Da ist also was faul in Deinem Programm.


Peter

von Daniel R. (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, ich hab keinen Plan von C. Ich werds mir trotzdem mal anschauen!
;)
...
Ich habe eure Tipps befolgt:
Zum Einen benutze ich jetzt das OCR1C Register und zum Anderen hat, wie
Peter sagte, im TIMSK Register das EnableFlag OCIE1A gefehlt.
Der Timer läuft aber für meine Gewohnheiten ziemlich komisch:
Wenn er den Wert X in OCR1C erreicht hat passiert noch gar nichts. Erst
wenn der Wert X+1 erreicht ist wird der Timer gecleared und in TIFR wird
Bit2 (TOV1) gesetzt. Erst wenn der Wert im Timerregister wieder 0x01 ist
wird der Interrupt ausgelöst.
Dieses Timer1 OverflowBit (TOV1) bleibt jedoch im Debugger gesetzt. Der
Timer läuft aber trotzdem korrekt wie beschrieben weiter. Ist das in der
Hardware dann auch so oder dreht der dann total durch, wenn dieses Bit
immer gesetzt ist?

Also irgendwie kommt mir die Sache ein bisschen komisch vor. Ich glaube
nicht, dass der Timer nun so läuft wie ich es will(oder doch?).

Gibts da noch andere Möglichkeiten?
Wenn der Timer in der Hardware genauso läuft wie im Debugger dann ist
ja gut. Wenn man von dem gewünschten Wert einfach 2 abzieht stimmts ja
wieder, da der Int ja erst wieder bei 0x01 ausgelöst wird.

Im Anhang ist mein jetziger Quellcode zur Initialisierung des Timers.
Wer noch Tipps oder andere Möglichkeiten hat soll diese bitte posten.

Danke für eure Hilfe!

Gruß Daniel!

von Daniel R. (Gast)


Lesenswert?

Kann mir bitte noch jemand sagen, ob der Timer so korrekt
funktioniert(in der Hardware)? Ich kann es im Moment leider noch nicht
selbst testen, da ich noch dabei bin, meinen Tiny (SOIC Package) auf
einer normalen Punktrasterplatine anzulöten...kann noch dauern;

Danke!

Gruß Daniel!

von Andi K. (Gast)


Lesenswert?

Hi!

Du mußt nicht OCIE1A in TIMSK setzen, sondern TOV1 (Timer Overvlow, Bit
2) für den CTC-Mode in Verbindung mit OCR1C.
Das hängt damit zusammen, das der CTC-Mode einen Overflow-Interrupt
auslöst, wenn der Timer 1 den Wert von OCR1C erreicht hat.
Siehe Seite 53 im Datenblatt des Tiny26.

MfG
Andi

von Andi K. (Gast)


Lesenswert?

Meinte natürlich TOIE1 in TIMSK!

MfG
Andi

von Daniel R. (Gast)


Lesenswert?

@Andi K.

Vielen Dank!
Ich werde es gleich mal im Debugger testen.....
Die Hardware macht Fortschritte. Ich kann es also bald direkt auf dem
Tiny testen!

Gruß Daniel!

von Daniel R. (Gast)


Lesenswert?

Also im Debugger funktioniert der Timer nun ausgezeichnet!

Dankeschön nochmal an alle!

Gruß Daniel!

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.