1 | ; Mikrocontroller: ATtiny45
|
2 | ; Versorgungsspannung: 4,5-5V
|
3 | ; Taktart: Interner Oszillator
|
4 | ; Taktfrequenz: 8MHz
|
5 | ; Brown-out Detection: 2,7V
|
6 | .include "tn45def.inc"
|
7 |
|
8 | .def temp = r16
|
9 |
|
10 | ;------------------------------- Interruptvektortabelle --------------------------------
|
11 | .org 0x0
|
12 | rjmp RESET ; 0x0 (Reset Handler)
|
13 | rjmp INT0_ISR ; 0x1 (External Interrupt Request 0 Handler)
|
14 | reti ; 0x2 (Pin Change Interrupt Request 0 Handler)
|
15 | reti ; 0x3 (Timer/Counter1 Compare Match A Handler)
|
16 | reti ; 0x4 (Timer/Counter1 Overflow Handler)
|
17 | reti ; 0x5 (Timer/Counter0 Overflow Handler)
|
18 | reti ; 0x6 (EEPROM Ready Handler)
|
19 | reti ; 0x7 (Analog Comparator Handler)
|
20 | reti ; 0x8 (ADC Conversion Complete Handler)
|
21 | reti ; 0x9 (Timer/Counter1 Compare Match B Handler)
|
22 | rjmp TIMER0_COMPA_ISR ; 0xA (Timer/Counter0 Compare Match A Handler)
|
23 | reti ; 0xB (Timer/Counter0 Compare Match B Handler)
|
24 | reti ; 0xC (Watchdog Time-out Handler)
|
25 | reti ; 0xD (USI Start Handler)
|
26 | reti ; 0xE (USI Overflow Handler)
|
27 |
|
28 | RESET:
|
29 | ; Stackpointer initialisieren
|
30 | ldi temp, LOW(RAMEND)
|
31 | out SPL, temp
|
32 |
|
33 | ldi temp, HIGH(RAMEND)
|
34 | out SPH, temp
|
35 |
|
36 | ; Alle I/O Pins werden vom Controller als Eingänge ohne aktivierten Pull-Up Widerstand initialisiert
|
37 | ; Alle benötigten Ausgänge müssen festgelegt werden
|
38 | sbi DDRB, DDB4 ; PB4 wird als Spannungsquelle für eine LED verwendet
|
39 |
|
40 | ; Um undefinierte Potenziale zu vermeiden werden an allen eingängen die Pull-Up Widerstände aktiviert, um diese auf ein definiertes Potenzial(VCC) zu bringen
|
41 | ldi temp, (1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)
|
42 | out PORTB, temp
|
43 |
|
44 | ; Timer/Counter0 Initialisierung
|
45 | ; Frequenz: ~12,8kHz (80us)
|
46 | ldi temp, (1 << TSM) | (1 << PSR0) ; Timer/Counter0 wird in Konfigurationsmodus versetzt
|
47 | out GTCCR, temp
|
48 |
|
49 | ldi temp, (1 << WGM01) ; Verwende Timer im CTC-Modus
|
50 | out TCCR0A, temp
|
51 |
|
52 | ldi temp, (1 << CS01) ; Timer/Counter Prescaler von 8 (=> Timer/Counter Frequenz von ~1MHz)
|
53 | out TCCR0B, temp
|
54 |
|
55 | ldi temp, 80 ; Nach 80 Zählzyklen soll der Timer zurückgesetzt werden
|
56 | out OCR0A, temp
|
57 |
|
58 | ldi temp, (1 << OCIE0A) ; Aktiviere Timer/Counter0 Compare Match A Interrupt
|
59 | out TIMSK, temp
|
60 |
|
61 | ; Konfiguration des External Interrupt 0
|
62 | ldi temp, (1 << ISC01) | (1 << ISC00)
|
63 | out MCUCR, temp ; Auslösen eines Interrupts bei steigender Flanke an INT0
|
64 |
|
65 | ldi temp, (1 << INT0)
|
66 | out GIMSK, temp ; Aktiviere External Interrupt 0
|
67 |
|
68 | sei ; Interrupts global aktivieren
|
69 |
|
70 | dcc:
|
71 | rjmp dcc
|
72 |
|
73 | INT0_ISR:
|
74 | push temp
|
75 | clr temp
|
76 | out GTCCR, temp ; Timer/Counter0 starten
|
77 | pop temp
|
78 | reti
|
79 |
|
80 | TIMER0_COMPA_ISR:
|
81 | push temp
|
82 | ldi temp, (1 << TSM) | (1 << PSR0) ; Timer/Counter0 wieder stoppen
|
83 | out GTCCR, temp
|
84 | sbic PINB, INT0
|
85 | sbi PORTB, PORTB4 ; Einschalten wenn eine 0 empfangen wurde
|
86 | pop temp
|
87 | reti
|