; *** Blinklicht mit Interrupt 1.0 (c) Oliver Mezger 20.07.2010
.include "tn2313def.inc"

;* Blinker (PB0) soll mit 1Hz blinken, Interrupt wird alle 500ms aufgerufen
;* Interner RC-Oszillator mit 8MHz geteilt durch 8 (tiny2313 Spezialitaet)
;* Systemtakt Phi ist somit 1MHz
;* Zaehlertakt von 16Bit-Timer1 sei Phi/8 somit waere Interruptintervall = 65536*8us= 524,29ms
;* Zaehler startet deshalb nicht mit 0 sondern einem hoeheren Wert damit Zeit stimmt.
.equ zaehlerstartwert = 3036 ;Wert mit dem der Zaehler startet

.def tmp  = R16     ;Hilfsregister
.def itmp = R17     ;Hilfsregister fuer Interrupt

  rjmp reset		;Sprung zur Initialisierung
  .org OVF1addr     ;naechter Befehl an der Interrupteinsprungadresse
  rjmp isrOVF1      ;Sprung zur Interruptbehandlungsroutine
  .org INT_VECTORS_SIZE ;weiter nach Interrupttabelle

reset:              ;Initialisierung nach Reset
  ldi tmp,low(RAMEND) ;oberste RAM-Adresse laden
  out SPL,tmp       ;Stackpointer initialisieren
  ldi tmp,$ff
  out PORTB,tmp     ;alle LED aus
  out DDRB,tmp      ;PB als Ausgang
  ldi tmp,1<<CS11   ;Bit CS11 setzen Vorteiler ist Phi/8
  out TCCR1B,tmp    ;Zaehler bekommt 125kHz Takt, alle 8us einen Impuls
  ldi tmp,1<<TOIE1  ;Timer Overflow Interrupt Enable 1 setzen
  out TIMSK,tmp     ;Timer kann nun Interrupt ausloesen
  sei               ;generelle Interrupt Freigabe
loop:
  rjmp loop         ;Endlos-Schleife

isrOVF1:            ;kein Register wird veraendert!
  ldi itmp,high(zaehlerstartwert) ;obere 8Bit
  out TCNT1H,itmp   ;zuerst High schreiben
  ldi itmp,low(zaehlerstartwert) ;untere 8Bit
  out TCNT1L,itmp   ;Uebernahme bei Schreiben des LowByte
  sbic PORTB,0      ;wenn PB0
  rjmp clearPB0     ;loesche PB0
  sbi  PORTB,0      ;sonst setze PB0
  reti              ;Interruptbehandlung ist zu Ende
clearPB0:
  cbi  PORTB,0      ;loesche PB0
  reti              ;Interruptbehandlung ist zu Ende
