Forum: Mikrocontroller und Digitale Elektronik Timer beim atmega16


von Philipp Steinemann (Gast)


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

von conlost (Gast)


Lesenswert?

Hallo,
ich hab es grade mal mit Studio 4 simuliert und es geht.
Gruß,
Arno

von Philipp Steinemann (Gast)


Lesenswert?

Hallo Arno,

das ist komisch! Ich hab es auf den MC übertragen, aber es leuchten
beide LEDs weiter. :/

Gruß
Philipp

von conlost (Gast)


Lesenswert?

Könnte es sein das mit dem Takt was nicht stimmt?
Laut Studio vergehen 65.538,25 µs.
Wenn dein Takt zu langsam ist, dauert es eventuell lange.

von conlost (Gast)


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.

von Philipp Steinemann (Gast)


Lesenswert?

Super!!!! Tausend Dank, jetzt tut es!!!!

Gruß
Philipp

von ukofumo (Gast)


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

von conlost (Gast)


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

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.