mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8 Bit Timer mit Tiny26


Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.include "tn26def.inc"
.org 0x00      ;InterruptVektorTable
rjmp reset      ;Reset
.org 0x03
rjmp timer_int      ;Timer1 CompareMatch 1A Interrupt

reset:
  ldi r16,RAMEND    ;Stackpointer initialisieren
  out SP,r16    ;"""""""""""""""""""""""""""

  ldi r16, 0b00000000  ;0x00 in r16
  out TCCR1A, r16    ;TCCR1A mit 0x00 initialisieren
  ldi r16, 0b10000111  ;Bit7 für CTC Mode,Bits 0-3 fürCLK/64
  out TCCR1B, r16    ;TCCR1B initialisieren
  ldi r16,0x03    ;0x03 in r16, ...für den Debugger
  out OCR1A,r16    ;Wert in das Timerregister schreiben
  sei      ;Interrupts zulassen
main:
  rjmp main


timer_int:      ;Timer Interrupt
                        
  ser r16      ;SetAllBits in r16
  out DDRB,r16    ;DDRB als Ausgang...fürs Debuggen
  ldi r16,0x03    ;Timer reloaden
  out OCR1A,r16    ;""""""""""""""
  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!

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist das TIMSK ?

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


Peter

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinte natürlich TOIE1 in TIMSK!

MfG
Andi

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Debugger funktioniert der Timer nun ausgezeichnet!

Dankeschön nochmal an alle!

Gruß Daniel!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.