; ********************************************************* ; * 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 ;