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