; *** Blinklicht mit 8Bit Timer 1.0 (c) Oliver Mezger 01.01.2011
.include "tn2313def.inc"

;* Blinker (PB0) soll mit 0,5Hz blinken, Interrupt wird alle 250ms aufgerufen
;* Interner RC-Oszillator mit 8MHz geteilt durch 8 (tiny2313 Spezialitaet)
;* Systemtakt Phi ist somit 1MHz
;* Zaehlertakt von 8Bit-Timer0 sei Phi/1024 somit waere Interruptintervall = 256*1024us = 262ms
;* Zaehler startet deshalb nicht mit 0 sondern einem hoeheren Wert 12 damit Zeit stimmt.

.def tmp  = R16     ;Hilfsregister
.def itmp = R17     ;Hilfsregister fuer Interrupt

  rjmp reset    ;Sprung zur Initialisierung
  .org OVF0addr     ;naechter Befehl an der Interrupteinsprungadresse
  rjmp isrOVF0      ;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,5         ;Vorteiler auf Phi/1024 setzen
  out TCCR0B,tmp    ;alle 1024us ein Zaehl-Impuls
  ldi tmp,1<<TOIE0  ;Timer Overflow Interrupt Enable 0 setzen 
  out TIMSK,tmp     ;Timer kann nun Interrupt ausloesen
  ldi tmp, 12       ;Vorspannen des Timers
  out TCNT0,tmp     ;damit die Zeit bis Overflow stimmt
  sei               ;globale Interrupt Freigabe
loop:
  rjmp loop           ;Endlos-Schleife

isrOVF0:         
  ldi itmp,12    ;Wert zum Vorspannen des Timers laden
  out TCNT0,itmp ;in den Timer schreiben
  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