Forum: Mikrocontroller und Digitale Elektronik Interrupt und Timer = Problem ?


von Ilon Bickel (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend!

Ich habe mal etwas mit Assembler-Mikrocontroller-Programmierung
angefangen. Als Grundlage habe ich den 90S2313 von Atmel.

Ich habe ein Programm, welches mittels Timer LEDs blinken lässt. Über
eine Taste will ich jetzt den Timer deaktivieren und wieder aktivieren
können. Das deaktivieren klappt ja noch, der Timer hält an, aber das
anschließende aktiveren geht einfach nicht mehr. Die Routine "on"
wird gar nicht erst aufgerufen.

Als Anhang hab ich die dazugehörige asm-Datei dran gepackt, vielleicht
kann ja jemand helfen.

MfG
Ilon

von Sebastian Wille (Gast)


Lesenswert?

Hi,

verwendest Du an Deinem Schalter einen externen PullUp-Widerstand?

Sonst versuch 'mal nach der DDR-Initializierung noch folgendes:

ldi r16,0xFF
out PortD,r16

So aktivierst Du die internen PullUps von PortD.

Sebastian

von crazy horse (Gast)


Lesenswert?

auf den ersten Blick folgender grober Schnitzer:

on:
  push temp
  ldi temp, 0b00000101
  out TCCR0, temp
  pop temp
  ret        //führt aus der INT0-Routine zurück, ohne das I-Flag wieder
zu setzen

off:
  push temp
  ldi temp, 0
  out TCCR0, temp
  pop temp
  ret

int0_handler:
  in temp, TCCR0

  cpi temp, 0
  breq on         ; entweder dahin
  brne off        ; oder dahin

  reti            ;hier kommst du nie an

mit der Folge, das das I-Flag niemals gesetzt wird und damit auch
niemals ein weiterer Int bearbeitet werden kann.
Ausserdem solltest du in ISRs immer das SREG sichern.

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.