Guten Morgen,
ich bin in Sachen Mikrocontroller Neueinsteiger und versuche zur Zeit,
meine ersten Erfahrungen zu machen.
Ich habe mir dazu von Pollin das Atmel-Evaluationsboard besorgt
(http://www.pollin.de/shop/dt/MTY5OTgxOTk-/Bausaetze_Module/Bausaetze/ATMEL_Evaluations_Board_Version_2_0_1_Bausatz.html)
und mit einem ATMega32 bestückt (den hatte ich noch da).
Das Board hat drei Taster, die auf PD2-PD4 liegen (T1 auf PD2 = INT0, T2
auf PD3 = INT1) und mit Pulldown und Parallelkondensator angeschlossen
sind, zwei LEDs auf PD5 und PD6 und einen Summer auf PD7. Die weiteren
Anschlussmöglichkeiten wollte ich erst nutzen, wenn ich mich soweit fit
fühle.
Die ersten Programme (grob am AVR-Tutorial orientiert) habe ich mit
AVR-Studio erfolgreich testen können, Blinken, auf Tasten reagieren,
Zählen, über Taster gleichzeitig "binär" eingegebene Zahlen durch
entsprechend häufiges Blinken "auszählen" und so was. Einsteigerkost
eben :)
Jetzt versuche ich, mich mit den Interrupts anzufreunden, weil ich die
später brauchen werde, und laufe ein bisschen vor eine Wand.
Das Programm (bereinigt um Kommentare) soll als Funktionskontrolle mit
LED1 blinken (geht) und je nach Interrupt (INT0 = ein, INT1 = aus) die
zweite LED mitblinken lassen.
Aber:
Bei den Tasten 1 und 2 funktioniert gar nix, und Taste 3 (nicht benutzt)
toggelt die Funktion. Hä? Ich steh auf dem Schlauch. Hat jemand von Euch
eine Idee, woran das liegt, oder schon Erfahrungen mit dem Board?
Gruß
Sebastian
Code:
1 | //.include "m8def.inc"
|
2 |
|
3 | .def temp = r20 ; Arbeitsregister
|
4 | .def leds = r21 ; welche LEDs sollen leuchten
|
5 |
|
6 | .CSEG
|
7 | .org 0
|
8 |
|
9 | ; Interupt Vektoren
|
10 | rjmp init ; Reset Handler
|
11 | rjmp doint0 ; IRQ0 Handler
|
12 | rjmp doint1 ; IRQ1 Handler
|
13 | reti ; Timer2 Compare Handler
|
14 | reti ; Timer2 Overflow Handler
|
15 | reti ; Timer1 Capture Handler
|
16 | reti ; Timer1 CompareA Handler
|
17 | reti ; Timer1 CompareB Handler
|
18 | reti ; Timer1 Overflow Handler
|
19 | reti ; Timer0 Overflow Handler
|
20 | reti ; SPI Transfer Complete Handler
|
21 | reti ; USART RX Complete Handler
|
22 | reti ; UDR Empty Handler
|
23 | reti ; USART TX Complete Handler
|
24 | reti ; ADC Conversion Complete Handler
|
25 | reti ; EEPROM Ready Handler
|
26 | reti ; Analog Comparator Handler
|
27 | reti ; Two-wire Serial Interface Handler
|
28 | reti ; Store Program Memory Ready Handler
|
29 |
|
30 | init:
|
31 |
|
32 | ;Stackpointer
|
33 | ldi temp, LOW(RAMEND)
|
34 | out SPL, temp
|
35 | ldi temp, HIGH(RAMEND)
|
36 | out SPH, temp
|
37 |
|
38 | ;Aus/Eingänge
|
39 |
|
40 | ldi leds, (1 << 5)
|
41 |
|
42 | ldi temp, (1 << 5) | (1 << 6)
|
43 | out DDRD, temp ; Port D Bits 5 + 6 als Ausgang
|
44 |
|
45 | ldi temp, (1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11)
|
46 | ; INT0+1 auf steigender Flanke triggern (Ex-Board: Pulldown integriert!)
|
47 |
|
48 | out MCUCR, temp
|
49 |
|
50 | ldi temp, (1<<INT0)|(1<<INT1)
|
51 | ; INT0+1 aktivieren
|
52 | out GICR, temp
|
53 |
|
54 | sei
|
55 |
|
56 | Main:
|
57 |
|
58 | mov temp, leds ; LEDs setzen
|
59 | out PORTD, temp ; Daten zurückschreiben
|
60 |
|
61 | rcall waitones
|
62 |
|
63 | ldi temp, 0x0 ; LEDs aus
|
64 | out PORTD, temp ; Daten zurückschreiben
|
65 |
|
66 | rcall waitones
|
67 |
|
68 | rjmp Main
|
69 |
|
70 | doint0:
|
71 | ori leds, (1 << 6)
|
72 | reti
|
73 |
|
74 | doint1:
|
75 | andi leds, ~(1 << 6)
|
76 | reti
|
77 |
|
78 | wait:
|
79 | ldi R17, 0x02
|
80 | WGLOOP0: ldi R18, 0xFF
|
81 | WGLOOP1: ldi R19, 0xFF
|
82 | WGLOOP2: dec R19
|
83 | brne WGLOOP2
|
84 | dec R18
|
85 | brne WGLOOP1
|
86 | dec R17
|
87 | brne WGLOOP0
|
88 | nop
|
89 | ret
|
90 |
|
91 | waitones:
|
92 | ldi R17, 0x10
|
93 | WGiLOOP0: ldi R18, 0xFF
|
94 | WGiLOOP1: ldi R19, 0xFF
|
95 | WGiLOOP2: dec R19
|
96 | brne WGiLOOP2
|
97 | dec R18
|
98 | brne WGiLOOP1
|
99 | dec R17
|
100 | brne WGiLOOP0
|
101 | nop
|
102 | ret
|