; Loesung Aufgabe 9: Drei Mal blinken pro Tastendruck, interrupt-gesteuert ; .nolist .include "tn13def.inc" .list ; ; Timer: Takt 1,2 MHz, Vorteiler 1024, Overflow bei 256 ; Dauer: 1024*256/1,2 = 218.453 us = 218 ms ; ; Registerdefinitionen .def rmp = R16 ; Multipurpose-Register .def rCnt = R17 ; Blinkzaehler-Register ; ; Reset- und Int-Vektoren rjmp start ; Reset-Vektor reti ; INT0-Vektor rjmp pcint ; PCINT0-Vektor rjmp tc0ovf ; TC0-Overflow-Vektor reti ; EE_RDY-Vektor reti ; ANA_COMP-Vektor reti ; TIM0_COMPA-Vektor reti ; TIM0_COMPB-Vektor reti ; WDT-Vektor reti ; ADC-Vektor pcint: sbis PINB,PB4 ; Ueberspringe wenn Taste nicht gedrueckt ldi rCnt,3 ; Zaehler setzen reti ; fertig mit Interrupt ; TC0 Overflow interrupt service routine tc0ovf: sbic PORTB,PB0 ; Ueberspringe, wenn LED-Ausgang = 0 rjmp tc0ovf1 ; LED-Ausgang = 1 sbi PORTB,PB0 ; schalte LED-Ausgang auf 1 reti ; fertig, warte auf naechsten Interrupt tc0ovf1: tst rCnt ; Blinkzaehler = 0 ? brne tc0ovf2 ; nicht Null, noch einmal blinken reti ; Null, nicht mehr blinken tc0ovf2: dec rCnt ; Zaehler um Eins niedriger setzen cbi PORTB,PB0 ; LED anschalten reti ; fertig ; ; Hauptprogramm-Start Start: ldi rmp,LOW(RAMEND) ; init Stapel out SPL,rmp sbi DDRB,PB0 ; LED-Ausgang einschalten sbi PORTB,PB0 ; LED ausschalten sbi PORTB,PB4 ; Pullup-Widerstand am Tasteneingang einschalten ldi rmp,1<