; *********************************************************
; * Angeschlossener Taster unterbricht und steuert LED an *
; * (C)2005 by info@avr-asm-tutorial.net                  *
; *********************************************************
;
.INCLUDE "tn13def.inc"
;
; Schaltbild:
;                   ATMEL ATtiny13
;                     ___   ____
;            ___    1/   |_|    |8
;+5 Volt O--|___|----|Res    Vcc|----O + 5 Volt
;                    |          |
;                    |PB3    PB2|
;                /  3|          |6  ___
;     0 Volt O--O O--|PB4    PB1|--|___|--|<|--O + 5 Volt
;                   4|          |   330   LED
;        0 Volt O----|Gnd    PB0|
;                    |__________|
;
; Register Definitionen
;
.DEF rmp = R16 ; Multipurpose register
.DEF rimp = R17 ; Interrupt multipurpose register
;
; Constants
;
;
; Reset- und Interrupt-Vektoren
;
.CSEG ; Assembliere in den Programm-Flash-Speicher
.ORG $0000 ; beginne mit Adresse 0
;
; Sprungvektoren fuer Reset und Interrupts
;
	rjmp main ; Reset vector
	reti ; Int0 interrupt vector
	rjmp intpcint ; PCINT0 vector
	reti ; TC0 overflow vector
	reti ; Eeprom ready vector
	reti ; Analog comparator int vector
	reti ; TC0 CompA vector
	reti ; TC0 CompB vector
	reti ; WDT vector
	reti ; ADC conversion complete vector
;
; PCINT0 Service Routine
;   wird jedes Mal ausgefuehrt, wenn sich der Pegel am
;   Pin 3 (=PB4) aendert 
;
intpcint:
	sbic PINB,4 ; Ueberspringe Befehl wenn PB4 Null
	rjmp intpcint1 ; springe weil PB4 = Eins
	cbi PORTB,1 ; schalte LED an
	reti ; Kehre vom Interrupt zurueck
intpcint1:
	sbi PORTB,1 ; schalte LED aus
	reti ; Kehre vom Interrupt zurueck
;
; Main program start
;
main:
;
; Stapelzeiger setzen fuer Rueckkehr-Adressen vom Interrupt
;
	ldi rmp,LOW(RAMEND) ; Stapelzeiger auf Ende SRAM
	out SPL,rmp
;
; Angeschlossene Hardware initiieren
;
	sbi DDRB,1 ; LED-Ausgang als Ausgang definieren
	sbi PORTB,1 ; LED ausschalten
	cbi DDRB,4 ; Taster-Eingang als Eingang definieren
	sbi PORTB,4 ; Internen Pull-Up-Widerstand einschalten
;
; Pin-Change-Interrupt fuer Taste aktivieren
;
	ldi rmp,0b00010000 ; Maskieren der aktiven Eingaenge
	out PCMSK,rmp
	ldi rmp,0b00100000 ; PCINT0-Interrupts ermoeglichen
	out GIMSK,rmp
;
; Interrupts generell einschalten
;
	sei ; Setze Interrupt Flagge
;
; Schlafmodus der CPU einstellen
;
	ldi rmp,0b00100000 ; Schlafen ermoeglichen, Modus Idle
	out MCUCR,rmp
;
; Loop mit Interrupt
;
loop:
	sleep ; Prozessor schlafen legen
	nop ; Tue nichts nach dem Aufwachen
	rjmp loop ; Prozessor wieder schlafen legen
;
; Ende Quellcode
;