.INCLUDE "m32def.inc" ; Deklarationen für ATmega32 .DEF akku = r16 ; Arbeitsregister .CSEG ; Programm-Flash rjmp start ; Reset-Einsprung .ORG INT1addr ; Einsprung externer Interrupt INT0 rjmp taste ; nach Servicprogramm .ORG $2A ; weitere Interrupteinsprünge übergehen start: ldi akku,LOW(RAMEND); Stapel anlegen out SPL,akku ; ldi akku,HIGH(RAMEND) ; out SPH,akku ; ldi akku,0b01100000 ; Bitmuster 1111 1111 out DDRD,akku ; Richtung Port D ist Ausgang ; ser akku ; Dualzähler löschen out PORTD,akku ; und Anfangswert ausgeben ; Ruhezustand Sleep Mode 0 0 0 Idle in akku,MCUCR ; altes Steuerregister sbr akku,1 << SE ; setze Bit SE Sleep Mode ein cbr akku,1 << SM0 ; lösche Bit SM0 cbr akku,1 << SM1 ; lösche Bit SM1 cbr akku,1 << SM2 ; lösche Bit SM2 out MCUCR,akku ; Mode 0 0 0 Idle ; Interrupt INT0 initialisieren in akku,MCUCR ; altes Steuerregister sbr akku,1 << ISC10 ; setze Bit ISC01 cbr akku,1 << ISC11 ; lösche Bit ISC00 out MCUCR,akku ; ISC1x: 1 0 INT0 fallende Flanke in akku,GICR ; altes Freigaberegister sbr akku,1 << INT1 ; setze Bit INT1 out GICR,akku ; Interrupt INT1 freigegeben sei ; alle Interrupts global frei ; Hauptprogramm schläft stromsparend vor sich hin loop: sleep ; energiesparender Schlaf rjmp loop ; tu nix ; ; Serviceprogramm erhöht Zähler: R16 und SREG nicht gerettet !!! taste: in r16,PORTD ; Zähler in PORTD dec r16 ; Dualzähler erniedrigen out PORTD,r16 ; dual ausgeben reti ; Rücksprung aus Serviceprogramm .EXIT ; Ende des Quelltextes