Timer beim atmega16

Gast #65694
Lesenswert?
• ▲
▼
Hallo,

meiner Meinung nach, müsste der Timer sofort nachdem das Programm
gestartet wurde, die 2 LEDs an PORTB wieder ausschalten, aber sie
bleiben komischerweise an.

Vielleicht hat jemand einen Hinweis, was ich falsch gemacht habe.

Vielen Dank im voraus!

Gruß
Philipp



.include "m8def.inc"

.def temp = r16

;-----------------
;Interrupt-Tabelle
;-----------------
.org 0x000
  rjmp reset
.org 0x009
  rjmp timer0
;-----------------

timer0:
  ldi temp, 0b11111111
  out PORTB, temp
reti

reset:

  ;----------------------
  ;Interrupts ausschalten
  ;----------------------
  cli
  ;----------------------

  ;--------------
  ;Stack anlgegen
  ;--------------
        ldi temp, LOW(RAMEND)   ; LOW-Byte der obersten RAM-Adresse
        out SPL, temp
        ldi temp, HIGH(RAMEND)  ; HIGH-Byte der obersten RAM-Adresse
        out SPH, temp
  ;--------------

  ;----------------------
  ;Interrupts einschalten
  ;----------------------
  sei
  ;----------------------

  ;-----------------
  ;PortB als Ausgabe
  ;-----------------
  ldi temp, 0xFF
  out DDRB, temp
  ;-----------------

  ;---------------------
  ;beide LEDs anschalten
  ;---------------------
  ldi temp, 0b11111100
  out PORTB, temp
  ;--------------------

  ;----------
  ;Timer-Init
  ;----------
  in temp, TIMSK
  sbr temp, 0b00000001
  out  TIMSK, temp
  ldi temp, 0
  out TCNT0, temp   ; Startwert des Timers
  ldi temp, 0b00000101
  out TCCR0, temp    ; Timer starten mit Vorteiler 1024
  ;----------


main:

  rjmp main
Gast #65698
Lesenswert?
• ▲
▼
Nun weiss ich woran es liegt.
In deinem listing steht inklude m8dev.inc,
deshalb habe ich zuerst mit mega8 simuliert.
Für den mega16 stimmt aber dann der Interruptvector nicht.
Schreib mal statt .org 0x009 , OVF0adr oder .org 0x012.
Dann geht es.
Gast #65700
Lesenswert?
• ▲
▼
Hallo...??

Mir ist da noch was aufgefallen....?
Eigentlich sollte der TIMER inizialisiert werden während die
Interrupt's ausgeschaltet sind???? sO Hab ichs bisher in allen anderen
Listings gesehen..
Hier werden die Interupt's aber nur während der Stack Initialisierung
ausgeschaltet...
Gast #65701
Lesenswert?
• ▲
▼
Hallo,
da es sich hier nur ein Testprogrammchen handelte habe ich nichts dazu
gesagt.
Der Befehl "sei" ist dort wo er jetzt steht nicht nötig,
da das int-Flag nach dem Reset gelöscht ist.
Den Befehl sollte man direkt nach dem Start des Timers setzen.

 ldi temp, 0b00000101
  out TCCR0, temp    ; Timer starten mit Vorteiler 1024
  sei

Aber es war ja nur ein Testprogramm.
Gruß,
Arno

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.