vario2.asm
1 | /*
| 2 |
| 3 | */
| 4 |
| 5 | .NOLIST
| 6 | .include "tn13def.inc"
| 7 | .LIST
| 8 |
| 9 | .org 0x0000
| 10 | rjmp main ; Reset
| 11 | reti ; Ext. Int.
| 12 | reti ; Pin Change Interrupt
| 13 | reti ; rjmp timer0_overflow Timer Counter Overflow
| 14 | reti ; EEPROM ready
| 15 | reti ; Analog Comp.
| 16 | rjmp compa ; Timer/Counter Compare Match A
| 17 | reti ; Timer/Counter Compare Match B
| 18 | reti ; Watchdog Timeout
| 19 | reti ; ADC Conversation Complete
| 20 |
| 21 |
| 22 | ; Interrupt Timer/Counter Compare Match A
| 23 | compa:
| 24 | cpi r20, 0xff
| 25 | brne com1
| 26 | cbi PORTB, PB1 ; Piezo an PB1 aus
| 27 | rjmp com2
| 28 | com1:
| 29 | sbi PORTB, PB1 ; Piezo an PB1 ein
| 30 | com2:
| 31 | com r20
| 32 | reti
| 33 |
| 34 |
| 35 | main:
| 36 | ; Stack initialisieren
| 37 | ldi r16, RAMEND
| 38 | out SPL, r16
| 39 |
| 40 | ; Ausgabepins einstellen
| 41 | ldi r16, (1<<PB2)|(1<<PB1)|(1<<PB0) ; PB0, PB1, PB2 = Ausgang
| 42 | out DDRB, r16
| 43 | sbi PORTB, PB2 ; PB2 auf HIGH für LED auf Zustand "AUS"
| 44 |
| 45 | ; Systemclock einstellen
| 46 | ldi r16, (1<<CLKPCE)
| 47 | out CLKPR, r16
| 48 | ldi r16, (1<<CLKPS0) ; Clock Prescaler 2: 9,6 MHz => 4,8MHz
| 49 | out CLKPR, r16
| 50 |
| 51 | ; Timer0 einstellen
| 52 | ldi r16, (1<<WGM01)|(1<<COM0A0) ; Toggle OC0A (PB0) on Compare Match (CTC Mode)
| 53 | out TCCR0A, r16
| 54 | ldi r16, (1<<CS01)|(1<<CS00) ; Takt 4,8MHz / Vorteiler 64
| 55 | out TCCR0B, r16
| 56 |
| 57 | ; Interrupt einstellen
| 58 | ldi r16, (1<<OCIE0A) ; Compare Match A Interrupt enable OCIE0A
| 59 | out TIMSK0, r16
| 60 | clr r20
| 61 | sei
| 62 |
| 63 | loop:
| 64 | rcall set_310Hz
| 65 | rcall warten
| 66 | cbi PORTB, PB2 ; Blinken der LED an PB2 auf Low => LED ein
| 67 | rcall set_430Hz
| 68 | rcall warten
| 69 | sbi PORTB, PB2 ; Blinken der LED an PB2 auf HIGH => LED aus
| 70 | rjmp loop
| 71 |
| 72 | ; #############
| 73 |
| 74 | /*
| 75 | 4800000 / 64 = 75000
| 76 | 75000 / 2 (wg. Toggle) / 310 = 120.9
| 77 | 120.9 + 0.5 (erst Aufrunden, dann Ganzzahl machen) = 121
| 78 | 121 - 1 (wg. CTC) = 120 (0x78)
| 79 | */
| 80 | .equ TON_310 = ((4800000/64/2/310)+0.5)-1
| 81 | .equ TON_430 = ((4800000/64/2/430)+0.5)-1
| 82 |
| 83 | set_310Hz:
| 84 | clr r16
| 85 | out TCNT0, r16
| 86 | ldi r19, TON_310 ; OCR0A auf 77 => 310Hz an PB0
| 87 | out OCR0A, r19
| 88 | ret
| 89 |
| 90 | set_430Hz:
| 91 | clr r16
| 92 | out TCNT0, r16
| 93 | ldi r19, TON_430 ; OCR0A auf 4C => 430Hz an PB0
| 94 | out OCR0A, r19
| 95 | ret
| 96 |
| 97 | ; #############
| 98 |
| 99 | warten:
| 100 | clr r16 ;Zeitverzögerung ca.1 Sekunde
| 101 | zeit0:
| 102 | inc r16
| 103 | clr r17
| 104 | zeit1:
| 105 | inc r17
| 106 | clr r18
| 107 | zeit2:
| 108 | inc r18
| 109 | cpi r18, 0xff
| 110 | brne zeit2
| 111 | cpi r17, 0xff
| 112 | brne zeit1
| 113 | cpi r16, 0x10
| 114 | brne zeit0
| 115 | ret
|
|