;------------------------------------------------------------------------- ; Titel : objekt: mensch_natur Achtung: Umschaltung per Interrupt funktioniert nicht! ;------------------------------------------------------------------------- ; Funktion : ; Schaltung : ;------------------------------------------------------------------------- ; Prozessor : ATmega8 ; Takt : 1000000 Hz ; Sprache : Assembler (GNU) ; Datum : 3.7.2011 ; Version : 1.0 ; Autor : a ; Programmer: ; Port : ;------------------------------------------------------------------------- ; created by myAVR-CodeWizard ;------------------------------------------------------------------------- ; .include "avr.h" begin: rjmp main ; 1 POWER ON RESET rjmp onPortD2 ; 2 INT0 Interrupt an Eingang PORTD2 reti ; 3 Int1-Interrupt reti ; 4 TC2 Compare Match reti ; 5 TC2 Overflow reti ; 6 TC1 Capture reti ; 7 TC1 Compare Match A reti ; 8 TC1 Compare Match B reti ; 9 TC1 Overflow reti ;10 TC0 Overflow reti ;11 SPI, STC Serial Transfer Complete reti ;12 UART Rx Complete reti ;13 UART Data Register Empty reti ;14 UART Tx Complete reti ;15 ADC Conversion Complete reti ;16 EEPROM Ready reti ;17 Analog Comparator reti ;18 TWI (I²C) Serial Interface reti ;19 Store Program Memory Ready ;------------------------------------------------------------------------ ; Initialisierungen ;------------------------------------------------------------------------ main: ;--- Stack Initialisierung --- ldi r16,hi8(RAMEND) out ioSPH,r16 ldi r16,lo8(RAMEND) out ioSPL,r16 ; Ports initialisieren sbi ioDDRB,0 ; PORTB0 auf Ausgang sbi ioDDRB,1 ; PORTB1 auf Ausgang sbi ioDDRB,2 ; PORTB2 auf Ausgang sbi ioDDRB,3 ; PORTB3 auf Ausgang sbi ioDDRB,4 ; PORTB4 auf Ausgang sbi ioDDRC,0 ; PORTC0 auf Ausgang sbi ioDDRC,1 ; PORTC1 auf Ausgang sbi ioDDRC,2 ; PORTC2 auf Ausgang sbi ioDDRC,3 ; PORTC3 auf Ausgang sbi ioDDRC,4 ; PORTC4 auf Ausgang sbi ioDDRC,5 ; PORTC5 auf Ausgang cbi ioDDRD,2 ; PORTD2 auf Eingang mit PullUp sbi PORTD,2 ; in r16,ioGICR ; INT0 Interrupt an Eingang PORTD2 bei fallender Flanke ; sbr r16,0b01000000 ; out ioGICR,r16 ; in r16,ioMCUCR ; sbr r16,0b00000010 ; out ioMCUCR,r16 ldi r16, 0b01000000 out GICR,r16 ldi r16, 0b00000010 out MCUCR,r16 sbi ioDDRD,3 ; PORTD3 auf Ausgang sbi ioDDRD,4 ; PORTD4 auf Ausgang sbi ioDDRD,5 ; PORTD5 auf Ausgang sbi ioDDRD,6 ; PORTD6 auf Ausgang sbi ioDDRD,7 ; PORTD7 auf Ausgang ;--- Interrupts erlauben --- sei ;------------------------------------------------------------------------ ; Hauptprogramm-Schleife ;------------------------------------------------------------------------ mainloop: cbi PORTC,4 ;Windrad aus cbi PORTC,5 ;Baum aus teil_1: ;blinkende Leds am kasten rcall myWait_ms rcall myWait_ms sei ldi r17,1 ldi r18,1 loop1: ldi r16, 0b00011100 out PORTD,r16 ; blinkende Leds am kasten unten ein rcall myWait_10s ldi r16, 0b00000100; out PORTD, r16 ; blinkende Leds am kasten unten aus rcall myWait_5s ldi r16, 0b01100100 out PORTD,r16 ; blinkende Leds am kasten oben ein rcall myWait_10s ldi r16,0b00000100 out PORTD,r16 ; blinkende Leds am kasten oben aus rcall myWait_5s; dec r18 brne loop1 sbi PORTC,4 ;Windrad ein sbi PORTC,5 ;Baum ein teil_2: ;Augen sei ldi r17,2 sbi PORTD,7 ; e-biker ein ldi r18, 30 loop2_1: ldi r16,0b00111010 ;beide Pupillen ein out PORTC, r16 rcall myWait_ms ldi r16,0b00110101 ;beide pupillen aus, augen außen ein out PORTC, r16 rcall myWait_ms dec r18 brne loop2_1 ldi r18,30 loop2_2: ldi r16, 0b00110011 ;linkes auge out PORTC, r16 rcall myWait_ms ldi r16, 0b00111100 ;rechtes auge out PORTC, r16 rcall myWait_ms dec r18 brne loop2_2 ldi r18,8 loop2_3: ldi r16, 0b00111111 ;beide augen ganz out PORTC, r16 rcall myWait_1s ldi r16, 0b00110000 ;beide augen aus out PORTC, r16 rcall myWait_1s dec r18 brne loop2_3 cbi PORTD,7 ;e-biker aus cbi PORTC,4 ;Windrad aus cbi PORTC,5 ;Baum aus teil_3: ;gr flash led oben am kopf, grüne am kasten sei ldi r17,3 sbi PORTD,5 ;grüne flash led am kasten oben ein sbi PORTD,6 sbi PORTB,0 ;große flash led ldi r18, 2 loop3_1: sbi PORTD,7 ;e-biker ein rcall myWait_10s cbi PORTD,7 ;e-biker aus rcall myWait_1s dec r18 brne loop3_1 cbi PORTB,0 ;große flash led aus cbi PORTD,5 ;grüne flash led am kasten oben aus cbi PORTD,6 teil_4: sei ldi r17,4 sbi PORTC,4 ;Windrad ein sbi PORTC,5 ;Baum ein ldi r18,5 sbi PORTD,7 ; e-biker ein loop4_1: ldi r16,0b00010100 ;grüne leds am kopf out PORTB,r16 rcall myWait_1s ldi r16,0b00001010 out PORTB,r16 rcall myWait_1s ldi r16,0b00011110 out PORTB,r16 rcall myWait_1s ldi r16,0b00000000 out PORTB,r16 rcall myWait_1s dec r18 brne loop4_1 rcall myWait_5s cbi PORTD,7 ;e-biker aus teil_5: sei ldi r17,5 sbi PORTB,0 ;groß rgb LED am kopf an ldi r18,10 loop5_2: ldi r16, 0b00001111 ;beide augen ganz out PORTC, r16 rcall myWait_1s ldi r16, 0b00000000 ;beide augen aus out PORTC, r16 rcall myWait_ms dec r18 brne loop5_2 ldi r18, 2 loop5_1: sbi PORTD,7 ;e-biker ein rcall myWait_10s rcall myWait_10s cbi PORTD,7 ;e-biker aus rcall myWait_1s dec r18 brne loop5_1 sbi PORTD,7 ;e-biker an rcall myWait_5s ldi r18,5 loop5_3: ldi r16,0b00011110 ;grüne leds am kopf an out PORTB,r16 rcall myWait_1s ldi r16,0b00000000 out PORTB,r16 rcall myWait_1s dec r18 brne loop5_3 ldi r18,5 loop5_4: ldi r16,0b00000010 out PORTB,r16 rcall myWait_1s ldi r16,0b00000100 out PORTB,r16 rcall myWait_1s ldi r16,0b00001000 out PORTB,r16 rcall myWait_1s ldi r16,0b00010000 out PORTB,r16 rcall myWait_1s dec r18 brne loop5_4 ldi r16,0b00000000 out PORTB,r16 cbi PORTD,7 ;biker aus cbi PORTB,0 ;rgb LED am kopf aus ; ... rjmp mainloop ; Sprung zum Beginn der Hauptprogrammschleife teil1: rjmp teil_1 teil2: rjmp teil_2 teil3: rjmp teil_3 teil4: rjmp teil_4 teil5: rjmp teil_5 ;-------------------------------------------------------------------- ; onPortD2 - INT0 Interrupt an Eingang PORTD2 bei fallender Flanke ; PE: ... ; PA: ... ;-------------------------------------------------------------------- onPortD2: push r16 rcall myWait_ms rcall myWait_ms cpi r17,1 breq zu1 cpi r17,2 breq zu2 cpi r17,3 breq zu3 cpi r17,4 breq zu4 cpi r17,5 breq zu5 zu1: ldi r16,0b00000100 ;programmteil 1 aus out PORTD,r16 pop r16 rjmp teil_2 zu2: ldi r16,0b00000000 ;programmteil 2 aus out PORTC,r16 cbi PORTD,7 pop r16 rjmp teil_3 zu3: cbi PORTB,0 ;programmteil 3 aus ldi r16,0b11100000 out PORTD, r16 pop r16 rjmp teil_4 zu4: cbi PORTD,7 ;programmteil 4 aus ldi r16,0b00000000 out PORTB,r16 out PORTB,r16 out PORTC,r16 pop r16 rjmp teil_5 zu5: ldi r16,0b00000000 ;programmteil 5 aus out PORTC, r16 out PORTB,r16 ldi r16,0b00000100 out PORTD,r16 pop r16 rjmp teil_5 reti ;Rücksprung ;-------------------------------------------------------------------- ; Warte-Routine für 1 s ; die Routine wartet inclusive Aufruf 984,3 ms ;-------------------------------------------------------------------- myWait_ms: push r16 ldi r16,1 myWait_ms_3: push r16 ldi r16,3 myWait_ms_2: push r16 ldi r16,255 myWait_ms_1: dec r16 brne myWait_ms_1 pop r16 dec r16 brne myWait_ms_2 pop r16 dec r16 brne myWait_ms_3 pop r16 dec r16 brne myWait_ms ret ;______________________________________________________________________ myWait_1s: push r16 ldi r16,5 myWait_1s_3: push r16 ldi r16,255 myWait_1s_2: push r16 ldi r16,255 myWait_1s_1: dec r16 brne myWait_1s_1 pop r16 dec r16 brne myWait_1s_2 pop r16 dec r16 brne myWait_1s_3 pop r16 ret ;-------------------------------------------------------------------- ; Warte-Routine für 5 s ; die Routine wartet inclusive Aufruf 4,922 s ;-------------------------------------------------------------------- myWait_5s: push r16 ldi r16,25 myWait_5s_3: push r16 ldi r16,255 myWait_5s_2: push r16 ldi r16,255 myWait_5s_1: dec r16 brne myWait_5s_1 pop r16 dec r16 brne myWait_5s_2 pop r16 dec r16 brne myWait_5s_3 pop r16 ret ;-------------------------------------------------------------------- ; Warte-Routine für 10 s ; die Routine wartet inclusive Aufruf 10,04 s ;-------------------------------------------------------------------- myWait_10s: push r16 ldi r16,51 myWait_10s_3: push r16 ldi r16,255 myWait_10s_2: push r16 ldi r16,255 myWait_10s_1: dec r16 brne myWait_10s_1 pop r16 dec r16 brne myWait_10s_2 pop r16 dec r16 brne myWait_10s_3 pop r16 ret ;-------------------------------------------------------------------- ; Warte-Routine für 50 s ; die Routine wartet inclusive Aufruf 50 s ;-------------------------------------------------------------------- myWait_50s: push r16 ldi r16,254 myWait_50s_3: push r16 ldi r16,255 myWait_50s_2: push r16 ldi r16,255 myWait_50s_1: dec r16 brne myWait_50s_1 pop r16 dec r16 brne myWait_50s_2 pop r16 dec r16 brne myWait_50s_3 pop r16 ret