/* * DX7_DISP.asm * * Created: 11.04.2011 21:34:33 * Author: Daniel, letzte Änderung 15.04.2011 18:03 */ .def rmp = r16 ;Multipurpose reg .def rimp = r17 ;interrupt multipurpose reg .def loop1 = r18 .def loop2 = r19 .def loop3 = r20 .def prescaler = r21 .def compare = r22 .def compare1 = r23 .equ c = 0 ; ;Constants ; .cseg ;assembliere in den Programm flash-speicher bzw programmiere in den speicher .org $0000 ;beginne bei der adresse 0 rjmp Main; Reset Handler reti ; IRQ0 Handler rjmp intpcint;PCINT0 Handler reti ; Timer0 Overflow Handler reti ; EEPROM Ready Handler reti ; Analog Comparator Handler reti ; Timer0 CompareA Handler reti ; Timer0 CompareB Handler reti ; Watchdog Interrupt Handler reti ; ADC Conversion Handler ;PCINT0 Service Routine wird jedesmal ausgeführt wenn pegeländerung am Pin3 (PB4) ;interrupt service routine intpcint: ldi compare,$4 ;Register mit Konstante 4 laden ldi compare1,$9 ; Register mit Konstante 9 laden sbic PINB,4 ;Überspringe Befehl wenn PB4 ist null rjmp loop01 ; Springe weil PB4 =1 rjmp loop ; Schlafen legen reti ; kehre vom intrerrupt zurück ;Main Programm STart Main: ; ;Internen Takt durch 32 teilen / CPU 300 kHZ ; ldi prescaler,0b10000000 ;vorteiler bit auf 1 out CLKPR,prescaler ldi prescaler,0b00000101 ;prozessorvorteiler auf 32 setzen out CLKPR,prescaler ; ;Stapelzeuiger für Rückkehradresse von Interrupt ; ldi rmp,LOW (RAMEND) ;Stapelzeiger auf Ende SRAM out SPL,rmp ; ;Angeschlossen Hardware initiieren ; sbi DDRB,1 ;LED Ausgang als Ausgang definieren PB1 sbi PORTB,1 ; Led ausschalten cbi DDRB,4 ;Taster Eingang als eingang definieren PB4 sbi PORTB,4 ;Internen PULL UP Widerstand einschalten ?? ; ;Pin Change Interrupt für Taste aktivieren ; ldi rmp,0b0001000 ;maskieren der aktiven eingänge PB4 out PCMSK,rmp ldi rmp,0b0010000 ;pcint0-interrupt ermöglichen out GIMSK, rmp ; ;Interrupts generell ermöglichen ; sei ;setze interrupt flagge ; ;Schlafmodus der Cpu einstellen ; ldi rmp,0b00100000 ; schlafen ermöglichen, Modus Idle ; eine 0 mehr ??? out MCUCR, rmp ; mcucr ??? ; ; Loop mit Interrupt ; loop: sleep ;Prozessor schlafen legen nop ;tue nichts rjmp loop ; Prozessor wieder schlafen legen loop01: ; 50ms ; warte 14994 Zyklen: sbis PORTB,1 ;Überspringe wenn Led an ist cbi PORTB,1 ;schalte led an ldi R18, $15 WGLOOP0: ldi R19, $ED WGLOOP1: dec R19 brne WGLOOP1 dec R18 brne WGLOOP0 ; ----------------------------- ; warte 6 Zyklen: ldi R18, $02 WGLOOP2: dec R18 brne WGLOOP2 dec compare brne intpcint rjmp loop02 loop02: ;200 ms ; 60000 Zyklen: ; ----------------------------- ; warte 59994 Zyklen: ldi R18, $63 WGLOOP00: ldi R19, $C9 WGLOOP10: dec R19 brne WGLOOP1 dec R18 brne WGLOOP0 ; ----------------------------- ; warte 6 Zyklen: ldi R18, $02 WGLOOP20: dec R18 brne WGLOOP2 dec compare1 brne loop02 rjmp loop03 loop03: ;30Sekunden ; warte 8999568 Zyklen: ldi R18, $30 WGLOOP000: ldi R19, $F8 WGLOOP001: ldi R20, $FB WGLOOP002: dec R20 brne WGLOOP2 dec R19 brne WGLOOP1 dec R18 brne WGLOOP0 ; ----------------------------- ; warte 432 Zyklen: ldi R18, $90 WGLOOP3: dec R18 brne WGLOOP3 rjmp LEDOFF ; ============================= LEDON: sbis PORTB,1 ;Überspringe wenn Led an ist cbi PORTB,1 ;schalte led an rjmp LEDOFF LEDOFF: sbi PORTB,1 ; Led ausschalten reti ;zurück zu interrupt